Compare commits

..

1 Commits

Author SHA1 Message Date
Emilien Devos
e476dbe25b limit feeds and delete materialized views 2024-08-14 19:38:54 +02:00
189 changed files with 2867 additions and 6835 deletions

View File

@@ -38,9 +38,6 @@ Style/RedundantBegin:
Style/RedundantReturn: Style/RedundantReturn:
Enabled: false Enabled: false
Style/RedundantNext:
Enabled: false
Style/ParenthesesAroundCondition: Style/ParenthesesAroundCondition:
Enabled: false Enabled: false

5
.github/CODEOWNERS vendored
View File

@@ -1,9 +1,12 @@
# Default and lowest precedence. If none of the below matches, @iv-org/developers would be requested for review.
* @iv-org/developers
docker-compose.yml @unixfox docker-compose.yml @unixfox
docker/ @unixfox docker/ @unixfox
kubernetes/ @unixfox kubernetes/ @unixfox
README.md @thefrenchghosty README.md @thefrenchghosty
config/config.example.yml @SamantazFox @unixfox config/config.example.yml @thefrenchghosty @SamantazFox @unixfox
scripts/ @syeopite scripts/ @syeopite
shards.lock @syeopite shards.lock @syeopite

View File

@@ -10,10 +10,8 @@ assignees: ''
<!-- <!--
BEFORE TRYING TO REPORT A BUG: BEFORE TRYING TO REPORT A BUG:
* Read the FAQ: https://docs.invidious.io/faq/! * Read the FAQ!
* Use the search function to check if there is already an issue open for your problem: https://github.com/search?q=repo%3Aiv-org%2Finvidious+replace+me+with+your+bug&type=issues! * Use the search function to check if there is already an issue open for your problem!
MAKE SURE TO FOLLOW THE TWO STEPS ABOVE BEFORE REPORTING A BUG. A BUG THAT ALREADY EXIST WILL IMMEDIATELY CLOSED.
If you want to suggest a new feature please use "Feature request" instead If you want to suggest a new feature please use "Feature request" instead
If you want to suggest an enhancement to an existing feature please use "Enhancement" instead If you want to suggest an enhancement to an existing feature please use "Enhancement" instead

View File

@@ -1,10 +0,0 @@
version: 2
updates:
- package-ecosystem: "docker"
directory: "/docker"
schedule:
interval: "weekly"
- package-ecosystem: github-actions
directory: /
schedule:
interval: "weekly"

View File

@@ -17,26 +17,29 @@ on:
jobs: jobs:
release: release:
strategy: runs-on: ubuntu-latest
matrix:
include:
- os: ubuntu-latest
platform: linux/amd64
name: "AMD64"
dockerfile: "docker/Dockerfile"
tag_suffix: ""
# GitHub doesn't have a ubuntu-latest-arm runner
- os: ubuntu-24.04-arm
platform: linux/arm64/v8
name: "ARM64"
dockerfile: "docker/Dockerfile.arm64"
tag_suffix: "-arm64"
runs-on: ${{ matrix.os }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v6 uses: actions/checkout@v4
- name: Install Crystal
uses: crystal-lang/install-crystal@v1.8.2
with:
crystal: 1.12.2
- name: Run lint
run: |
if ! crystal tool format --check; then
crystal tool format
git diff
exit 1
fi
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
@@ -53,22 +56,45 @@ jobs:
uses: docker/metadata-action@v5 uses: docker/metadata-action@v5
with: with:
images: quay.io/invidious/invidious images: quay.io/invidious/invidious
flavor: |
suffix=${{ matrix.tag_suffix }}
tags: | tags: |
type=sha,format=short,prefix={{date 'YYYY.MM.DD'}}-,enable=${{ github.ref == format('refs/heads/{0}', 'master') }} type=sha,format=short,prefix={{date 'YYYY.MM.DD'}}-,enable=${{ github.ref == format('refs/heads/{0}', 'master') }}
type=raw,value=master,enable=${{ github.ref == format('refs/heads/{0}', 'master') }} type=raw,value=master,enable=${{ github.ref == format('refs/heads/{0}', 'master') }}
labels: | labels: |
quay.expires-after=12w quay.expires-after=12w
- name: Build and push Docker ${{ matrix.name }} image for Push Event - name: Build and push Docker AMD64 image for Push Event
uses: docker/build-push-action@v6 uses: docker/build-push-action@v5
with: with:
context: . context: .
file: ${{ matrix.dockerfile }} file: docker/Dockerfile
platforms: ${{ matrix.platform }} platforms: linux/amd64
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
push: true push: true
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
build-args: | build-args: |
"release=1" "release=1"
- name: Docker meta
id: meta-arm64
uses: docker/metadata-action@v5
with:
images: quay.io/invidious/invidious
flavor: |
suffix=-arm64
tags: |
type=sha,format=short,prefix={{date 'YYYY.MM.DD'}}-,enable=${{ github.ref == format('refs/heads/{0}', 'master') }}
type=raw,value=master,enable=${{ github.ref == format('refs/heads/{0}', 'master') }}
labels: |
quay.expires-after=12w
- name: Build and push Docker ARM64 image for Push Event
uses: docker/build-push-action@v5
with:
context: .
file: docker/Dockerfile.arm64
platforms: linux/arm64/v8
labels: ${{ steps.meta-arm64.outputs.labels }}
push: true
tags: ${{ steps.meta-arm64.outputs.tags }}
build-args: |
"release=1"

View File

@@ -1,33 +1,35 @@
name: Build and release container name: Build and release container
on: on:
workflow_dispatch:
push: push:
tags: tags:
- "v*" - "v*"
jobs: jobs:
release: release:
strategy: runs-on: ubuntu-latest
matrix:
include:
- os: ubuntu-latest
platform: linux/amd64
name: "AMD64"
dockerfile: "docker/Dockerfile"
tag_suffix: ""
# GitHub doesn't have a ubuntu-latest-arm runner
- os: ubuntu-24.04-arm
platform: linux/arm64/v8
name: "ARM64"
dockerfile: "docker/Dockerfile.arm64"
tag_suffix: "-arm64"
runs-on: ${{ matrix.os }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v6 uses: actions/checkout@v4
- name: Install Crystal
uses: crystal-lang/install-crystal@v1.8.2
with:
crystal: 1.12.2
- name: Run lint
run: |
if ! crystal tool format --check; then
crystal tool format
git diff
exit 1
fi
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3 uses: docker/setup-buildx-action@v3
@@ -44,23 +46,45 @@ jobs:
uses: docker/metadata-action@v5 uses: docker/metadata-action@v5
with: with:
images: quay.io/invidious/invidious images: quay.io/invidious/invidious
flavor: |
latest=false
suffix=${{ matrix.tag_suffix }}
tags: | tags: |
type=semver,pattern={{version}} type=semver,pattern={{version}}
type=raw,value=latest type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'master') }}
labels: | labels: |
quay.expires-after=12w quay.expires-after=12w
- name: Build and push Docker ${{ matrix.name }} image for Push Event - name: Build and push Docker AMD64 image for Push Event
uses: docker/build-push-action@v6 uses: docker/build-push-action@v5
with: with:
context: . context: .
file: ${{ matrix.dockerfile }} file: docker/Dockerfile
platforms: ${{ matrix.platform }} platforms: linux/amd64
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}
push: true push: true
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
build-args: | build-args: |
"release=1" "release=1"
- name: Docker meta
id: meta-arm64
uses: docker/metadata-action@v5
with:
images: quay.io/invidious/invidious
flavor: |
suffix=-arm64
tags: |
type=semver,pattern={{version}}
type=raw,value=latest,enable=${{ github.ref == format('refs/heads/{0}', 'master') }}
labels: |
quay.expires-after=12w
- name: Build and push Docker ARM64 image for Push Event
uses: docker/build-push-action@v5
with:
context: .
file: docker/Dockerfile.arm64
platforms: linux/arm64/v8
labels: ${{ steps.meta-arm64.outputs.labels }}
push: true
tags: ${{ steps.meta-arm64.outputs.tags }}
build-args: |
"release=1"

View File

@@ -38,36 +38,28 @@ jobs:
matrix: matrix:
stable: [true] stable: [true]
crystal: crystal:
- 1.14.1 - 1.9.2
- 1.15.1 - 1.10.1
- 1.16.3 - 1.11.2
- 1.17.1 - 1.12.1
- 1.18.2
include: include:
- crystal: nightly - crystal: nightly
stable: false stable: false
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v4
with: with:
submodules: true submodules: true
- name: Install required APT packages
run: |
sudo apt install -y libsqlite3-dev
shell: bash
- name: Install Crystal - name: Install Crystal
uses: crystal-lang/install-crystal@v1.9.1 uses: crystal-lang/install-crystal@v1.8.0
with: with:
crystal: ${{ matrix.crystal }} crystal: ${{ matrix.crystal }}
- name: Cache Shards - name: Cache Shards
uses: actions/cache@v5 uses: actions/cache@v3
with: with:
path: | path: ./lib
./lib
./bin
key: shards-${{ hashFiles('shard.lock') }} key: shards-${{ hashFiles('shard.lock') }}
- name: Install Shards - name: Install Shards
@@ -79,80 +71,7 @@ jobs:
- name: Run tests - name: Run tests
run: crystal spec run: crystal spec
- name: Build - name: Run lint
run: crystal build --warnings all --error-on-warnings --error-trace src/invidious.cr
build-docker:
strategy:
matrix:
include:
- os: ubuntu-latest
name: "AMD64"
# GitHub doesn't have a ubuntu-latest-arm runner
- os: ubuntu-24.04-arm
name: "ARM64"
name: Test ${{ matrix.name }} Docker build
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
- name: Use ARM64 Dockerfile if ARM64
if: ${{ matrix.name == 'ARM64' }}
run: sed -i 's/Dockerfile/Dockerfile.arm64/' docker-compose.yml
- name: Build Docker
run: docker compose build
- name: Change hmac_key on docker-compose.yml
run: sed -i '/hmac_key/s/CHANGE_ME!!/docker-build-hmac-key/' docker-compose.yml
- name: Run Docker
run: docker compose up -d
- name: Test Docker
id: test
run: curl -If http://localhost:3000 --retry 5 --retry-delay 1 --retry-all-errors
- name: Print Invidious container logs
# Tells Github Actions to always run this step regardless of whether the previous step has failed
# Without this expression this step would simply be skipped when the previous step fails.
if: success() || steps.test.conclusion == 'failure'
run: docker compose logs
lint:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v6
with:
submodules: true
- name: Install Crystal
id: lint_step_install_crystal
uses: crystal-lang/install-crystal@v1.9.1
with:
crystal: latest
- name: Cache Shards
uses: actions/cache@v5
with:
path: |
./lib
./bin
key: shards-${{ hashFiles('shard.lock') }}-${{ steps.lint_step_install_crystal.outputs.crystal }}
- name: Install Shards
run: |
if ! shards check; then
shards install
fi
- name: Check Crystal formatter compliance
run: | run: |
if ! crystal tool format --check; then if ! crystal tool format --check; then
crystal tool format crystal tool format
@@ -160,5 +79,73 @@ jobs:
exit 1 exit 1
fi fi
- name: Build
run: crystal build --warnings all --error-on-warnings --error-trace src/invidious.cr
build-docker:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build Docker
run: docker compose build --build-arg release=0
- name: Run Docker
run: docker compose up -d
- name: Test Docker
run: while curl -Isf http://localhost:3000; do sleep 1; done
build-docker-arm64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker ARM64 image
uses: docker/build-push-action@v5
with:
context: .
file: docker/Dockerfile.arm64
platforms: linux/arm64/v8
build-args: release=0
- name: Test Docker
run: while curl -Isf http://localhost:3000; do sleep 1; done
ameba_lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Install Crystal
uses: crystal-lang/install-crystal@v1.8.0
with:
crystal: latest
- name: Cache Shards
uses: actions/cache@v3
with:
path: |
./lib
./bin
key: shards-${{ hashFiles('shard.lock') }}
- name: Install Shards
run: shards install
- name: Run Ameba linter - name: Run Ameba linter
run: bin/ameba run: bin/ameba

View File

@@ -10,14 +10,17 @@ jobs:
stale: stale:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- uses: actions/stale@v10 - uses: actions/stale@v8
with: with:
repo-token: ${{ secrets.GITHUB_TOKEN }} repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 730 days-before-stale: 365
days-before-pr-stale: -1 days-before-pr-stale: 90
days-before-close: 60 days-before-close: 30
exempt-pr-labels: blocked,exempt-stale
stale-issue-message: 'This issue has been automatically marked as stale and will be closed in 30 days because it has not had recent activity and is much likely outdated. If you think this issue is still relevant and applicable, you just have to post a comment and it will be unmarked.' stale-issue-message: 'This issue has been automatically marked as stale and will be closed in 30 days because it has not had recent activity and is much likely outdated. If you think this issue is still relevant and applicable, you just have to post a comment and it will be unmarked.'
stale-pr-message: 'This pull request has been automatically marked as stale and will be closed in 30 days because it has not had recent activity and is much likely abandoned or outdated. If you think this pull request is still relevant and applicable, you just have to post a comment and it will be unmarked.'
stale-issue-label: "stale" stale-issue-label: "stale"
stale-pr-label: "stale"
ascending: true ascending: true
# Exempt the following types of issues from being staled # Never mark feature requests/enhancements as stale
exempt-issue-labels: "feature-request,enhancement,discussion,exempt-stale" exempt-issue-labels: "feature-request,enhancement,exempt-stale"

View File

@@ -1,660 +1,6 @@
# CHANGELOG # CHANGELOG
## v2.20260207.0 ## 2024-04-26
### Wrap-up
This release hardens the Invidious companion pipeline and cleans up a long list of UI papercuts. Companion downloads now work end-to-end, CSP headers and check identifiers are generated once and reused, proxy responses strip stray headers, and the final traces of the legacy signature helper are gone so the helper can be rolled out safely.
Livestream navigation, playlists, and channel metadata also see overdue fixes: Trending once again lists livestreams, "Watch on YouTube" buttons stop jumping to arbitrary timestamps, playlist imports/API calls handle missing data, and channel pages now display creator pronouns and playlist thumbnails. Deployments benefit from compiling OpenSSL into docker images to mitigate a long-standing memory leak observed with Alpine-provided OpenSSL, Crystal pinned back to 1.16.3 for docker and OCI builds, a rewritten static file handler, clarified README/HTTP proxy/unix socket docs, and dozens of smaller cleanups.
### New features & important changes
#### For Users
- Livestream experiences are restored: Trending shows livestreams again, the gaming feed remains accessible, and "Watch on YouTube" links stop carrying stale timestamps (#5480, #5555, #5481)
- Channel and playlist metadata is richer thanks to pronoun support, topic playlist thumbnails, and accurate related video counts (#5617, #5616, #5446)
- Downloads get smoother because download actions are URL-safe and downloads can flow through Invidious companion when available (#5367, #5561)
- Users see clearer feedback with Erroneous CAPTCHA messages, DMCA controls restored, and a footer link pointing at the current release (#5508, #5228, #4702)
#### For instance owners
- Companion integration is sturdier: CSP is generated once, check identifiers persist, and the helper hyperlink is fixed (#5497, #5575, #5491)
- Proxied images and videoplayback strip unwanted response headers (shared header-strip list) (#5595)
- Runtime and packaging updates pin docker/OCI builds to Crystal 1.16.3, bring an optional Crystal 1.18.2 + Alpine 3.23 image, and compile OpenSSL from source to mitigate the memory leak seen with Alpine-provided OpenSSL (#5604, #5577, #5574, #5441)
- Configuration docs saw polish with unix socket instructions, refreshed HTTP proxy comments, and corrected README commands (#5347, #5586, #5607)
- Server stability improves via a larger `max_request_line_size` that is required to be able to access some next pages of Youtube channels videos and a rewritten static file handler (#5566, #5338)
#### For developers
- Top-level constants moved into dedicated modules, preferences handling was cleaned up, and the legacy signature helper is finally removed (#5596, #5450, #5550)
- Crystal API updates replaced the deprecated `Socket#blocking` property and restored the shard target plus SPDX license metadata (#5538, #5608, #5552)
- CI/tooling stayed current with newer GitHub Actions, install-crystal releases, and cache/checkout bumps (#5569, #5544, #5530, #5499)
### Bugs fixed
#### User-side
- Playlist importer edge cases, playlist API author URLs, and channel continuation tokens now handle empty values without crashing (#4787, #5618, #5614)
- Thin mode community posts, posts that reference unavailable videos, and DMCA content toggles work again (#5567, #5549, #5228)
- UI cleanups prevent channel name/button overflow, show explicit Erroneous CAPTCHA errors, and keep livestream timestamps clean (#5553, #5452, #5508, #5481)
- Trending feeds and related video counts regained accuracy alongside livestream/gaming categories (#5555, #5480, #5446)
#### For instance owners
- Companion downloads, CSP reuse, and check id generation behave predictably even under load (#5561, #5497, #5575)
- Proxy responses drop stray headers and HTTP proxy examples in the config were clarified (#5595, #5586)
- Docker/OCI builds were pinned to stable Crystal releases with OpenSSL bundled to avoid memory leaks (#5604, #5577, #5441)
#### For developers
- README commit instructions, shard targets, and unix socket docs were corrected (#5607, #5608, #5347)
- Thin mode preference comparisons no longer convert unnecessary strings (#5568)
- URL encoding fixes in the download widget and socket API updates prevent regressions when upgrading Crystal (#5367, #5538)
### Full list of pull requests merged since the last release (newest first)
* refactor: Move top level constants to it's own modules (https://github.com/iv-org/invidious/pull/5596, by @Fijxu)
* pages/watch: URL encode 'action' in download widget (https://github.com/iv-org/invidious/pull/5367, by @SamantazFox)
* Document use of unix sockets for `db` (https://github.com/iv-org/invidious/pull/5347, by @Fijxu)
* Generate companion CSP only once to reuse it (https://github.com/iv-org/invidious/pull/5497, by @Fijxu)
* Fix youtube CSV playlist importer (https://github.com/iv-org/invidious/pull/4787, by @ThatMatrix)
* Playlist API: return empty author url if ucid is empty (https://github.com/iv-org/invidious/pull/5618, by @radmorecameron)
* Channels: parse pronouns and display them on channel page (https://github.com/iv-org/invidious/pull/5617, by @radmorecameron)
* playlist: parse playlist thumbnails for topic autogenerated playlists (https://github.com/iv-org/invidious/pull/5616, by @radmorecameron)
* fix: add missing embedded protobuf message in continuation token for channel videos (https://github.com/iv-org/invidious/pull/5614, by @Fijxu)
* Update shard.yml to include target that was removed in commit 9d54cf9 (https://github.com/iv-org/invidious/pull/5608, by @Harm133)
* chore: Do not convert thin_mode preference to string to compare it in before_all (https://github.com/iv-org/invidious/pull/5568, by @Fijxu)
* Fix thin_mode preference for channel community page (https://github.com/iv-org/invidious/pull/5567, by @Fijxu)
* Fix commit command in README instructions, as per #5606 (https://github.com/iv-org/invidious/pull/5607, by @kirisakow)
* Revert "Bump crystallang/crystal from 1.16.3-alpine to 1.19.0-alpine in /docker" (https://github.com/iv-org/invidious/pull/5604, by @unixfox)
* Bump crystallang/crystal from 1.16.3-alpine to 1.19.0-alpine in /docker (https://github.com/iv-org/invidious/pull/5603, by @dependabot[bot])
* doc: Update HTTP proxy configuration comments (https://github.com/iv-org/invidious/pull/5586, by @unixfox)
* Strip unwanted headers from response headers in images and videoplayback (https://github.com/iv-org/invidious/pull/5595, by @Fijxu)
* Generate companion check id one time and add missing companion check id on captions (https://github.com/iv-org/invidious/pull/5575, by @Fijxu)
* Downgrade Crystal to 1.16.3 in OCI (https://github.com/iv-org/invidious/pull/5577, by @Fijxu)
* Allow downloading via companion (https://github.com/iv-org/invidious/pull/5561, by @JeroenBoersma)
* chore: crystal 1.8.2 + alpine 3.23 (https://github.com/iv-org/invidious/pull/5574, by @unixfox)
* Replace deprecated `blocking` property of `Socket` (https://github.com/iv-org/invidious/pull/5538, by @Fijxu)
* Replace `Kemal::StaticFileHandler` with direct subclass of stdlib `HTTP::StaticFileHandler` on Crystal >= 1.17.0 (https://github.com/iv-org/invidious/pull/5338, by @syeopite)
* dockerfile: compile openssl instead of using the one bundled on the crystal alpine image. (https://github.com/iv-org/invidious/pull/5441, by @Fijxu)
* Bump actions/cache from 4 to 5 (https://github.com/iv-org/invidious/pull/5569, by @dependabot[bot])
* Set Kemal `max_request_line_size` to 16384 for large channel continuation query parameters. (https://github.com/iv-org/invidious/pull/5566, by @Fijxu)
* Add link to GitHub release/tag/commit in footer (https://github.com/iv-org/invidious/pull/4702, by @shaedrich)
* Display "Erroneous CAPTCHA" for invalid captchas (https://github.com/iv-org/invidious/pull/5508, by @Fijxu)
* Fix channel name overflow (https://github.com/iv-org/invidious/pull/5553, by @Fijxu)
* Fix trending page by leaving livestream and gaming trending pages (https://github.com/iv-org/invidious/pull/5555, by @Fijxu)
* fix: restore dmca_content functionality (https://github.com/iv-org/invidious/pull/5228, by @Fijxu)
* Remove signature helper completely from Invidious (https://github.com/iv-org/invidious/pull/5550, by @Fijxu)
* Fix community posts when there is a unavailable video in a post (https://github.com/iv-org/invidious/pull/5549, by @Fijxu)
* chore: Update shard.yml to use SPDX license identifier (https://github.com/iv-org/invidious/pull/5552, by @Fijxu)
* Store `preferences` in a variable when reused and rename `prefs` to `preferences` (https://github.com/iv-org/invidious/pull/5450, by @Fijxu)
* Bump actions/checkout from 5 to 6 (https://github.com/iv-org/invidious/pull/5544, by @dependabot[bot])
* Bump crystal-lang/install-crystal from 1.8.3 to 1.9.1 (https://github.com/iv-org/invidious/pull/5530, by @dependabot[bot])
* Fix 0 view count on related videos section (https://github.com/iv-org/invidious/pull/5446, by @shiny-comic)
* Prevent timestamp from being set for Livestreams on "Watch on Youtube" links (https://github.com/iv-org/invidious/pull/5481, by @Fijxu)
* Add Livestreams to trending page (https://github.com/iv-org/invidious/pull/5480, by @Fijxu)
* Fix button overflow (https://github.com/iv-org/invidious/pull/5452, by @Fijxu)
* Bump crystal-lang/install-crystal from 1.8.2 to 1.8.3 (https://github.com/iv-org/invidious/pull/5499, by @dependabot[bot])
* Fixed broken companion hyperlink (https://github.com/iv-org/invidious/pull/5491, by @ndsvw)
## v2.20250913.0
### Wrap-up
This release primarily marks Invidious companion's ascend out of beta and its stable integration thereof into Invidious!
For those unaware Invidious companion is the successor to the `inv-sig-helper` tool, designed to securely pass YouTube's attestation checks and allow for the efficient retrieval and playback of video streams reliably.
Companion delivers YouTube fixes faster since its built on the community-driven [YouTube.js](https://github.com/LuanRT/YouTube.js) project, used by many open source projects such as [FreeTube](https://github.com/FreeTubeApp/FreeTube).
For more information see https://github.com/iv-org/invidious-companion and https://docs.invidious.io/installation/
But companion isn't the only new thing in this release!
Invidious will no longer error out completely as soon as a single item failed to parse in search results, channel pages, etc. Instead it now handles it gracefully by substituting those problematic items with an error card and rendering the page normally.
The player has gained some quality of life features such as being able to choose a default playlist for videos to be added to, or persisting caption appearance settings across the session.
Base Invidious video retrieval without Invidious companion has also been made more stable.
And finally a significant amount of bugs were fixed alongside many other minor improvements.
### New features & important changes
#### For Users
- DASH is now enabled by default due to YouTube's removal of the 720p non-dash streams
- Javascript licencing info has been added to all of Invidious' scripts, restoring full compatibility with LibreJS
- There is no longer an option for a text captcha during registration due to the shutdown (presumably) of the upstream service
- Parse errors in feeds will no longer render the entire feed unusable and instead will substitute only the broken items with error cards
- Keyboard shortcuts have been added to configure caption styles:
- `-`,`=` can be used to change the font size
- `o` can be used to cycle the opacity of the caption text
- `w` can be used to cycle the opacity of the caption box
- Caption styles changed through the VideoJS menu will now persist
- You can now choose a default playlist to add videos to instead of needing to manually select one each time
#### For instance owners
- Invidious companion support has been added to replace the deprecated inv-sig-helper
- **DASH is now the default resolution! Please ensure that your instances can withstand the significantly higher bandwidth usage or manually configure your instance to use non-dash streams by default**
- Invidious will now warn when it is unable to connect to the database instead of failing silently
- **The text captcha during registration has been removed due to the shutdown (presumably) of the upstream service**
#### For developers
- Dependabot has been added to keep Github Actions and Docker dependencies up-to-date.
- CI version matrix has been bumped to the latest patch release for each minor version
- The versions of Crystal that we test in CI/CD are now: `1.12.2`, `1.13.3`, `1.14.1`, `1.15.1`, `1.16.3`
- `Kilt` is no longer a dependency of Invidious
- The ARM64 docker image builds (and the test CI) has been changed to use Github's ARM64 runner instead of QEMU
- **An "error" JSON object can now be returned in various API responses in-place of an item that has failed to parse**:
```json
{
"type": "parse-error",
"errorMessage": "...",
"errorBacktrace": "..."
}
```
### Bugs fixed
#### User-side
- Livestream will now be properly proxied again allowing playback from the UI
- The proxy video preference for logged-in users will no longer get ignored when a default value is set by the instance
- Fixes the missing `label` key error on select search results and other feeds
- Invidious will no longer strip out spaces from search queries when navigating back from the preferences page
- Restores functionality to the `subscriptions:true` search keyword
- The channel RSS feeds will no longer have an empty title
- Individual community posts can be viewed again
- The playlists tab of channels can be viewed again
- Fix incorrect dates, region, etc of videos
- Various minor fixes were made to how video info is extracted in setups without Invidious companion to improve resiliency and chances of success
- Fix issue where the notification count becomes `TRUE` rather than an actual number
#### For instance owners
- Fixed a minor typo in config.example.yml (`effet` -> `effect`)
#### For developers
- The docker image test CI will now properly check whether Invidious has started
### Full list of pull requests merged since the last release (newest first)
* Add Invidious companion support (https://github.com/iv-org/invidious/pull/4985, by @unixfox)
* Bump shards.yml version to dev version (https://github.com/iv-org/invidious/pull/5206, by @syeopite)
* chore: enforce 16 characters for invidious_companion_key (https://github.com/iv-org/invidious/pull/5220, by @unixfox)
* chore: set dash by default (https://github.com/iv-org/invidious/pull/5216, by @unixfox)
* Fix minor casing issues in brand names (https://github.com/iv-org/invidious/pull/5258, thanks @efb4f5ff-1298-471a-8973-3d47447115dc)
* feat: route to invidious companion on downloads (https://github.com/iv-org/invidious/pull/5224, by @alexmaras)
* Fix proxying live DASH streams (https://github.com/iv-org/invidious/pull/4589, thanks @absidue)
* Reflect companion secret character limit in example config comment (https://github.com/iv-org/invidious/pull/5269, thanks @Vyquos)
* chore: Add dependabot for docker and github actions (https://github.com/iv-org/invidious/pull/5285, by @unixfox)
* Bump actions/stale from 8 to 9 (https://github.com/iv-org/invidious/pull/5291, thanks @dependabot[bot])
* Bump actions/cache from 3 to 4 (https://github.com/iv-org/invidious/pull/5289, thanks @dependabot[bot])
* Bump alpine from 3.20 to 3.21 in /docker (https://github.com/iv-org/invidious/pull/5288, thanks @dependabot[bot])
* Bump docker/build-push-action from 5 to 6 (https://github.com/iv-org/invidious/pull/5287, thanks @dependabot[bot])
* Bump crystal-lang/install-crystal from 1.8.0 to 1.8.2 (https://github.com/iv-org/invidious/pull/5286, thanks @dependabot[bot])
* Bump crystallang/crystal from 1.12.2-alpine to 1.16.2-alpine in /docker (https://github.com/iv-org/invidious/pull/5290, thanks @dependabot[bot])
* Bump crystallang/crystal from 1.16.2-alpine to 1.16.3-alpine in /docker (https://github.com/iv-org/invidious/pull/5301, thanks @dependabot[bot])
* CI: Bump Crystal version matrix (https://github.com/iv-org/invidious/pull/5293, by @Fijxu)
* fix(typo): 'Salect' -> 'Select' (https://github.com/iv-org/invidious/pull/5242, by @Fijxu)
* fix: set CSP header after setting preferences of registered users (https://github.com/iv-org/invidious/pull/5275, by @Fijxu)
* fix: safely access "label" key (https://github.com/iv-org/invidious/pull/5282, by @Fijxu)
* Add missing javascript licenses (https://github.com/iv-org/invidious/pull/5292, by @Fijxu)
* Add Javascript licence information automatically (https://github.com/iv-org/invidious/pull/5297, by @syeopite)
* Remove text captcha due to textcaptcha.com being down (https://github.com/iv-org/invidious/pull/5308, by @Fijxu)
* Release versioning maintenance (https://github.com/iv-org/invidious/pull/5310, by @syeopite)
* Update Kemal to 1.6.0 and remove Kilt (https://github.com/iv-org/invidious/pull/5120, by @syeopite)
* Translations update from Hosted Weblate (https://github.com/iv-org/invidious/pull/5192, thanks @weblate)
* require base_job before the other jobs (https://github.com/iv-org/invidious/pull/5194, by @Fijxu)
* Handle parse errors gracefully on timeline items (https://github.com/iv-org/invidious/pull/5196, by @syeopite)
* fix: do not strip '+' character from referer (https://github.com/iv-org/invidious/pull/5276, by @Fijxu)
* fix: pass user to `query.process` if present. (https://github.com/iv-org/invidious/pull/5277, by @Fijxu)
* Add missing xml.text on "title" element for channels RSS (https://github.com/iv-org/invidious/pull/5320, by @Fijxu)
* Remove `@iv-org/developers` from codeowners (https://github.com/iv-org/invidious/pull/5314, by @syeopite)
* Make base-Invidious video info extraction more resilient (https://github.com/iv-org/invidious/pull/5312, by @syeopite)
* Bump actions/checkout from 4 to 5 (https://github.com/iv-org/invidious/pull/5415, thanks @dependabot[bot])
* Player: Add keyboard shortcuts to configure captions (https://github.com/iv-org/invidious/pull/5188, thanks @epicsam123)
* CI: Use public ARM64 Github actions runners for ARM64 builds. (https://github.com/iv-org/invidious/pull/5305, by @Fijxu)
* CI: Fix docker ci job not checking if Invidious starts successfully or not (https://github.com/iv-org/invidious/pull/5306, by @Fijxu)
* YtAPI: Bump client versions (https://github.com/iv-org/invidious/pull/5325, by @Fijxu)
* YTAPI: Add `TvSimply` client (https://github.com/iv-org/invidious/pull/5344, by @Fijxu)
* Videos: Add fallback to TvSimply client (https://github.com/iv-org/invidious/pull/5345, by @Fijxu)
* Show message when connection to the database is not possible (https://github.com/iv-org/invidious/pull/5346, by @Fijxu)
* Channels: Fix fetching of individual community posts (https://github.com/iv-org/invidious/pull/5361, thanks @ChunkyProgrammer)
* Videos: Fix missing .id to retrieve first playlist video ID (https://github.com/iv-org/invidious/pull/5366, by @SamantazFox)
* HTML: Add Missing Noreferrers (https://github.com/iv-org/invidious/pull/5368, thanks @epicsam123)
* Documentation: Fix typo (effet -> effect) (https://github.com/iv-org/invidious/pull/5369, thanks @nsunami)
* Frontend: Fix notification count of `TRUE` (https://github.com/iv-org/invidious/pull/5391, thanks @fieryhenry)
* Player: Persist caption settings (https://github.com/iv-org/invidious/pull/5417, thanks @p-himik)
* Channels: Fix fetching channel playlists (https://github.com/iv-org/invidious/pull/5418, thanks @KrisVos130)
* CI: fix wrong if statement for build-docker job (https://github.com/iv-org/invidious/pull/5442, by @Fijxu)
* initial base_url companion support + proxy companion (https://github.com/iv-org/invidious/pull/5266, by @unixfox)
* Prevent player microformat from being overwritten by the next microformat (https://github.com/iv-org/invidious/pull/5453, by @Fijxu)
* Bump actions/stale from 9 to 10 (https://github.com/iv-org/invidious/pull/5457, thanks @dependabot[bot])
* Better documentation for the specific case public_url with companion (https://github.com/iv-org/invidious/pull/5461, by @unixfox)
* Add default playlist preference (https://github.com/iv-org/invidious/pull/5449, by @Fijxu)
* Translations update from Hosted Weblate (https://github.com/iv-org/invidious/pull/5313, thanks to our many translators)
* Release `v2.20250913.0` (https://github.com/iv-org/invidious/pull/5463, by @syeopite)
## v2.20250517.0
Inverse fallback for the YouTube client from TVHTML then MWEB. Fixes https://github.com/iv-org/invidious/issues/5273
## v2.20250504.0
Small release with quick workaround fix for issue #4251 (Nil assertion failed).
PR: https://github.com/iv-org/invidious/issues/5262
## v2.20250314.0
### Wrap-up
This release brings the long awaited feature of supporting multiple audio tracks in a video, some bug fixes and UX improvements, and many other things primarily oriented to self-hosting instances, and developers using the API.
The `Community` channel tab has been replaced by `Posts` in light of YouTube changes, but the URL remains the same.
Tamil is now available as an interface language
Automatic instance redirects will no longer have the chance to annoyingly redirect to the same instance you're on.
Due to their requirements for video playback, Invidious will log warning messages when either inv-sig-helper, `po_token` or `visitor_data` is not configured
Invidious is now able to listen through a UNIX socket
User notifications are now batched for each channel
**The minimum Crystal version supported by Invidious now `1.12.0`**
### New features & important changes
#### For users
* Invidious now supports videos with multiple audio tracks allowing you to select which one you want to hear with!
* Channel pages now have a proper previous page button
* RSS feeds for channels will no longer contain the channel's profile picture
* Support for channel `courses` page has been added
* `Community` tabs has been replaced with `Posts` to comply with YouTube changes
* Tamil is now an available interface language.
#### For instance owners
* Invidious is now able to listen on a UNIX socket
* User notifications are now batched by channels, significantly reducing database load.
* **`1.12.0` is now the oldest Crystal version that Invidious supports**
* The example config will no longer force an http proxy to be configured
* Invidious will now warn when any top-level config option must be set to a custom value, instead of just `HMAC_KEY`
* Due to their requirements for video playback, Invidious will log warning messages when either inv-sig-helper, `po_token` or `visitor_data` is not configured
#### For developers
* Invidious is now compliant to Crystal 1.15 formatting rules, which are incompatible with earlier versions.
* `/api/v1/transcripts/{id}` has been added to the API to allow for fetching the transcripts for a video. The arguments are the same as the captions endpoint.
* `author_thumbnail` field has been added to videos in the various paged api endpoints
* `published` field has been added to the API response for a video's related videos.
* Docker builds now uses the Crystal compiler cache, reducing build times on repeated builds significantly.
* Invidious ajax action handlers has undergone a clean up and may face compatibility issues with code that depends on these endpoints.
* The versions of Crystal that we test in CI/CD are now: `1.12.1`, `1.13.2`, `1.14.0`, `1.15.0`
### Bugs fixed
#### User-side
* Local video listen mode is now preserved when clicking on a video in the sidebar playlist widget
* Automatic instance redirects will no longer redirect to the same instance the user is on
* Fix some thumbnails responses returning 404
* Videos: Fix missing host parameter on playback URLs when `local=true`
* Fix HLS being used for non-livestream videos
* Fix timeupdate event errors when required elements are missing
* User: Ensure IO is properly closed when importing NewPipe subscriptions
#### For instance owners
* Fix http proxy configuration being forced by the standard example config
#### API
* `/api/v1/videos/{id}` will no longer return an occasional empty JSON response
### Full list of pull requests merged since the last release (newest first)
* Make Invidious compliant to Crystal 1.15 formatting rules (https://github.com/iv-org/invidious/pull/5014, by @syeopite)
* Remove formatter check on container workflows (https://github.com/iv-org/invidious/pull/5153, by @syeopite)
* Videos: Fix missing host parameter on playback URLs when `local=true` (https://github.com/iv-org/invidious/pull/4992, by @SamantazFox)
* Remove stdlib override for proxy initialization (https://github.com/iv-org/invidious/pull/5065, by @syeopite)
* Add support for author thumbnails in search api for videos (https://github.com/iv-org/invidious/pull/5072, thanks @ChunkyProgrammer)
* Skip route if resp got closed by before handlers (https://github.com/iv-org/invidious/pull/5073, by @syeopite)
* Fix video thumbnails in mixes (https://github.com/iv-org/invidious/pull/5116, thanks @iBicha)
* CI: Drop support for versions prior to 1.12 and add 1.15.0 (https://github.com/iv-org/invidious/pull/5148, by @syeopite)
* [Continuing #5094] Set language info for dash audio streams and sort (https://github.com/iv-org/invidious/pull/5149, thanks @giuliano-macedo)
* Warn when any top-level config is "CHANGE_ME!!" (https://github.com/iv-org/invidious/pull/5150, by @syeopite)
* Comment out http_proxy in example config (https://github.com/iv-org/invidious/pull/5151, by @syeopite)
* API: Add a 'published' video parameter for related videos (https://github.com/iv-org/invidious/pull/4149, thanks @RadoslavL)
* Ensure IO is properly closed when importing NewPipe subscriptions (https://github.com/iv-org/invidious/pull/4346, thanks @ChunkyProgrammer)
* Carry over audio-only mode in playlist links (https://github.com/iv-org/invidious/pull/4784, thanks @krystof1119)
* Routes: Clean ajax actions handlers (https://github.com/iv-org/invidious/pull/5036, by @SamantazFox)
* Frontend: Add a first page and previous page buttons for channel navigation (https://github.com/iv-org/invidious/pull/4123, thanks @RadoslavL)
* RSS: Channel + Playlist improvements (https://github.com/iv-org/invidious/pull/4298, thanks @ChunkyProgrammer)
* Batch user notifications together (https://github.com/iv-org/invidious/pull/4486, thanks @999eagle)
* JS: Update timeupdate event making it more defensive to prevent errors (https://github.com/iv-org/invidious/pull/4782, thanks @PMK)
* Add API endpoint for fetching transcripts from YouTube by (https://github.com/iv-org/invidious/pull/4788, by @syeopite)
* Translations update from Hosted Weblate by (https://github.com/iv-org/invidious/pull/4989, thanks to our many translators)
* Add the ability to listen on UNIX sockets (https://github.com/iv-org/invidious/pull/5112, thanks @Caian)
* Pick a different instance upon redirect (https://github.com/iv-org/invidious/pull/5154, thanks @epicsam123)
* Add Courses to channel page and channel API (https://github.com/iv-org/invidious/pull/5158, thanks @ChunkyProgrammer)
* fix /api/v1/videos/:id returns 200 with no content (https://github.com/iv-org/invidious/pull/5162, thanks @Drikanis)
* Use Crystal compiler cache in docker builds (https://github.com/iv-org/invidious/pull/5163, by @syeopite)
* Channels: Fix community tab by (https://github.com/iv-org/invidious/pull/5183, thanks @Fijxu)
* Fix typo in `src/invidious/routes/images.cr` (https://github.com/iv-org/invidious/pull/5184, by @syeopite)
* Fix an issue with the HLS manifest check for livestream videos (https://github.com/iv-org/invidious/pull/5189, thanks @alexmaras)
* Warn when `po_token`, `visitor_data` and/or `inv-sig-helper` is not configured (https://github.com/iv-org/invidious/pull/5202, by @syeopite)
## v2.20241110.0
### Wrap-up
This release is most importantly here to fix to the annoying "Youtube API returned error 400"
error that prevented all channel pages from loading.
If you're updating from the previous release, it provides no improvements on the ability to play
videos. If updating from a commit in-between release, it removes the "Please sign in" error caused
by a previous attempt at restoring video playback on large instances.
In the preferences, a new option allows for control of video preload. When enabled, this option
tells the browser to load the video as soon as the page is loaded (this used to be the default).
When disabled, the video starts loading only when the "play" button is pressed.
New interface languages available: Bulgarian, Welsh and Lombard
New dependency required: `tzdata`.
An HTTP proxy can be configured directly in Invidious, if needed. \
**NOTE:** In that case, it is recommended to comment out `force_resolve`.
### New features & important changes
#### For users
* Channels: Fix "Youtube API returned error 400" error preventing channel pages from loading
* Channels: Shorts can now be sorted by "newest", "oldest" and "popular"
* Preferences: Addition of the new "preload" option
* New interface languages available: Bulgarian, Welsh and Lombard
* Added "Filipino (auto-generated)" to the list of caption languages available
* Lots of new translations from Weblate
#### For instance owners
* Allow the configuration of an HTTP proxy to talk to Youtube
* Invidious tries to reconnect to `inv_sig_helper` if the socket is closed
* The instance list is downloaded in the background to improve redirection speed
* New `colorize_logs` option makes each log level a different color
#### For developpers
* `/api/v1/channels/{id}/shorts` now supports the `sort-by` parameter with the following values:
`newest`, `oldest` and `popular`
* Older `/api/v1/channels/xyz/{id}` (tab name before UCID) were removed
* API/Search: New video metadata available: `isNew`, `is4k`, `is8k`, `isVr180`, `isVr360`,
`is3d` and `hasCaptions`
### Bugs fixed
#### User-side
* Channels: The second page of shorts now loads as expected
* Channels: Fixed intermittent empty "playlists" tab
* Search: Fixed `youtu.be` URLs not being properly redirected to the watch page
* Fixed `DB::MappingException` error on the subscriptions feed (due to missing `tzdata` in docker)
* Switching to another instance is much faster
* Fixed an "invalid byte sequence" error when subscribing to a playlist
* Videos: Playback URLs were sometimes broken when cached and `inv_sig_helper` was used
#### For instance owners
* Fix `force_resolve` being ignored in some cases
#### API
* API/Videos: Fixed `live_now` and `premiere_timestamp` sometimes not having the right values
### Full list of pull requests merged since the last release (newest first)
* API: Add "sort_by" parameter to channels/shorts endpoint ([#5071], thanks @iBicha)
* Docker: Install tzdata in Dockerfile ([#5070], by @SamantazFox)
* Videos: Stop using TVHTML5_SIMPLY_EMBEDDED_PLAYER ([#5063], thanks @unixfox)
* Routing: Deprecate old channel API routes ([#5045], by @SamantazFox)
* Videos: use WEB client instead of WEB CREATOR ([#4984], thanks @unixfox)
* Parsers: Fix parsing live_now and premiere_timestamp ([#4934], thanks @absidue)
* Stale bot updates ([#5060], thanks @syeopite)
* Channels: Fix "Youtube API returned error 400" ([#5059], by @SamantazFox)
* Channels: Fix for live videos ([#5027], thanks @iBicha)
* Locales: Add Bulgarian, Welsh and Lombard to the list ([#5046], by @SamantazFox)
* Shards: Update database dependencies ([#5034], by @SamantazFox)
* Logger: Add color support for different log levels ([#4931], thanks @Fijxu)
* Fix named arg syntax when passing force_resolve ([#4754], thanks @syeopite)
* Use make_client instead of calling HTTP::Client ([#4709], thanks @syeopite)
* Add "Filipino (auto-generated)" to the list of caption languages ([#4995], by @SamantazFox)
* Makefile: Add MT option to enable the 'preview_mt' flag ([#4993], by @SamantazFox)
* SigHelper: Reconnect to signature helper ([#4991], thanks @Fijxu)
* Fix player menus hiding onHover ready ([#4750], thanks @giacomocerquone)
* Use connection pools when requesting images from YouTube ([#4326], thanks @syeopite)
* Add support for using Invidious through a HTTP Proxy ([#4270], thanks @syeopite)
* Search: Fix 'youtu.be' URLs in sanitizer ([#4894], by @SamantazFox)
* Ameba: Disable Style/RedundantNext rule ([#4888], thanks @syeopite)
* Playlists: Fix 'invalid byte sequence' error when subscribing ([#4887], thanks @DmitrySandalov)
* Parse more metadata badges for SearchVideos ([#4863], thanks @ChunkyProgrammer)
* Translations update from Hosted Weblate ([#4862], thanks to our many translators)
* Videos: Convert URL before putting result into cache ([#4850], by @SamantazFox)
* HTML: Add error message to "search issues on GitHub" link ([#4652], thanks @tracedgod)
* Preferences: Add option to control preloading of video data ([#4122], thanks @Nerdmind)
* Performance: Improve speed of automatic instance redirection ([#4193], thanks @syeopite)
* Remove myself from CODEOWNERS on the config file ([#4942], by @TheFrenchGhosty)
* Update latest version WEB_CREATOR + fix comment web embed ([#4930], thanks @unixfox)
* use WEB_CREATOR when po_token with WEB_EMBED as a fallback ([#4928], thanks @unixfox)
* Revert "use web screen embed for fixing potoken functionality"
* use web screen embed for fixing potoken functionality ([#4923], thanks @unixfox)
[#4122]: https://github.com/iv-org/invidious/pull/4122
[#4193]: https://github.com/iv-org/invidious/pull/4193
[#4270]: https://github.com/iv-org/invidious/pull/4270
[#4326]: https://github.com/iv-org/invidious/pull/4326
[#4652]: https://github.com/iv-org/invidious/pull/4652
[#4709]: https://github.com/iv-org/invidious/pull/4709
[#4750]: https://github.com/iv-org/invidious/pull/4750
[#4754]: https://github.com/iv-org/invidious/pull/4754
[#4850]: https://github.com/iv-org/invidious/pull/4850
[#4862]: https://github.com/iv-org/invidious/pull/4862
[#4863]: https://github.com/iv-org/invidious/pull/4863
[#4887]: https://github.com/iv-org/invidious/pull/4887
[#4888]: https://github.com/iv-org/invidious/pull/4888
[#4894]: https://github.com/iv-org/invidious/pull/4894
[#4923]: https://github.com/iv-org/invidious/pull/4923
[#4928]: https://github.com/iv-org/invidious/pull/4928
[#4930]: https://github.com/iv-org/invidious/pull/4930
[#4931]: https://github.com/iv-org/invidious/pull/4931
[#4934]: https://github.com/iv-org/invidious/pull/4934
[#4942]: https://github.com/iv-org/invidious/pull/4942
[#4984]: https://github.com/iv-org/invidious/pull/4984
[#4991]: https://github.com/iv-org/invidious/pull/4991
[#4993]: https://github.com/iv-org/invidious/pull/4993
[#4995]: https://github.com/iv-org/invidious/pull/4995
[#5027]: https://github.com/iv-org/invidious/pull/5027
[#5034]: https://github.com/iv-org/invidious/pull/5034
[#5045]: https://github.com/iv-org/invidious/pull/5045
[#5046]: https://github.com/iv-org/invidious/pull/5046
[#5059]: https://github.com/iv-org/invidious/pull/5059
[#5060]: https://github.com/iv-org/invidious/pull/5060
[#5063]: https://github.com/iv-org/invidious/pull/5063
[#5070]: https://github.com/iv-org/invidious/pull/5070
[#5071]: https://github.com/iv-org/invidious/pull/5071
## v2.20240825.2 (2024-08-26)
This releases fixes the container tags pushed on quay.io.
Previously, the ARM64 build was released under the `latest` tag, instead of `latest-arm64`.
### Full list of pull requests merged since the last release (newest first)
CI: Fix docker container tags ([#4883], by @SamantazFox)
[#4877]: https://github.com/iv-org/invidious/pull/4877
## v2.20240825.1 (2024-08-25)
Add patch component to be [semver] compliant and make github actions happy.
[semver]: https://semver.org/
### Full list of pull requests merged since the last release (newest first)
Allow manual trigger of release-container build ([#4877], thanks @syeopite)
[#4877]: https://github.com/iv-org/invidious/pull/4877
## v2.20240825.0 (2024-08-25)
### New features & important changes
#### For users
* The search bar now has a button that you can click!
* Youtube URLs can be pasted directly in the search bar. Prepend search query with a
backslash (`\`) to disable that feature (useful if you need to search for a video whose
title contains some youtube URL).
* On the channel page the "streams" tab can be sorted by either: "newest", "oldest" or "popular"
* Lots of translations have been updated (thanks to our contributors on Weblate!)
* Videos embedded in local HTML files (e.g: a webpage saved from a blog) can now be played
#### For instance owners
* Invidious now has the ability to provide a `po_token` and `visitordata` to Youtube in order to
circumvent current Youtube restrictions.
* Invidious can use an (optional) external signature server like [inv_sig_helper]. Please note that
some videos can't be played without that signature server.
* The Helm charts were moved to a separate repo: https://github.com/iv-org/invidious-helm-chart
* We have changed how containers are released: the `latest` tag now tracks tagged releases, whereas
the `master` tag tracks the most recent commits of the `master` branch ("nightly" builds).
[inv_sig_helper]: https://github.com/iv-org/inv_sig_helper
#### For developpers
* The versions of Crystal that we test in CI/CD are now: `1.9.2`, `1.10.1`, `1.11.2`, `1.12.1`.
Please note that due to a bug in the `libxml` bindings (See [#4256]), versions prior to `1.10.0`
are not recommended to use.
* Thanks to @syeopite, the code is now [ameba] compliant.
* Ameba is part of our CI/CD pipeline, and its rules will be enforced in future PRs.
* The transcript code has been rewritten to permit transcripts as a feature rather than being
only a workaround for captions. Trancripts feature is coming soon!
* Various fixes regarding the logic interacting with Youtube
* The `sort_by` parameter can be used on the `/api/v1/channels/{id}/streams` endpoint. Accepted
values are: "newest", "oldest" and "popular"
[ameba]: https://github.com/crystal-ameba/ameba
[#4256]: https://github.com/iv-org/invidious/issues/4256
### Bugs fixed
#### User-side
* Channels: fixed broken "subscribers" and "views" counters
* Watch page: playback position is reset at the end of a video, so that the next time this video
is watched, it will start from the beginning rather than 15 seconds before the end
* Watch page: the items in the "add to playlist" drop down are now sorted alphabetically
* Videos: the "genre" URL is now always pointing to a valid webpage
* Playlists: Fixed `Could not parse N episodes` error on podcast playlists
* All external links should now have the [`rel`] attibute set to `noreferrer noopener` for
increased privacy.
* Preferences: Fixed the admin-only "modified source code" input being ignored
* Watch/channel pages: use the full image URL in `og:image` and `twitter:image` meta tags
[`rel`]: https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/rel
#### API
* fixed the `local` parameter not applying to `formatStreams` on `/api/v1/videos/{id}`
* fixed an `Index out of bounds` error hapenning when a playlist had no videos
* fixed duplicated query parameters in proxied video URLs
* Return actual video height/width/fps rather than hard coded values
* Fixed the `/api/v1/popular` endpoint not returning a proper error code/message when the
popular page/endpoint are disabled.
### Full list of pull requests merged since the last release (newest first)
* HTML: Sort playlists alphabetically in watch page drop down ([#4853], by @SamantazFox)
* Videos: Fix XSS vulnerability in description/comments ([#4852], thanks _anonymous_)
* YtAPI: Bump client versions ([#4849], by @SamantazFox)
* SigHelper: Fix inverted time comparison in 'check_update' ([#4845], by @SamantazFox)
* Storyboards: Various fixes and code cleaning ([#4153], by SamantazFox)
* Fix lint errors introduced in #4146 and #4295 ([#4876], thanks @syeopite)
* Search: Add support for Youtube URLs ([#4146], by @SamantazFox)
* Channel: Render age restricted channels ([#4295], thanks @ChunkyProgrammer)
* Ameba: Miscellaneous fixes ([#4807], thanks @syeopite)
* API: Proxy formatStreams URLs too ([#4859], thanks @colinleroy)
* UI: Add search button to search bar ([#4706], thanks @thansk)
* Add ability to set po_token and visitordata ID ([#4789], thanks @unixfox)
* Add support for an external signature server ([#4772], by @SamantazFox)
* Ameba: Fix Naming/VariableNames ([#4790], thanks @syeopite)
* Translations update from Hosted Weblate ([#4659])
* Ameba: Fix Lint/UselessAssign ([#4795], thanks @syeopite)
* HTML: Add rel="noreferrer noopener" to external links ([#4667], thanks @ulmemxpoc)
* Remove unused methods in Invidious::LogHandler ([#4812], thanks @syeopite)
* Ameba: Fix Lint/NotNilAfterNoBang ([#4796], thanks @syeopite)
* Ameba: Fix unused argument Lint warnings ([#4805], thanks @syeopite)
* Ameba: i18next.cr fixes ([#4806], thanks @syeopite)
* Ameba: Disable rules ([#4792], thanks @syeopite)
* Channel: parse subscriber count and channel banner ([#4785], thanks @ChunkyProgrammer)
* Player: Fix playback position of already watched videos ([#4731], thanks @Fijxu)
* Videos: Fix genre url being unusable ([#4717], thanks @meatball133)
* API: Fix out of bound error on empty playlists ([#4696], thanks @Fijxu)
* Handle playlists cataloged as Podcast ([#4695], thanks @Fijxu)
* API: Fix duplicated query parameters in proxied video URLs ([#4587], thanks @absidue)
* API: Return actual stream height, width and fps ([#4586], thanks @absidue)
* Preferences: Fix handling of modified source code URL ([#4437], thanks @nooptek)
* API: Fix URL for vtt subtitles ([#4221], thanks @karelrooted)
* Channels: Add sort options to streams ([#4224], thanks @src-tinkerer)
* API: Fix error code for disabled popular endpoint ([#4296], thanks @iBicha)
* Allow embedding videos in local HTML files ([#4450], thanks @tomasz1986)
* CI: Bump Crystal version matrix ([#4654], by @SamantazFox)
* YtAPI: Remove API keys like official clients ([#4655], by @SamantazFox)
* HTML: Use full URL in the og:image property ([#4675], thanks @Fijxu)
* Rewrite transcript logic to be more generic ([#4747], thanks @syeopite)
* CI: Run Ameba ([#4753], thanks @syeopite)
* CI: Add release based containers ([#4763], thanks @syeopite)
* move helm chart to a dedicated github repository ([#4711], thanks @unixfox)
[#4146]: https://github.com/iv-org/invidious/pull/4146
[#4153]: https://github.com/iv-org/invidious/pull/4153
[#4221]: https://github.com/iv-org/invidious/pull/4221
[#4224]: https://github.com/iv-org/invidious/pull/4224
[#4295]: https://github.com/iv-org/invidious/pull/4295
[#4296]: https://github.com/iv-org/invidious/pull/4296
[#4437]: https://github.com/iv-org/invidious/pull/4437
[#4450]: https://github.com/iv-org/invidious/pull/4450
[#4586]: https://github.com/iv-org/invidious/pull/4586
[#4587]: https://github.com/iv-org/invidious/pull/4587
[#4654]: https://github.com/iv-org/invidious/pull/4654
[#4655]: https://github.com/iv-org/invidious/pull/4655
[#4659]: https://github.com/iv-org/invidious/pull/4659
[#4667]: https://github.com/iv-org/invidious/pull/4667
[#4675]: https://github.com/iv-org/invidious/pull/4675
[#4695]: https://github.com/iv-org/invidious/pull/4695
[#4696]: https://github.com/iv-org/invidious/pull/4696
[#4706]: https://github.com/iv-org/invidious/pull/4706
[#4711]: https://github.com/iv-org/invidious/pull/4711
[#4717]: https://github.com/iv-org/invidious/pull/4717
[#4731]: https://github.com/iv-org/invidious/pull/4731
[#4747]: https://github.com/iv-org/invidious/pull/4747
[#4753]: https://github.com/iv-org/invidious/pull/4753
[#4763]: https://github.com/iv-org/invidious/pull/4763
[#4772]: https://github.com/iv-org/invidious/pull/4772
[#4785]: https://github.com/iv-org/invidious/pull/4785
[#4789]: https://github.com/iv-org/invidious/pull/4789
[#4790]: https://github.com/iv-org/invidious/pull/4790
[#4792]: https://github.com/iv-org/invidious/pull/4792
[#4795]: https://github.com/iv-org/invidious/pull/4795
[#4796]: https://github.com/iv-org/invidious/pull/4796
[#4805]: https://github.com/iv-org/invidious/pull/4805
[#4806]: https://github.com/iv-org/invidious/pull/4806
[#4807]: https://github.com/iv-org/invidious/pull/4807
[#4812]: https://github.com/iv-org/invidious/pull/4812
[#4845]: https://github.com/iv-org/invidious/pull/4845
[#4849]: https://github.com/iv-org/invidious/pull/4849
[#4852]: https://github.com/iv-org/invidious/pull/4852
[#4853]: https://github.com/iv-org/invidious/pull/4853
[#4859]: https://github.com/iv-org/invidious/pull/4859
[#4876]: https://github.com/iv-org/invidious/pull/4876
## v2.20240427 (2024-04-27)
Major bug fixes: Major bug fixes:
* Videos: Use android test suite client (#4650, thanks @SamantazFox) * Videos: Use android test suite client (#4650, thanks @SamantazFox)

View File

@@ -7,11 +7,6 @@ STATIC := 0
NO_DBG_SYMBOLS := 0 NO_DBG_SYMBOLS := 0
# Enable multi-threading.
# Warning: Experimental feature!!
# invidious is not stable when MT is enabled.
MT := 0
FLAGS ?= FLAGS ?=
@@ -24,10 +19,6 @@ ifeq ($(STATIC), 1)
FLAGS += --static FLAGS += --static
endif endif
ifeq ($(MT), 1)
FLAGS += -Dpreview_mt
endif
ifeq ($(NO_DBG_SYMBOLS), 1) ifeq ($(NO_DBG_SYMBOLS), 1)
FLAGS += --no-debug FLAGS += --no-debug

View File

@@ -81,9 +81,9 @@
- [Available in many languages](locales/), thanks to [our translators](#contribute) - [Available in many languages](locales/), thanks to [our translators](#contribute)
**Data import/export** **Data import/export**
- Import subscriptions from YouTube, NewPipe and FreeTube - Import subscriptions from YouTube, NewPipe and Freetube
- Import watch history from YouTube and NewPipe - Import watch history from YouTube and NewPipe
- Export subscriptions to NewPipe and FreeTube - Export subscriptions to NewPipe and Freetube
- Import/Export Invidious user data - Import/Export Invidious user data
**Technical features** **Technical features**
@@ -95,11 +95,11 @@
## Quick start ## Quick start
**Using Invidious:** **Using invidious:**
- [Select a public instance from the list](https://instances.invidious.io) and start watching videos right now! - [Select a public instance from the list](https://instances.invidious.io) and start watching videos right now!
**Hosting Invidious:** **Hosting invidious:**
- [Follow the installation instructions](https://docs.invidious.io/installation/) - [Follow the installation instructions](https://docs.invidious.io/installation/)
@@ -114,8 +114,8 @@ https://github.com/iv-org/documentation
### Extensions ### Extensions
We highly recommend the use of [Privacy Redirect](https://github.com/SimonBrazell/privacy-redirect#get), We highly recommend the use of [Privacy Redirect](https://github.com/SimonBrazell/privacy-redirect#get),
a browser extension that automatically redirects YouTube URLs to any Invidious instance and replaces a browser extension that automatically redirects Youtube URLs to any Invidious instance and replaces
embedded YouTube videos on other websites with Invidious. embedded youtube videos on other websites with invidious.
The documentation contains a list of browser extensions that we recommended to use along with Invidious. The documentation contains a list of browser extensions that we recommended to use along with Invidious.
@@ -129,7 +129,7 @@ You can read more here: https://docs.invidious.io/applications/
1. Fork it ( https://github.com/iv-org/invidious/fork ). 1. Fork it ( https://github.com/iv-org/invidious/fork ).
1. Create your feature branch (`git checkout -b my-new-feature`). 1. Create your feature branch (`git checkout -b my-new-feature`).
1. Stage your files (`git add .`). 1. Stage your files (`git add .`).
1. Commit your changes (`git commit -m 'Add some feature'`). 1. Commit your changes (`git commit -am 'Add some feature'`).
1. Push to the branch (`git push origin my-new-feature`). 1. Push to the branch (`git push origin my-new-feature`).
1. Create a new pull request ( https://github.com/iv-org/invidious/compare ). 1. Create a new pull request ( https://github.com/iv-org/invidious/compare ).
@@ -140,7 +140,7 @@ We use [Weblate](https://weblate.org) to manage Invidious translations.
You can suggest new translations and/or correction here: https://hosted.weblate.org/engage/invidious/. You can suggest new translations and/or correction here: https://hosted.weblate.org/engage/invidious/.
Creating an account is not required, but recommended, especially if you want to contribute regularly. Creating an account is not required, but recommended, especially if you want to contribute regularly.
Weblate also allows you to log-in with major SSO providers like GitHub, GitLab, BitBucket, Google, ... Weblate also allows you to log-in with major SSO providers like Github, Gitlab, BitBucket, Google, ...
## Projects using Invidious ## Projects using Invidious

View File

@@ -75,16 +75,6 @@ body {
height: auto; height: auto;
} }
.channel-profile > .channel-name-pronouns {
display: inline-block;
}
.channel-profile > .channel-name-pronouns > .channel-pronouns {
font-style: italic;
font-size: .8em;
font-weight: lighter;
}
body a.channel-owner { body a.channel-owner {
background-color: #008bec; background-color: #008bec;
color: #fff; color: #fff;
@@ -177,7 +167,6 @@ body a.pure-button-primary,
.pure-button-primary, .pure-button-primary,
.pure-button-secondary { .pure-button-secondary {
white-space: normal;
border: 1px solid #a0a0a0; border: 1px solid #a0a0a0;
border-radius: 3px; border-radius: 3px;
margin: 0 .4em; margin: 0 .4em;
@@ -289,14 +278,7 @@ div.thumbnail > .bottom-right-overlay {
display: inline; display: inline;
} }
.searchbar .pure-form { .searchbar .pure-form fieldset { padding: 0; }
display: flex;
}
.searchbar .pure-form fieldset {
padding: 0;
flex: 1;
}
.searchbar input[type="search"] { .searchbar input[type="search"] {
width: 100%; width: 100%;
@@ -328,16 +310,6 @@ input[type="search"]::-webkit-search-cancel-button {
background-size: 14px; background-size: 14px;
} }
.searchbar #searchbutton {
border: none;
background: none;
margin-top: 0;
}
.searchbar #searchbutton:hover {
color: rgb(0, 182, 240);
}
.user-field { .user-field {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
@@ -414,15 +386,9 @@ input[type="search"]::-webkit-search-cancel-button {
.video-card-row { margin: 15px 0; } .video-card-row { margin: 15px 0; }
p.channel-name { margin: 0; overflow-wrap: anywhere;} p.channel-name { margin: 0; }
p.video-data { margin: 0; font-weight: bold; font-size: 80%; } p.video-data { margin: 0; font-weight: bold; font-size: 80%; }
.channel-profile > .channel-name,
.channel-profile > .channel-name-pronouns > .channel-name
{
overflow-wrap: anywhere;
}
/* /*
* Comments & community posts * Comments & community posts
@@ -567,10 +533,6 @@ span > select {
color: #565d64; color: #565d64;
} }
.light-theme .error-card {
border: 1px solid black;
}
@media (prefers-color-scheme: light) { @media (prefers-color-scheme: light) {
.no-theme a:hover, .no-theme a:hover,
.no-theme a:active, .no-theme a:active,
@@ -617,10 +579,6 @@ span > select {
.light-theme .pure-menu-heading { .light-theme .pure-menu-heading {
color: #565d64; color: #565d64;
} }
.no-theme .error-card {
border: 1px solid black;
}
} }
@@ -683,10 +641,6 @@ body.dark-theme {
color: inherit; color: inherit;
} }
.dark-theme .error-card {
border: 1px solid #5e5e5e;
}
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
.no-theme a:hover, .no-theme a:hover,
.no-theme a:active, .no-theme a:active,
@@ -748,10 +702,6 @@ body.dark-theme {
.no-theme footer a { .no-theme footer a {
color: #adadad !important; color: #adadad !important;
} }
.no-theme .error-card {
border: 1px solid #5e5e5e;
}
} }
@@ -849,57 +799,3 @@ h1, h2, h3, h4, h5, p,
#download_widget { #download_widget {
width: 100%; width: 100%;
} }
.error-card {
display: flex;
flex-direction: column;
align-items: center;
padding: 25px;
margin-bottom: 1em;
border-radius: 10px;
box-sizing: border-box;
height: 100%;
}
.error-card > .explanation {
display: grid;
grid-template-columns: max-content 1fr;
grid-template-rows: 1fr max-content;
align-items: center;
column-gap: 10px;
row-gap: 4px;
}
.error-card > .explanation > i {
color: #f44;
font-size: 24px;
grid-area: 1 / 1 / 2 / 2;
}
.error-card > .explanation > h4 {
grid-area: 1 / 2 / 2 / 3;
margin: 0;
}
.error-card > .explanation > p {
grid-area: 2 / 2 / 3 / 3;
margin: 0;
}
.error-card details {
margin-top: 10px;
width: 100%;
}
.error-card summary {
width: 100%;
}
.error-card pre {
height: 300px;
}
.error-issue-template {
padding: 20px;
background: rgba(0, 0, 0, 0.12345);
}

View File

@@ -68,7 +68,6 @@
.video-js.player-style-youtube .vjs-menu-button-popup .vjs-menu { .video-js.player-style-youtube .vjs-menu-button-popup .vjs-menu {
margin-bottom: 2em; margin-bottom: 2em;
padding-top: 2em
} }
.video-js.player-style-youtube .vjs-progress-control .vjs-progress-holder, .video-js.player-style-youtube .vjs-progress-control {height: 5px; .video-js.player-style-youtube .vjs-progress-control .vjs-progress-holder, .video-js.player-style-youtube .vjs-progress-control {height: 5px;
@@ -86,7 +85,6 @@ ul.vjs-menu-content::-webkit-scrollbar {
background-color: rgba(0, 0, 0, 0.75) !important; background-color: rgba(0, 0, 0, 0.75) !important;
border-radius: 9px !important; border-radius: 9px !important;
padding: 5px !important; padding: 5px !important;
line-height: 1.5 !important;
} }
.vjs-play-control, .vjs-play-control,

View File

@@ -1,4 +1,4 @@
#filters-collapse summary { summary {
/* This should hide the marker */ /* This should hide the marker */
display: block; display: block;
@@ -8,10 +8,10 @@
cursor: pointer; cursor: pointer;
} }
#filters-collapse summary::-webkit-details-marker, summary::-webkit-details-marker,
#filters-collapse summary::marker { display: none; } summary::marker { display: none; }
#filters-collapse summary:before { summary:before {
border-radius: 5px; border-radius: 5px;
content: "[ + ]"; content: "[ + ]";
margin: -2px 10px 0 10px; margin: -2px 10px 0 10px;
@@ -20,7 +20,7 @@
width: 40px; width: 40px;
} }
#filters-collapse details[open] > summary:before { content: "[ ]"; } details[open] > summary:before { content: "[ ]"; }
#filters-box { #filters-box {

View File

@@ -91,7 +91,7 @@
var count = document.getElementById('count'); var count = document.getElementById('count');
count.textContent--; count.textContent--;
var url = '/token_ajax?action=revoke_token&redirect=false' + var url = '/token_ajax?action_revoke_token=1&redirect=false' +
'&referer=' + encodeURIComponent(location.href) + '&referer=' + encodeURIComponent(location.href) +
'&session=' + target.getAttribute('data-session'); '&session=' + target.getAttribute('data-session');
@@ -111,7 +111,7 @@
var count = document.getElementById('count'); var count = document.getElementById('count');
count.textContent--; count.textContent--;
var url = '/subscription_ajax?action=remove_subscriptions&redirect=false' + var url = '/subscription_ajax?action_remove_subscriptions=1&redirect=false' +
'&referer=' + encodeURIComponent(location.href) + '&referer=' + encodeURIComponent(location.href) +
'&c=' + target.getAttribute('data-ucid'); '&c=' + target.getAttribute('data-ucid');

View File

@@ -77,7 +77,7 @@ function create_notification_stream(subscriptions) {
function update_ticker_count() { function update_ticker_count() {
var notification_ticker = document.getElementById('notification_ticker'); var notification_ticker = document.getElementById('notification_ticker');
const notification_count = helpers.storage.get(STORAGE_KEY_NOTIF_COUNT) || 0; const notification_count = helpers.storage.get(STORAGE_KEY_STREAM);
if (notification_count > 0) { if (notification_count > 0) {
notification_ticker.innerHTML = notification_ticker.innerHTML =
'<span id="notification_count">' + notification_count + '</span> <i class="icon ion-ios-notifications"></i>'; '<span id="notification_count">' + notification_count + '</span> <i class="icon ion-ios-notifications"></i>';

View File

@@ -1,93 +0,0 @@
'use strict';
const CURRENT_CONTINUATION = (new URL(document.location)).searchParams.get("continuation");
const CONT_CACHE_KEY = `continuation_cache_${encodeURIComponent(window.location.pathname)}`;
function get_data(){
return JSON.parse(sessionStorage.getItem(CONT_CACHE_KEY)) || [];
}
function save_data(){
const prev_data = get_data();
prev_data.push(CURRENT_CONTINUATION);
sessionStorage.setItem(CONT_CACHE_KEY, JSON.stringify(prev_data));
}
function button_press(){
let prev_data = get_data();
if (!prev_data.length) return null;
// Sanity check. Nowhere should the current continuation token exist in the cache
// but it can happen when using the browser's back feature. As such we'd need to travel
// back to the point where the current continuation token first appears in order to
// account for the rewind.
const conflict_at = prev_data.indexOf(CURRENT_CONTINUATION);
if (conflict_at != -1) {
prev_data.length = conflict_at;
}
const prev_ctoken = prev_data.pop();
// On the first page, the stored continuation token is null.
if (prev_ctoken === null) {
sessionStorage.removeItem(CONT_CACHE_KEY);
let url = set_continuation();
window.location.href = url;
return;
}
sessionStorage.setItem(CONT_CACHE_KEY, JSON.stringify(prev_data));
let url = set_continuation(prev_ctoken);
window.location.href = url;
};
// Method to set the current page's continuation token
// Removes the continuation parameter when a continuation token is not given
function set_continuation(prev_ctoken = null){
let url = window.location.href.split('?')[0];
let params = window.location.href.split('?')[1];
let url_params = new URLSearchParams(params);
if (prev_ctoken) {
url_params.set("continuation", prev_ctoken);
} else {
url_params.delete('continuation');
};
if(Array.from(url_params).length > 0){
return `${url}?${url_params.toString()}`;
} else {
return url;
}
}
addEventListener('DOMContentLoaded', function(){
const pagination_data = JSON.parse(document.getElementById('pagination-data').textContent);
const next_page_containers = document.getElementsByClassName("page-next-container");
for (let container of next_page_containers){
const next_page_button = container.getElementsByClassName("pure-button")
// exists?
if (next_page_button.length > 0){
next_page_button[0].addEventListener("click", save_data);
}
}
// Only add previous page buttons when not on the first page
if (CURRENT_CONTINUATION) {
const prev_page_containers = document.getElementsByClassName("page-prev-container")
for (let container of prev_page_containers) {
if (pagination_data.is_rtl) {
container.innerHTML = `<button class="pure-button pure-button-secondary">${pagination_data.prev_page}&nbsp;&nbsp;<i class="icon ion-ios-arrow-forward"></i></button>`
} else {
container.innerHTML = `<button class="pure-button pure-button-secondary"><i class="icon ion-ios-arrow-back"></i>&nbsp;&nbsp;${pagination_data.prev_page}</button>`
}
container.getElementsByClassName("pure-button")[0].addEventListener("click", button_press);
}
}
});

View File

@@ -3,12 +3,9 @@ var player_data = JSON.parse(document.getElementById('player_data').textContent)
var video_data = JSON.parse(document.getElementById('video_data').textContent); var video_data = JSON.parse(document.getElementById('video_data').textContent);
var options = { var options = {
preload: 'auto',
liveui: true, liveui: true,
playbackRates: [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0], playbackRates: [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0],
fontPercent: [0.5, 0.75, 1.25, 1.5, 1.75, 2, 3, 4],
windowOpacity: ['0', '0.5', '1'],
textOpacity: ['0.5', '1'],
persistTextTrackSettings: true,
controlBar: { controlBar: {
children: [ children: [
'playToggle', 'playToggle',
@@ -137,35 +134,27 @@ player.on('timeupdate', function () {
// YouTube links // YouTube links
if (!video_data.live_now) { let elem_yt_watch = document.getElementById('link-yt-watch');
let elem_yt_watch = document.getElementById('link-yt-watch'); let elem_yt_embed = document.getElementById('link-yt-embed');
if (elem_yt_watch) {
let base_url_yt_watch = elem_yt_watch.getAttribute('data-base-url');
elem_yt_watch.href = addCurrentTimeToURL(base_url_yt_watch);
}
let elem_yt_embed = document.getElementById('link-yt-embed'); let base_url_yt_watch = elem_yt_watch.getAttribute('data-base-url');
if (elem_yt_embed) { let base_url_yt_embed = elem_yt_embed.getAttribute('data-base-url');
let base_url_yt_embed = elem_yt_embed.getAttribute('data-base-url');
elem_yt_embed.href = addCurrentTimeToURL(base_url_yt_embed); elem_yt_watch.href = addCurrentTimeToURL(base_url_yt_watch);
} elem_yt_embed.href = addCurrentTimeToURL(base_url_yt_embed);
}
// Invidious links // Invidious links
let domain = window.location.origin; let domain = window.location.origin;
let elem_iv_embed = document.getElementById('link-iv-embed'); let elem_iv_embed = document.getElementById('link-iv-embed');
if (elem_iv_embed) {
let base_url_iv_embed = elem_iv_embed.getAttribute('data-base-url');
elem_iv_embed.href = addCurrentTimeToURL(base_url_iv_embed, domain);
}
let elem_iv_other = document.getElementById('link-iv-other'); let elem_iv_other = document.getElementById('link-iv-other');
if (elem_iv_other) {
let base_url_iv_other = elem_iv_other.getAttribute('data-base-url'); let base_url_iv_embed = elem_iv_embed.getAttribute('data-base-url');
elem_iv_other.href = addCurrentTimeToURL(base_url_iv_other, domain); let base_url_iv_other = elem_iv_other.getAttribute('data-base-url');
}
elem_iv_embed.href = addCurrentTimeToURL(base_url_iv_embed, domain);
elem_iv_other.href = addCurrentTimeToURL(base_url_iv_other, domain);
}); });
@@ -186,7 +175,7 @@ var shareOptions = {
}; };
if (location.pathname.startsWith('/embed/')) { if (location.pathname.startsWith('/embed/')) {
var overlay_content = '<h1><a rel="noopener noreferrer" target="_blank" href="' + location.origin + '/watch?v=' + video_data.id + '">' + player_data.title + '</a></h1>'; var overlay_content = '<h1><a rel="noopener" target="_blank" href="' + location.origin + '/watch?v=' + video_data.id + '">' + player_data.title + '</a></h1>';
player.overlay({ player.overlay({
overlays: [ overlays: [
{ start: 'loadstart', content: overlay_content, end: 'playing', align: 'top'}, { start: 'loadstart', content: overlay_content, end: 'playing', align: 'top'},
@@ -456,7 +445,7 @@ if (!video_data.params.listen && video_data.params.annotations) {
if (target === 'current') { if (target === 'current') {
location.href = path; location.href = path;
} else if (target === 'new') { } else if (target === 'new') {
open(path, '_blank', 'noopener,noreferrer'); open(path, '_blank');
} }
}); });
@@ -591,13 +580,6 @@ const toggle_captions = (function () {
}; };
})(); })();
// For real-time updates to captions (if currently showing)
function update_captions() {
if (document.body.querySelector('.vjs-text-track-cue')) {
toggle_captions(); toggle_captions();
}
}
function toggle_fullscreen() { function toggle_fullscreen() {
player.isFullscreen() ? player.exitFullscreen() : player.requestFullscreen(); player.isFullscreen() ? player.exitFullscreen() : player.requestFullscreen();
} }
@@ -610,34 +592,6 @@ function increase_playback_rate(steps) {
player.playbackRate(options.playbackRates[newIndex]); player.playbackRate(options.playbackRates[newIndex]);
} }
function increase_caption_size(steps) {
const maxIndex = options.fontPercent.length - 1;
const fontPercent = player.textTrackSettings.getValues().fontPercent || 1.25;
const curIndex = options.fontPercent.indexOf(fontPercent);
let newIndex = curIndex + steps;
newIndex = helpers.clamp(newIndex, 0, maxIndex);
player.textTrackSettings.setValues({ fontPercent: options.fontPercent[newIndex] });
update_captions();
}
function toggle_caption_window() {
const numOptions = options.windowOpacity.length;
const windowOpacity = player.textTrackSettings.getValues().windowOpacity || '0';
const curIndex = options.windowOpacity.indexOf(windowOpacity);
const newIndex = (curIndex + 1) % numOptions;
player.textTrackSettings.setValues({ windowOpacity: options.windowOpacity[newIndex] });
update_captions();
}
function toggle_caption_opacity() {
const numOptions = options.textOpacity.length;
const textOpacity = player.textTrackSettings.getValues().textOpacity || '1';
const curIndex = options.textOpacity.indexOf(textOpacity);
const newIndex = (curIndex + 1) % numOptions;
player.textTrackSettings.setValues({ textOpacity: options.textOpacity[newIndex] });
update_captions();
}
addEventListener('keydown', function (e) { addEventListener('keydown', function (e) {
if (e.target.tagName.toLowerCase() === 'input') { if (e.target.tagName.toLowerCase() === 'input') {
// Ignore input when focus is on certain elements, e.g. form fields. // Ignore input when focus is on certain elements, e.g. form fields.
@@ -734,12 +688,6 @@ addEventListener('keydown', function (e) {
case '>': action = increase_playback_rate.bind(this, 1); break; case '>': action = increase_playback_rate.bind(this, 1); break;
case '<': action = increase_playback_rate.bind(this, -1); break; case '<': action = increase_playback_rate.bind(this, -1); break;
case '=': action = increase_caption_size.bind(this, 1); break;
case '-': action = increase_caption_size.bind(this, -1); break;
case 'w': action = toggle_caption_window; break;
case 'o': action = toggle_caption_opacity; break;
default: default:
console.info('Unhandled key down event: %s:', decoratedKey, e); console.info('Unhandled key down event: %s:', decoratedKey, e);
break; break;

View File

@@ -6,7 +6,7 @@ function add_playlist_video(target) {
var select = target.parentNode.children[0].children[1]; var select = target.parentNode.children[0].children[1];
var option = select.children[select.selectedIndex]; var option = select.children[select.selectedIndex];
var url = '/playlist_ajax?action=add_video&redirect=false' + var url = '/playlist_ajax?action_add_video=1&redirect=false' +
'&video_id=' + target.getAttribute('data-id') + '&video_id=' + target.getAttribute('data-id') +
'&playlist_id=' + option.getAttribute('data-plid'); '&playlist_id=' + option.getAttribute('data-plid');
@@ -21,7 +21,7 @@ function add_playlist_item(target) {
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode; var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
tile.style.display = 'none'; tile.style.display = 'none';
var url = '/playlist_ajax?action=add_video&redirect=false' + var url = '/playlist_ajax?action_add_video=1&redirect=false' +
'&video_id=' + target.getAttribute('data-id') + '&video_id=' + target.getAttribute('data-id') +
'&playlist_id=' + target.getAttribute('data-plid'); '&playlist_id=' + target.getAttribute('data-plid');
@@ -36,7 +36,7 @@ function remove_playlist_item(target) {
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode; var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
tile.style.display = 'none'; tile.style.display = 'none';
var url = '/playlist_ajax?action=remove_video&redirect=false' + var url = '/playlist_ajax?action_remove_video=1&redirect=false' +
'&set_video_id=' + target.getAttribute('data-index') + '&set_video_id=' + target.getAttribute('data-index') +
'&playlist_id=' + target.getAttribute('data-plid'); '&playlist_id=' + target.getAttribute('data-plid');

View File

@@ -16,7 +16,7 @@ function subscribe() {
subscribe_button.onclick = unsubscribe; subscribe_button.onclick = unsubscribe;
subscribe_button.innerHTML = '<b>' + subscribe_data.unsubscribe_text + ' | ' + subscribe_data.sub_count_text + '</b>'; subscribe_button.innerHTML = '<b>' + subscribe_data.unsubscribe_text + ' | ' + subscribe_data.sub_count_text + '</b>';
var url = '/subscription_ajax?action=create_subscription_to_channel&redirect=false' + var url = '/subscription_ajax?action_create_subscription_to_channel=1&redirect=false' +
'&c=' + subscribe_data.ucid; '&c=' + subscribe_data.ucid;
helpers.xhr('POST', url, {payload: payload, retries: 5, entity_name: 'subscribe request'}, { helpers.xhr('POST', url, {payload: payload, retries: 5, entity_name: 'subscribe request'}, {
@@ -32,7 +32,7 @@ function unsubscribe() {
subscribe_button.onclick = subscribe; subscribe_button.onclick = subscribe;
subscribe_button.innerHTML = '<b>' + subscribe_data.subscribe_text + ' | ' + subscribe_data.sub_count_text + '</b>'; subscribe_button.innerHTML = '<b>' + subscribe_data.subscribe_text + ' | ' + subscribe_data.sub_count_text + '</b>';
var url = '/subscription_ajax?action=remove_subscriptions&redirect=false' + var url = '/subscription_ajax?action_remove_subscriptions=1&redirect=false' +
'&c=' + subscribe_data.ucid; '&c=' + subscribe_data.ucid;
helpers.xhr('POST', url, {payload: payload, retries: 5, entity_name: 'unsubscribe request'}, { helpers.xhr('POST', url, {payload: payload, retries: 5, entity_name: 'unsubscribe request'}, {

View File

@@ -67,10 +67,6 @@ function get_playlist(plid) {
'&format=html&hl=' + video_data.preferences.locale; '&format=html&hl=' + video_data.preferences.locale;
} }
if (video_data.params.listen) {
plid_url += '&listen=1'
}
helpers.xhr('GET', plid_url, {retries: 5, entity_name: 'playlist'}, { helpers.xhr('GET', plid_url, {retries: 5, entity_name: 'playlist'}, {
on200: function (response) { on200: function (response) {
playlist.innerHTML = response.playlistHtml; playlist.innerHTML = response.playlistHtml;
@@ -141,7 +137,7 @@ function get_reddit_comments() {
</b> \ </b> \
</p> \ </p> \
<b> \ <b> \
<a rel="noopener noreferrer" target="_blank" href="https://reddit.com{permalink}">{redditPermalinkText}</a> \ <a rel="noopener" target="_blank" href="https://reddit.com{permalink}">{redditPermalinkText}</a> \
</b> \ </b> \
</div> \ </div> \
<div>{contentHtml}</div> \ <div>{contentHtml}</div> \

View File

@@ -6,7 +6,7 @@ function mark_watched(target) {
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode; var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
tile.style.display = 'none'; tile.style.display = 'none';
var url = '/watch_ajax?action=mark_watched&redirect=false' + var url = '/watch_ajax?action_mark_watched=1&redirect=false' +
'&id=' + target.getAttribute('data-id'); '&id=' + target.getAttribute('data-id');
helpers.xhr('POST', url, {payload: payload}, { helpers.xhr('POST', url, {payload: payload}, {
@@ -22,7 +22,7 @@ function mark_unwatched(target) {
var count = document.getElementById('count'); var count = document.getElementById('count');
count.textContent--; count.textContent--;
var url = '/watch_ajax?action=mark_unwatched&redirect=false' + var url = '/watch_ajax?action_mark_unwatched=1&redirect=false' +
'&id=' + target.getAttribute('data-id'); '&id=' + target.getAttribute('data-id');
helpers.xhr('POST', url, {payload: payload}, { helpers.xhr('POST', url, {payload: payload}, {

View File

@@ -8,13 +8,6 @@
## Database configuration with separate parameters. ## Database configuration with separate parameters.
## This setting is MANDATORY, unless 'database_url' is used. ## This setting is MANDATORY, unless 'database_url' is used.
## ##
## Note: The 'db' setting allows the use of UNIX
## sockets. To do so, set 'host' to ""
## E.g:
## password: kemal
## host: ""
## port: 5432
##
db: db:
user: kemal user: kemal
password: kemal password: kemal
@@ -47,54 +40,20 @@ db:
## ##
#check_tables: false #check_tables: false
##
## Invidious companion is an external program
## for loading the video streams from YouTube servers.
##
## When this setting is commented out, Invidious companion is not used.
## Otherwise, Invidious will proxy the requests to Invidious companion.
##
## Note: multiple URL can be configured. In this case, Invidious will
## randomly pick one every time video data needs to be retrieved. This
## URL is then kept in the video metadata cache to allow video playback
## to work. Once said cache has expired, requesting that video's data
## again will cause a new companion URL to be picked.
##
## The parameter private_url is required for the internal communication
## between Invidious companion and Invidious.
##
## The optional parameter public_url is the public URL from which
## Invidious companion is listening to the requests from the user(s).
## When this setting is commented out, Invidious proxy all requests to
## Invidious companion. Useful for simple setups.
## Otherwise, requests from the user(s) will reach Invidious companion directly.
## And you will need to configure a reverse proxy with separate routes
## for Invidious and Invidious companion.
## Read the post-install documentation for advanced reverse proxy
## documentation: https://docs.invidious.io/installation/#post-install-configuration
##
## Accepted values: "http(s)://<IP-HOSTNAME>:<Port>"
## Default: <none>
##
#invidious_companion:
# - private_url: "http://localhost:8282/companion"
# # Uncomment for advanced reverse proxy configuration (see above).
# # public_url: "http://localhost:8282/companion"
## ##
## API key for Invidious companion, used for securing the communication ## Path to an external signature resolver, used to emulate
## between Invidious and Invidious companion. ## the Youtube client's Javascript. If no such server is
## The key needs to be exactly 16 characters long. ## available, some videos will not be playable.
## ##
## Note: This parameter is mandatory when Invidious companion is enabled ## When this setting is commented out, no external
## and should be a random string. ## resolver will be used.
## Such random string can be generated on linux with the following
## command: `pwgen 16 1`
## ##
## Accepted values: a string (of length 16) ## Accepted values: a path to a UNIX socket or "<IP>:<Port>"
## Default: <none> ## Default: <none>
## ##
#invidious_companion_key: "CHANGE_ME!!" #signature_server:
######################################### #########################################
# #
@@ -171,20 +130,6 @@ https_only: false
## ##
#hsts: true #hsts: true
##
## Path and permissions of a UNIX socket to listen on for incoming connections.
##
## Note: Enabling socket will make invidious stop listening on the address
## specified by 'host_binding' and 'port'.
##
## Accepted values: Any path to a new file (that doesn't exist yet) and its
## permissions following the UNIX octal convention.
## Default: <none>
##
#socket_binding:
# path: /tmp/invidious.sock
# permissions: 777
# ----------------------------- # -----------------------------
# Network (outbound) # Network (outbound)
@@ -228,21 +173,6 @@ https_only: false
## ##
#force_resolve: #force_resolve:
##
## Configuration for using a HTTP proxy
## If unset, then no HTTP proxy will be used.
## Proxy type supported: HTTP, HTTPS
##
## This is not used for loading the video streams from YouTube servers (circumvent YouTube restrictions)
## Please instead configure the proxy in Invidious companion:
## https://github.com/iv-org/invidious-companion/blob/master/config/config.example.toml
##
#http_proxy:
# user:
# password:
# host:
# port:
## ##
## Use Innertube's transcripts API instead of timedtext for closed captions ## Use Innertube's transcripts API instead of timedtext for closed captions
@@ -256,6 +186,19 @@ https_only: false
## ##
# use_innertube_for_captions: false # use_innertube_for_captions: false
##
## Send Google session informations. This is useful when Invidious is blocked
## by the message "This helps protect our community."
## See https://github.com/iv-org/invidious/issues/4734.
##
## Warning: These strings gives much more identifiable information to Google!
##
## Accepted values: String
## Default: <none>
##
# po_token: ""
# visitor_data: ""
# ----------------------------- # -----------------------------
# Logging # Logging
# ----------------------------- # -----------------------------
@@ -279,17 +222,6 @@ https_only: false
## ##
#log_level: Info #log_level: Info
##
## Enables colors in logs. Useful for debugging purposes
## This is overridden if "-k" or "--colorize"
## are passed on the command line.
## Colors are also disabled if the environment variable
## NO_COLOR is present and has any value
##
## Accepted values: true, false
## Default: true
##
#colorize_logs: false
# ----------------------------- # -----------------------------
# Features # Features
@@ -775,22 +707,6 @@ default_user_preferences:
# Video player behavior # Video player behavior
# ----------------------------- # -----------------------------
##
## This option controls the value of the HTML5 <video> element's
## "preload" attribute.
##
## If set to 'false', no video data will be loaded until the user
## explicitly starts the video by clicking the "Play" button.
## If set to 'true', the web browser will buffer some video data
## while the page is loading.
##
## See: https://www.w3schools.com/tags/att_video_preload.asp
##
## Accepted values: true, false
## Default: true
##
#preload: true
## ##
## Automatically play videos on page load. ## Automatically play videos on page load.
## ##
@@ -843,14 +759,14 @@ default_user_preferences:
## Default video quality. ## Default video quality.
## ##
## Accepted values: dash, hd720, medium, small ## Accepted values: dash, hd720, medium, small
## Default: dash ## Default: hd720
## ##
#quality: dash #quality: hd720
## ##
## Default dash video quality. ## Default dash video quality.
## ##
## Note: this setting only takes effect if the ## Note: this setting only takes effet if the
## 'quality' parameter is set to "dash". ## 'quality' parameter is set to "dash".
## ##
## Accepted values: ## Accepted values:

View File

@@ -0,0 +1,6 @@
CREATE INDEX channel_videos_ucid_published_idx
ON public.channel_videos
USING btree
(ucid COLLATE pg_catalog."default", published);
DROP INDEX channel_videos_ucid_idx;

View File

@@ -19,12 +19,12 @@ CREATE TABLE IF NOT EXISTS public.channel_videos
GRANT ALL ON TABLE public.channel_videos TO current_user; GRANT ALL ON TABLE public.channel_videos TO current_user;
-- Index: public.channel_videos_ucid_idx -- Index: public.channel_videos_ucid_published_idx
-- DROP INDEX public.channel_videos_ucid_idx; -- DROP INDEX public.channel_videos_ucid_published_idx;
CREATE INDEX IF NOT EXISTS channel_videos_ucid_idx CREATE INDEX IF NOT EXISTS channel_videos_ucid_published_idx
ON public.channel_videos ON public.channel_videos
USING btree USING btree
(ucid COLLATE pg_catalog."default"); (ucid COLLATE pg_catalog."default", published);

View File

@@ -14,10 +14,6 @@ services:
restart: unless-stopped restart: unless-stopped
ports: ports:
- "127.0.0.1:3000:3000" - "127.0.0.1:3000:3000"
depends_on:
invidious-db:
condition: service_healthy
restart: true
environment: environment:
# Please read the following file for a comprehensive list of all available # Please read the following file for a comprehensive list of all available
# configuration options and their associated syntax: # configuration options and their associated syntax:
@@ -36,7 +32,7 @@ services:
# statistics_enabled: false # statistics_enabled: false
hmac_key: "CHANGE_ME!!" hmac_key: "CHANGE_ME!!"
healthcheck: healthcheck:
test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/stats || exit 1 test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/trending || exit 1
interval: 30s interval: 30s
timeout: 5s timeout: 5s
retries: 2 retries: 2

View File

@@ -1,29 +1,6 @@
# https://github.com/openssl/openssl/releases/tag/openssl-3.5.2 FROM crystallang/crystal:1.12.1-alpine AS builder
ARG OPENSSL_VERSION='3.5.2'
ARG OPENSSL_SHA256='c53a47e5e441c930c3928cf7bf6fb00e5d129b630e0aa873b08258656e7345ec'
FROM crystallang/crystal:1.16.3-alpine AS dependabot-crystal
# We compile openssl ourselves due to a memory leak in how crystal interacts
# with openssl
# Reference: https://github.com/iv-org/invidious/issues/1438#issuecomment-3087636228
FROM dependabot-crystal AS openssl-builder
RUN apk add --no-cache curl perl linux-headers
WORKDIR /
ARG OPENSSL_VERSION
ARG OPENSSL_SHA256
RUN curl -Ls "https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz" --output openssl-${OPENSSL_VERSION}.tar.gz
RUN echo "${OPENSSL_SHA256} openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c
RUN tar -xzvf openssl-${OPENSSL_VERSION}.tar.gz
RUN cd openssl-${OPENSSL_VERSION} && ./Configure --openssldir=/etc/ssl && make -j$(nproc)
FROM dependabot-crystal AS builder
RUN apk add --no-cache sqlite-static yaml-static RUN apk add --no-cache sqlite-static yaml-static
RUN apk del openssl-dev openssl-libs-static
ARG release ARG release
@@ -44,25 +21,19 @@ COPY ./videojs-dependencies.yml ./videojs-dependencies.yml
RUN crystal spec --warnings all \ RUN crystal spec --warnings all \
--link-flags "-lxml2 -llzma" --link-flags "-lxml2 -llzma"
RUN if [[ "${release}" == 1 ]] ; then \
ARG OPENSSL_VERSION
COPY --from=openssl-builder /openssl-${OPENSSL_VERSION} /openssl-${OPENSSL_VERSION}
RUN --mount=type=cache,target=/root/.cache/crystal if [[ "${release}" == 1 ]] ; then \
PKG_CONFIG_PATH=/openssl-${OPENSSL_VERSION} \
crystal build ./src/invidious.cr \ crystal build ./src/invidious.cr \
--release \ --release \
--static --warnings all \ --static --warnings all \
--link-flags "-lxml2 -llzma"; \ --link-flags "-lxml2 -llzma"; \
else \ else \
PKG_CONFIG_PATH=/openssl-${OPENSSL_VERSION} \
crystal build ./src/invidious.cr \ crystal build ./src/invidious.cr \
--static --warnings all \ --static --warnings all \
--link-flags "-lxml2 -llzma"; \ --link-flags "-lxml2 -llzma"; \
fi fi
FROM alpine:3.23 FROM alpine:3.18
RUN apk add --no-cache rsvg-convert ttf-opensans tini tzdata RUN apk add --no-cache rsvg-convert ttf-opensans tini
WORKDIR /invidious WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \ RUN addgroup -g 1000 -S invidious && \
adduser -u 1000 -S invidious -G invidious adduser -u 1000 -S invidious -G invidious

View File

@@ -1,31 +1,5 @@
# https://github.com/openssl/openssl/releases/tag/openssl-3.5.2 FROM alpine:3.19 AS builder
ARG OPENSSL_VERSION='3.5.2' RUN apk add --no-cache 'crystal=1.10.1-r0' shards sqlite-static yaml-static yaml-dev libxml2-static zlib-static openssl-libs-static openssl-dev musl-dev xz-static
ARG OPENSSL_SHA256='c53a47e5e441c930c3928cf7bf6fb00e5d129b630e0aa873b08258656e7345ec'
FROM alpine:3.22 AS dependabot-alpine
# We compile openssl ourselves due to a memory leak in how crystal interacts
# with openssl
# Reference: https://github.com/iv-org/invidious/issues/1438#issuecomment-3087636228
FROM dependabot-alpine AS openssl-builder
RUN apk add --no-cache curl perl linux-headers build-base
WORKDIR /
ARG OPENSSL_VERSION
ARG OPENSSL_SHA256
RUN curl -Ls "https://github.com/openssl/openssl/releases/download/openssl-${OPENSSL_VERSION}/openssl-${OPENSSL_VERSION}.tar.gz" --output openssl-${OPENSSL_VERSION}.tar.gz
RUN echo "${OPENSSL_SHA256} openssl-${OPENSSL_VERSION}.tar.gz" | sha256sum -c
RUN tar -xzvf openssl-${OPENSSL_VERSION}.tar.gz
RUN cd openssl-${OPENSSL_VERSION} && ./Configure --openssldir=/etc/ssl && make -j$(nproc)
FROM dependabot-alpine AS builder
RUN apk add --no-cache 'crystal=1.16.3-r0' shards \
sqlite-static yaml-static yaml-dev \
pcre2-static gc-static \
libxml2-static zlib-static \
openssl-libs-static openssl-dev musl-dev xz-static
ARG release ARG release
@@ -47,24 +21,19 @@ COPY ./videojs-dependencies.yml ./videojs-dependencies.yml
RUN crystal spec --warnings all \ RUN crystal spec --warnings all \
--link-flags "-lxml2 -llzma" --link-flags "-lxml2 -llzma"
ARG OPENSSL_VERSION RUN if [[ "${release}" == 1 ]] ; then \
COPY --from=openssl-builder /openssl-${OPENSSL_VERSION} /openssl-${OPENSSL_VERSION}
RUN --mount=type=cache,target=/root/.cache/crystal if [[ "${release}" == 1 ]] ; then \
PKG_CONFIG_PATH=/openssl-${OPENSSL_VERSION} \
crystal build ./src/invidious.cr \ crystal build ./src/invidious.cr \
--release \ --release \
--static --warnings all \ --static --warnings all \
--link-flags "-lxml2 -llzma"; \ --link-flags "-lxml2 -llzma"; \
else \ else \
PKG_CONFIG_PATH=/openssl-${OPENSSL_VERSION} \
crystal build ./src/invidious.cr \ crystal build ./src/invidious.cr \
--static --warnings all \ --static --warnings all \
--link-flags "-lxml2 -llzma"; \ --link-flags "-lxml2 -llzma"; \
fi fi
FROM alpine:3.22 FROM alpine:3.18
RUN apk add --no-cache rsvg-convert ttf-opensans tini tzdata RUN apk add --no-cache rsvg-convert ttf-opensans tini
WORKDIR /invidious WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \ RUN addgroup -g 1000 -S invidious && \
adduser -u 1000 -S invidious -G invidious adduser -u 1000 -S invidious -G invidious

60
kubernetes/values.yaml Normal file
View File

@@ -0,0 +1,60 @@
name: invidious
image:
repository: quay.io/invidious/invidious
tag: latest
pullPolicy: Always
replicaCount: 1
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 16
targetCPUUtilizationPercentage: 50
service:
type: ClusterIP
port: 3000
#loadBalancerIP:
resources: {}
#requests:
# cpu: 100m
# memory: 64Mi
#limits:
# cpu: 800m
# memory: 512Mi
securityContext:
allowPrivilegeEscalation: false
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
# See https://github.com/bitnami/charts/tree/master/bitnami/postgresql
postgresql:
image:
tag: 13
auth:
username: kemal
password: kemal
database: invidious
primary:
initdb:
username: kemal
password: kemal
scriptsConfigMap: invidious-postgresql-init
# Adapted from ../config/config.yml
config:
channel_threads: 1
db:
user: kemal
password: kemal
host: invidious-postgresql
port: 5432
dbname: invidious
full_refresh: false
https_only: false
domain:

View File

@@ -39,6 +39,8 @@
"User ID": "مُعرِّف المُستخدم", "User ID": "مُعرِّف المُستخدم",
"Password": "كلمة المرور", "Password": "كلمة المرور",
"Time (h:mm:ss):": "الوقت (h:mm:ss):", "Time (h:mm:ss):": "الوقت (h:mm:ss):",
"Text CAPTCHA": "نص الكابتشا",
"Image CAPTCHA": "صورة الكابتشا",
"Sign In": "إنشاء حساب", "Sign In": "إنشاء حساب",
"Register": "التسجيل", "Register": "التسجيل",
"E-mail": "البريد الإلكتروني", "E-mail": "البريد الإلكتروني",
@@ -152,8 +154,8 @@
"View YouTube comments": "عرض تعليقات اليوتيوب", "View YouTube comments": "عرض تعليقات اليوتيوب",
"View more comments on Reddit": "عرض المزيد من التعليقات على\\من موقع ريديت", "View more comments on Reddit": "عرض المزيد من التعليقات على\\من موقع ريديت",
"View `x` comments": { "View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "عرض `x` تعليق", "([^.,0-9]|^)1([^.,0-9]|$)": "عرض `x` تعليقات",
"": "عرض `x` تعليقات" "": "عرض `x` تعليقات."
}, },
"View Reddit comments": "عرض تعليقات ريديت", "View Reddit comments": "عرض تعليقات ريديت",
"Hide replies": "إخفاء الردود", "Hide replies": "إخفاء الردود",
@@ -481,7 +483,7 @@
"comments_view_x_replies_3": "عرض رد {{count}}", "comments_view_x_replies_3": "عرض رد {{count}}",
"comments_view_x_replies_4": "عرض الردود {{count}}", "comments_view_x_replies_4": "عرض الردود {{count}}",
"comments_view_x_replies_5": "عرض رد {{count}}", "comments_view_x_replies_5": "عرض رد {{count}}",
"search_message_use_another_instance": "يمكنك أيضًا البحث عن <a href=\"`x`\"> في مثيل آخر </a>.", "search_message_use_another_instance": " يمكنك أيضًا البحث عن <a href=\"`x`\"> في مثيل آخر </a>.",
"comments_points_count_0": "{{count}} نقطة", "comments_points_count_0": "{{count}} نقطة",
"comments_points_count_1": "نقطة واحدة", "comments_points_count_1": "نقطة واحدة",
"comments_points_count_2": "نقطتان", "comments_points_count_2": "نقطتان",
@@ -557,18 +559,10 @@
"toggle_theme": "تبديل الموضوع", "toggle_theme": "تبديل الموضوع",
"Add to playlist": "أضف إلى قائمة التشغيل", "Add to playlist": "أضف إلى قائمة التشغيل",
"Add to playlist: ": "أضف إلى قائمة التشغيل: ", "Add to playlist: ": "أضف إلى قائمة التشغيل: ",
"Answer": "اجابة", "Answer": "الرد",
"Search for videos": "ابحث عن مقاطع الفيديو", "Search for videos": "ابحث عن مقاطع الفيديو",
"The Popular feed has been disabled by the administrator.": "تم تعطيل الخلاصة الشائعة من قبل المسؤول.", "The Popular feed has been disabled by the administrator.": "تم تعطيل الخلاصة الشائعة من قبل المسؤول.",
"carousel_slide": "الشريحة {{current}} من {{total}}", "carousel_slide": "الشريحة {{current}} من {{total}}",
"carousel_skip": "تخطي الكاروسيل", "carousel_skip": "تخطي الكاروسيل",
"carousel_go_to": "انتقل إلى الشريحة `x`", "carousel_go_to": "انتقل إلى الشريحة `x`"
"preferences_preload_label": "التحميل المسبق لبيانات الفيديو: ",
"Filipino (auto-generated)": "الفلبينية (المولدة تلقائيًا)",
"channel_tab_courses_label": "الدورات",
"channel_tab_posts_label": "المنشورات",
"First page": "الصفحة الأولى",
"timeline_parse_error_placeholder_heading": "غير قادر على تحليل العنصر",
"timeline_parse_error_placeholder_message": "واجه Invidious خطأ أثناء محاولة تحليل هذا العنصر. لمزيد من المعلومات انظر أدناه:",
"timeline_parse_error_show_technical_details": "عرض التفاصيل التقنية"
} }

View File

@@ -102,6 +102,7 @@
"Spanish (Spain)": "Испански (Испания)", "Spanish (Spain)": "Испански (Испания)",
"invidious": "Invidious", "invidious": "Invidious",
"crash_page_refresh": "пробвал да <a href=\"`x`\">опресниш страницата</a>", "crash_page_refresh": "пробвал да <a href=\"`x`\">опресниш страницата</a>",
"Image CAPTCHA": "CAPTCHA с Изображение",
"search_filters_features_option_hd": "HD", "search_filters_features_option_hd": "HD",
"Chinese (Hong Kong)": "Китайски (Хонг Конг)", "Chinese (Hong Kong)": "Китайски (Хонг Конг)",
"Import Invidious data": "Импортиране на Invidious JSON информацията", "Import Invidious data": "Импортиране на Invidious JSON информацията",
@@ -402,7 +403,7 @@
"comments_view_x_replies": "Виж {{count}} отговор", "comments_view_x_replies": "Виж {{count}} отговор",
"comments_view_x_replies_plural": "Виж {{count}} отговора", "comments_view_x_replies_plural": "Виж {{count}} отговора",
"footer_original_source_code": "Оригинален изходен код", "footer_original_source_code": "Оригинален изходен код",
"Import YouTube subscriptions": "Импортиране на YouTube-CSV/OPML абонаменти", "Import YouTube subscriptions": "Импортиране на YouTube/OPML абонаменти",
"Lithuanian": "Литовски", "Lithuanian": "Литовски",
"Nyanja": "Нянджа", "Nyanja": "Нянджа",
"Updated `x` ago": "Актуализирано преди `x`", "Updated `x` ago": "Актуализирано преди `x`",
@@ -456,6 +457,7 @@
"next_steps_error_message": "След което можеш да пробваш да: ", "next_steps_error_message": "След което можеш да пробваш да: ",
"Hide annotations": "Скрий анотации", "Hide annotations": "Скрий анотации",
"Standard YouTube license": "Стандартен YouTube лиценз", "Standard YouTube license": "Стандартен YouTube лиценз",
"Text CAPTCHA": "Текст CAPTCHA",
"Log in/register": "Вход/регистрация", "Log in/register": "Вход/регистрация",
"Punjabi": "Пенджаби", "Punjabi": "Пенджаби",
"Change password": "Смяна на паролата", "Change password": "Смяна на паролата",
@@ -491,8 +493,5 @@
"Add to playlist: ": "Добави към плейлист: ", "Add to playlist: ": "Добави към плейлист: ",
"Answer": "Отговор", "Answer": "Отговор",
"Search for videos": "Търсене на видеа", "Search for videos": "Търсене на видеа",
"The Popular feed has been disabled by the administrator.": "Популярната страница е деактивирана от администратора.", "The Popular feed has been disabled by the administrator.": "Популярната страница е деактивирана от администратора."
"Filipino (auto-generated)": "Филипински (автоматично генериран)",
"preferences_preload_label": "Предварително заредете видео данни: ",
"First page": "Първа страница"
} }

View File

@@ -36,6 +36,8 @@
"User ID": "ইউজার আইডি", "User ID": "ইউজার আইডি",
"Password": "পাসওয়ার্ড", "Password": "পাসওয়ার্ড",
"Time (h:mm:ss):": "সময় (ঘণ্টা:মিনিট:সেকেন্ড):", "Time (h:mm:ss):": "সময় (ঘণ্টা:মিনিট:সেকেন্ড):",
"Text CAPTCHA": "টেক্সট ক্যাপচা",
"Image CAPTCHA": "চিত্র ক্যাপচা",
"Sign In": "সাইন ইন", "Sign In": "সাইন ইন",
"Register": "নিবন্ধন", "Register": "নিবন্ধন",
"E-mail": "ই-মেইল", "E-mail": "ই-মেইল",

View File

@@ -39,6 +39,8 @@
"User ID": "ইউজার আইডি", "User ID": "ইউজার আইডি",
"Password": "পাসওয়ার্ড", "Password": "পাসওয়ার্ড",
"Time (h:mm:ss):": "সময় (ঘণ্টা:মিনিট:সেকেন্ড):", "Time (h:mm:ss):": "সময় (ঘণ্টা:মিনিট:সেকেন্ড):",
"Text CAPTCHA": "টেক্সট ক্যাপচা",
"Image CAPTCHA": "চিত্র ক্যাপচা",
"Sign In": "সাইন ইন", "Sign In": "সাইন ইন",
"Register": "নিবন্ধন", "Register": "নিবন্ধন",
"E-mail": "ই-মেইল", "E-mail": "ই-মেইল",

View File

@@ -167,6 +167,7 @@
"comments_points_count_plural": "{{count}} punts", "comments_points_count_plural": "{{count}} punts",
"%A %B %-d, %Y": "%A %B %-d, %Y", "%A %B %-d, %Y": "%A %B %-d, %Y",
"Create playlist": "Crear llista de reproducció", "Create playlist": "Crear llista de reproducció",
"Text CAPTCHA": "Text CAPTCHA",
"Next page": "Pàgina següent", "Next page": "Pàgina següent",
"preferences_category_visual": "Preferències visuals", "preferences_category_visual": "Preferències visuals",
"preferences_unseen_only_label": "Mostra només no vistos: ", "preferences_unseen_only_label": "Mostra només no vistos: ",
@@ -203,7 +204,7 @@
"View JavaScript license information.": "Consulta la informació de la llicència de JavaScript.", "View JavaScript license information.": "Consulta la informació de la llicència de JavaScript.",
"Playlist privacy": "Privacitat de la llista de reproducció", "Playlist privacy": "Privacitat de la llista de reproducció",
"search_message_no_results": "No s'han trobat resultats.", "search_message_no_results": "No s'han trobat resultats.",
"search_message_use_another_instance": "També es pot <a href=\"`x`\">cercar en una altra instància</a>.", "search_message_use_another_instance": " També es pot <a href=\"`x`\">buscar en una altra instància</a>.",
"Genre: ": "Gènere: ", "Genre: ": "Gènere: ",
"Hidden field \"challenge\" is a required field": "El camp ocult \"repte\" és un camp obligatori", "Hidden field \"challenge\" is a required field": "El camp ocult \"repte\" és un camp obligatori",
"Burmese": "Birmà", "Burmese": "Birmà",
@@ -386,6 +387,7 @@
"Delete account?": "Esborrar compte?", "Delete account?": "Esborrar compte?",
"Please log in": "Si us plau inicieu sessió", "Please log in": "Si us plau inicieu sessió",
"Import NewPipe data (.zip)": "Importar dades de NewPipe (.zip)", "Import NewPipe data (.zip)": "Importar dades de NewPipe (.zip)",
"Image CAPTCHA": "Imatge CAPTCHA",
"channel_tab_streams_label": "Transmissions en directe", "channel_tab_streams_label": "Transmissions en directe",
"preferences_category_misc": "Preferències diverses", "preferences_category_misc": "Preferències diverses",
"preferences_annotations_subscribed_label": "Mostra les anotacions per defecte dels canals subscrits? ", "preferences_annotations_subscribed_label": "Mostra les anotacions per defecte dels canals subscrits? ",
@@ -487,16 +489,5 @@
"generic_button_delete": "Suprimeix", "generic_button_delete": "Suprimeix",
"Import YouTube watch history (.json)": "Importa l'historial de visualitzacions de YouTube (.json)", "Import YouTube watch history (.json)": "Importa l'historial de visualitzacions de YouTube (.json)",
"Answer": "Resposta", "Answer": "Resposta",
"toggle_theme": "Commuta el tema", "toggle_theme": "Commuta el tema"
"Add to playlist": "Afegeix a la llista de reproducció",
"Add to playlist: ": "Afegeix a la llista de reproducció: ",
"Search for videos": "Cercar vídeos",
"carousel_slide": "Diapositiva {{current}} de {{total}}",
"preferences_preload_label": "Precarregar dades del vídeo: ",
"carousel_go_to": "Anar a la diapositiva `x`",
"First page": "Primera pàgina",
"Filipino (auto-generated)": "Filipí (generat automàticament)",
"channel_tab_courses_label": "Cursos",
"channel_tab_posts_label": "Missatges",
"carousel_skip": "Saltar l'exhibició"
} }

View File

@@ -39,6 +39,8 @@
"User ID": "ID uživatele", "User ID": "ID uživatele",
"Password": "Heslo", "Password": "Heslo",
"Time (h:mm:ss):": "Čas (h:mm:ss):", "Time (h:mm:ss):": "Čas (h:mm:ss):",
"Text CAPTCHA": "Textové CAPTCHA",
"Image CAPTCHA": "Obrázkové CAPTCHA",
"Sign In": "Přihlásit se", "Sign In": "Přihlásit se",
"Register": "Vytvořit účet", "Register": "Vytvořit účet",
"E-mail": "E-mail", "E-mail": "E-mail",
@@ -135,7 +137,7 @@
"Family friendly? ": "Vhodné pro rodiny? ", "Family friendly? ": "Vhodné pro rodiny? ",
"Engagement: ": "Zapojení: ", "Engagement: ": "Zapojení: ",
"English": "Angličtina", "English": "Angličtina",
"English (auto-generated)": "Angličtina (vytvořeno automaticky)", "English (auto-generated)": "Angličtina (automaticky generováno)",
"Afrikaans": "Afrikánština", "Afrikaans": "Afrikánština",
"Albanian": "Albánština", "Albanian": "Albánština",
"Amharic": "Amharština", "Amharic": "Amharština",
@@ -292,8 +294,8 @@
"Chinese (China)": "Čínština (Čína)", "Chinese (China)": "Čínština (Čína)",
"Chinese (Hong Kong)": "Čínština (Hong Kong)", "Chinese (Hong Kong)": "Čínština (Hong Kong)",
"Chinese (Taiwan)": "Čínština (Taiwan)", "Chinese (Taiwan)": "Čínština (Taiwan)",
"Portuguese (auto-generated)": "Portugalština (vytvořeno automaticky)", "Portuguese (auto-generated)": "Portugalština (automaticky generováno)",
"Spanish (auto-generated)": "Španělština (vytvořeno automaticky)", "Spanish (auto-generated)": "Španělština (automaticky generováno)",
"Spanish (Mexico)": "Španělština (Mexiko)", "Spanish (Mexico)": "Španělština (Mexiko)",
"Spanish (Spain)": "Španělština (Španělsko)", "Spanish (Spain)": "Španělština (Španělsko)",
"generic_count_years_0": "{{count}} rokem", "generic_count_years_0": "{{count}} rokem",
@@ -350,13 +352,13 @@
"comments_points_count_0": "{{count}} bod", "comments_points_count_0": "{{count}} bod",
"comments_points_count_1": "{{count}} body", "comments_points_count_1": "{{count}} body",
"comments_points_count_2": "{{count}} bodů", "comments_points_count_2": "{{count}} bodů",
"German (auto-generated)": "Němčina (vytvořeno automaticky)", "German (auto-generated)": "Němčina (automaticky generováno)",
"Indonesian (auto-generated)": "Indonéština (vytvořeno automaticky)", "Indonesian (auto-generated)": "Indonéština (automaticky generováno)",
"Interlingue": "Interlingue", "Interlingue": "Interlingue",
"Italian (auto-generated)": "Italština (vytvořeno automaticky)", "Italian (auto-generated)": "Italština (automaticky generováno)",
"Japanese (auto-generated)": "Japonština (vytvořeno automaticky)", "Japanese (auto-generated)": "Japonština (automaticky generováno)",
"Korean (auto-generated)": "Korejština (vytvořeno automaticky)", "Korean (auto-generated)": "Korejština (automaticky generováno)",
"Russian (auto-generated)": "Ruština (vytvořeno automaticky)", "Russian (auto-generated)": "Ruština (automaticky generováno)",
"generic_count_months_0": "{{count}} měsícem", "generic_count_months_0": "{{count}} měsícem",
"generic_count_months_1": "{{count}} měsíci", "generic_count_months_1": "{{count}} měsíci",
"generic_count_months_2": "{{count}} měsíci", "generic_count_months_2": "{{count}} měsíci",
@@ -369,7 +371,7 @@
"footer_documentation": "Dokumentace", "footer_documentation": "Dokumentace",
"next_steps_error_message_refresh": "Obnovit stránku", "next_steps_error_message_refresh": "Obnovit stránku",
"Chinese": "Čínština", "Chinese": "Čínština",
"Dutch (auto-generated)": "Nizozemština (vytvořeno automaticky)", "Dutch (auto-generated)": "Nizozemština (automaticky generováno)",
"Erroneous token": "Chybný token", "Erroneous token": "Chybný token",
"tokens_count_0": "{{count}} token", "tokens_count_0": "{{count}} token",
"tokens_count_1": "{{count}} tokeny", "tokens_count_1": "{{count}} tokeny",
@@ -378,9 +380,9 @@
"Token is expired, please try again": "Token vypršel, zkuste to prosím znovu", "Token is expired, please try again": "Token vypršel, zkuste to prosím znovu",
"English (United States)": "Angličtina (Spojené státy)", "English (United States)": "Angličtina (Spojené státy)",
"Cantonese (Hong Kong)": "Kantonština (Hong Kong)", "Cantonese (Hong Kong)": "Kantonština (Hong Kong)",
"French (auto-generated)": "Francouzština (vytvořeno automaticky)", "French (auto-generated)": "Francouzština (automaticky generováno)",
"Turkish (auto-generated)": "Turečtina (vytvořeno automaticky)", "Turkish (auto-generated)": "Turečtina (automaticky generováno)",
"Vietnamese (auto-generated)": "Vietnamština (vytvořeno automaticky)", "Vietnamese (auto-generated)": "Vietnamština (automaticky generováno)",
"Current version: ": "Aktuální verze: ", "Current version: ": "Aktuální verze: ",
"next_steps_error_message": "Měli byste zkusit: ", "next_steps_error_message": "Měli byste zkusit: ",
"footer_donate_page": "Přispět", "footer_donate_page": "Přispět",
@@ -469,7 +471,7 @@
"search_filters_title": "Filtry", "search_filters_title": "Filtry",
"search_filters_duration_option_medium": "Střední (4 - 20 minut)", "search_filters_duration_option_medium": "Střední (4 - 20 minut)",
"search_filters_duration_option_long": "Dlouhá (> 20 minut)", "search_filters_duration_option_long": "Dlouhá (> 20 minut)",
"search_message_use_another_instance": "Můžete také <a href=\"`x`\">hledat na jiné instanci</a>.", "search_message_use_another_instance": " Můžete také <a href=\"`x`\">hledat na jiné instanci</a>.",
"search_filters_features_label": "Vlastnosti", "search_filters_features_label": "Vlastnosti",
"search_filters_features_option_three_sixty": "360°", "search_filters_features_option_three_sixty": "360°",
"search_filters_features_option_vr180": "VR180", "search_filters_features_option_vr180": "VR180",
@@ -511,15 +513,5 @@
"The Popular feed has been disabled by the administrator.": "Kategorie Populární byla zakázána administrátorem.", "The Popular feed has been disabled by the administrator.": "Kategorie Populární byla zakázána administrátorem.",
"carousel_slide": "Snímek {{current}} z {{total}}", "carousel_slide": "Snímek {{current}} z {{total}}",
"carousel_skip": "Přeskočit galerii", "carousel_skip": "Přeskočit galerii",
"carousel_go_to": "Přejít na snímek `x`", "carousel_go_to": "Přejít na snímek `x`"
"preferences_preload_label": "Předem načíst data videa: ",
"Filipino (auto-generated)": "Filipínština (vytvořeno automaticky)",
"First page": "První stránka",
"channel_tab_courses_label": "Kurzy",
"channel_tab_posts_label": "Příspěvky",
"timeline_parse_error_show_technical_details": "Zobrazit technické podrobnosti",
"timeline_parse_error_placeholder_message": "Invidious narazil při pokusu o zpracování této položky na chybu. Další informace naleznete níže:",
"timeline_parse_error_placeholder_heading": "Nepodařilo se zpracovat položku",
"preferences_default_playlist": "Výchozí playlist: ",
"preferences_default_playlist_none": "Nenastaven žádný výchozí playlist"
} }

View File

@@ -141,7 +141,7 @@
"An alternative front-end to YouTube": "Pen blaen amgen i YouTube", "An alternative front-end to YouTube": "Pen blaen amgen i YouTube",
"source": "ffynhonnell", "source": "ffynhonnell",
"Log in": "Mewngofnodi", "Log in": "Mewngofnodi",
"Log in/register": "Mewngofnodi/cofrestru", "Log in/register": "Mewngofnodi/Cofrestru",
"User ID": "Enw defnyddiwr", "User ID": "Enw defnyddiwr",
"preferences_quality_option_dash": "DASH (ansawdd addasol)", "preferences_quality_option_dash": "DASH (ansawdd addasol)",
"Sign In": "Mewngofnodi", "Sign In": "Mewngofnodi",
@@ -162,6 +162,8 @@
"preferences_quality_dash_option_1080p": "1080p", "preferences_quality_dash_option_1080p": "1080p",
"preferences_quality_dash_option_720p": "720p", "preferences_quality_dash_option_720p": "720p",
"invidious": "Invidious", "invidious": "Invidious",
"Text CAPTCHA": "CAPTCHA testun",
"Image CAPTCHA": "CAPTCHA delwedd",
"preferences_continue_label": "Chwarae'r fideo nesaf fel rhagosodiad: ", "preferences_continue_label": "Chwarae'r fideo nesaf fel rhagosodiad: ",
"preferences_continue_autoplay_label": "Chwarae'r fideo nesaf yn awtomatig: ", "preferences_continue_autoplay_label": "Chwarae'r fideo nesaf yn awtomatig: ",
"preferences_listen_label": "Sain yn unig: ", "preferences_listen_label": "Sain yn unig: ",
@@ -379,32 +381,5 @@
"channel_tab_channels_label": "Sianeli", "channel_tab_channels_label": "Sianeli",
"channel_tab_community_label": "Cymuned", "channel_tab_community_label": "Cymuned",
"channel_tab_shorts_label": "Fideos byrion", "channel_tab_shorts_label": "Fideos byrion",
"channel_tab_videos_label": "Fideos", "channel_tab_videos_label": "Fideos"
"generic_playlists_count_0": "{{count}} rhestr chwarae",
"generic_playlists_count_1": "{{count}} rhestr chwarae",
"generic_playlists_count_2": "{{count}} rhestri chwarae",
"generic_playlists_count_3": "{{count}} rhestri chwarae",
"generic_playlists_count_4": "{{count}} rhestri chwarae",
"generic_playlists_count_5": "{{count}} rhestri chwarae",
"New passwords must match": "Rhaid i'r cyfrineiriau newydd cyfateb â'i gilydd",
"last": "diwethaf",
"First page": "Tudalen gyntaf",
"preferences_preload_label": "Cynlwytho data fideo: ",
"preferences_extend_desc_label": "Ymestyn disgrifiad fideo'n awtomatig: ",
"preferences_vr_mode_label": "Fideos rhyngweithiol 360 gradd (angen WebGL): ",
"preferences_video_loop_label": "Doleniwch bob amser: ",
"Top enabled: ": "Tudalen fideos brig wedi'i alluogi: ",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Allforio tanysgrifiadau ar fformat OPML (i NewPipe a FreeTube)",
"Export subscriptions as OPML": "Allforio tanysgrifiadau ar fformat OPML",
"preferences_annotations_subscribed_label": "Ddangos nodiadau sianeli tanysgrifiwyd fel rhagosodiad? ",
"Redirect homepage to feed: ": "Ailgyfeirio tudalen gartref i'r borthiant: ",
"preferences_feed_menu_label": "Dewislen porthiant: ",
"Login enabled: ": "Mewngofnodi wedi'i alluogi: ",
"tokens_count_0": "",
"tokens_count_1": "tocyn",
"tokens_count_2": "",
"tokens_count_3": "",
"tokens_count_4": "tocynnau",
"tokens_count_5": "",
"Source available here.": "Tarddle ar gael yma."
} }

View File

@@ -39,6 +39,8 @@
"User ID": "Bruger ID", "User ID": "Bruger ID",
"Password": "Kodeord", "Password": "Kodeord",
"Time (h:mm:ss):": "Tid (t:mm:ss):", "Time (h:mm:ss):": "Tid (t:mm:ss):",
"Text CAPTCHA": "Tekst CAPTCHA",
"Image CAPTCHA": "Billede CAPTCHA",
"Sign In": "Log ind", "Sign In": "Log ind",
"Register": "Registrer", "Register": "Registrer",
"E-mail": "E-mail", "E-mail": "E-mail",

View File

@@ -11,8 +11,7 @@
"last": "neueste", "last": "neueste",
"Next page": "Nächste Seite", "Next page": "Nächste Seite",
"Previous page": "Vorherige Seite", "Previous page": "Vorherige Seite",
"First page": "Erste Seite", "Clear watch history?": "Verlauf löschen?",
"Clear watch history?": "Wiedergabeverlauf löschen?",
"New password": "Neues Passwort", "New password": "Neues Passwort",
"New passwords must match": "Neue Passwörter müssen übereinstimmen", "New passwords must match": "Neue Passwörter müssen übereinstimmen",
"Authorize token?": "Token autorisieren?", "Authorize token?": "Token autorisieren?",
@@ -40,13 +39,14 @@
"User ID": "Benutzer-ID", "User ID": "Benutzer-ID",
"Password": "Passwort", "Password": "Passwort",
"Time (h:mm:ss):": "Zeit (h:mm:ss):", "Time (h:mm:ss):": "Zeit (h:mm:ss):",
"Text CAPTCHA": "Text CAPTCHA",
"Image CAPTCHA": "Bild CAPTCHA",
"Sign In": "Anmelden", "Sign In": "Anmelden",
"Register": "Registrieren", "Register": "Registrieren",
"E-mail": "E-Mail", "E-mail": "E-Mail",
"Preferences": "Einstellungen", "Preferences": "Einstellungen",
"preferences_category_player": "Wiedergabeeinstellungen", "preferences_category_player": "Wiedergabeeinstellungen",
"preferences_video_loop_label": "Immer wiederholen: ", "preferences_video_loop_label": "Immer wiederholen: ",
"preferences_preload_label": "Videodaten vorladen: ",
"preferences_autoplay_label": "Automatisch abspielen: ", "preferences_autoplay_label": "Automatisch abspielen: ",
"preferences_continue_label": "Immer automatisch nächstes Video abspielen: ", "preferences_continue_label": "Immer automatisch nächstes Video abspielen: ",
"preferences_continue_autoplay_label": "Nächstes Video automatisch abspielen: ", "preferences_continue_autoplay_label": "Nächstes Video automatisch abspielen: ",
@@ -106,11 +106,11 @@
"Top enabled: ": "Top aktiviert? ", "Top enabled: ": "Top aktiviert? ",
"CAPTCHA enabled: ": "CAPTCHA aktiviert? ", "CAPTCHA enabled: ": "CAPTCHA aktiviert? ",
"Login enabled: ": "Anmeldung aktiviert: ", "Login enabled: ": "Anmeldung aktiviert: ",
"Registration enabled: ": "Registrierung aktiviert: ", "Registration enabled: ": "Registrierung aktiviert? ",
"Report statistics: ": "Statistiken berichten: ", "Report statistics: ": "Statistiken berichten? ",
"Save preferences": "Einstellungen speichern", "Save preferences": "Einstellungen speichern",
"Subscription manager": "Abonnementverwaltung", "Subscription manager": "Abonnementverwaltung",
"Token manager": "Tokenverwaltung", "Token manager": "Tokenverwalter",
"Token": "Token", "Token": "Token",
"Import/export": "Importieren/Exportieren", "Import/export": "Importieren/Exportieren",
"unsubscribe": "abbestellen", "unsubscribe": "abbestellen",
@@ -120,20 +120,20 @@
"Log out": "Abmelden", "Log out": "Abmelden",
"Released under the AGPLv3 on Github.": "Auf GitHub unter der AGPLv3 Lizenz veröffentlicht.", "Released under the AGPLv3 on Github.": "Auf GitHub unter der AGPLv3 Lizenz veröffentlicht.",
"Source available here.": "Quellcode verfügbar hier.", "Source available here.": "Quellcode verfügbar hier.",
"View JavaScript license information.": "Javascript-Lizenzinformationen anzeigen.", "View JavaScript license information.": "Javascript Lizenzinformationen anzeigen.",
"View privacy policy.": "Datenschutzerklärung einsehen.", "View privacy policy.": "Datenschutzerklärung einsehen.",
"Trending": "Angesagt", "Trending": "Angesagt",
"Public": "Öffentlich", "Public": "Öffentlich",
"Unlisted": "Nicht gelistet", "Unlisted": "Nicht aufgeführt",
"Private": "Privat", "Private": "Privat",
"View all playlists": "Alle Wiedergabelisten anzeigen", "View all playlists": "Alle Wiedergabelisten anzeigen",
"Updated `x` ago": "Aktualisiert vor `x`", "Updated `x` ago": "Aktualisiert `x` vor",
"Delete playlist `x`?": "Wiedergabeliste `x` löschen?", "Delete playlist `x`?": "Wiedergabeliste löschen `x`?",
"Delete playlist": "Wiedergabeliste löschen", "Delete playlist": "Wiedergabeliste löschen",
"Create playlist": "Wiedergabeliste erstellen", "Create playlist": "Wiedergabeliste erstellen",
"Title": "Titel", "Title": "Titel",
"Playlist privacy": "Wiedergabelisten-Privatsphäre", "Playlist privacy": "Vertrauliche Wiedergabeliste",
"Editing playlist `x`": "Wiedergabeliste `x` bearbeiten", "Editing playlist `x`": "Wiedergabeliste bearbeiten `x`",
"Show more": "Mehr anzeigen", "Show more": "Mehr anzeigen",
"Show less": "Weniger anzeigen", "Show less": "Weniger anzeigen",
"Watch on YouTube": "Video auf YouTube ansehen", "Watch on YouTube": "Video auf YouTube ansehen",
@@ -149,12 +149,12 @@
"Blacklisted regions: ": "Unerlaubte Regionen: ", "Blacklisted regions: ": "Unerlaubte Regionen: ",
"Shared `x`": "Geteilt `x`", "Shared `x`": "Geteilt `x`",
"Premieres in `x`": "Premiere in `x`", "Premieres in `x`": "Premiere in `x`",
"Premieres `x`": "Premiere `x`", "Premieres `x`": "Erster Start `x`",
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Hallo! Anscheinend hast du JavaScript deaktiviert. Klicke hier, um Kommentare anzuzeigen, beachte, dass es etwas länger dauern kann, um sie zu laden.", "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Hallo! Anscheinend haben Sie JavaScript deaktiviert. Klicken Sie hier um Kommentare anzuzeigen, beachten sie dass es etwas länger dauern kann um sie zu laden.",
"View YouTube comments": "YouTube Kommentare anzeigen", "View YouTube comments": "YouTube Kommentare anzeigen",
"View more comments on Reddit": "Mehr Kommentare auf Reddit anzeigen", "View more comments on Reddit": "Mehr Kommentare auf Reddit anzeigen",
"View `x` comments": { "View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` Kommentar anzeigen", "([^.,0-9]|^)1([^.,0-9]|$)": "`x` Kommentare anzeigen",
"": "`x` Kommentare anzeigen" "": "`x` Kommentare anzeigen"
}, },
"View Reddit comments": "Reddit Kommentare anzeigen", "View Reddit comments": "Reddit Kommentare anzeigen",
@@ -182,7 +182,7 @@
"Empty playlist": "Wiedergabeliste ist leer", "Empty playlist": "Wiedergabeliste ist leer",
"Not a playlist.": "Ungültige Wiedergabeliste.", "Not a playlist.": "Ungültige Wiedergabeliste.",
"Playlist does not exist.": "Wiedergabeliste existiert nicht.", "Playlist does not exist.": "Wiedergabeliste existiert nicht.",
"Could not pull trending pages.": "Beliebt-Seiten konnten nicht geladen werden.", "Could not pull trending pages.": "Trendenz-Seiten konnten nicht geladen werden.",
"Hidden field \"challenge\" is a required field": "Verstecktes Feld „challenge“ ist eine erforderliche Eingabe", "Hidden field \"challenge\" is a required field": "Verstecktes Feld „challenge“ ist eine erforderliche Eingabe",
"Hidden field \"token\" is a required field": "Verstecktes Feld „token“ ist eine erforderliche Eingabe", "Hidden field \"token\" is a required field": "Verstecktes Feld „token“ ist eine erforderliche Eingabe",
"Erroneous challenge": "Ungültiger Test", "Erroneous challenge": "Ungültiger Test",
@@ -190,7 +190,7 @@
"No such user": "Ungültiger Benutzer", "No such user": "Ungültiger Benutzer",
"Token is expired, please try again": "Token ist abgelaufen, bitte erneut versuchen", "Token is expired, please try again": "Token ist abgelaufen, bitte erneut versuchen",
"English": "Englisch", "English": "Englisch",
"English (auto-generated)": "Englisch (automatisch generiert)", "English (auto-generated)": "Englisch (automatisch erzeugt)",
"Afrikaans": "Afrikaans", "Afrikaans": "Afrikaans",
"Albanian": "Albanisch", "Albanian": "Albanisch",
"Amharic": "Amharisch", "Amharic": "Amharisch",
@@ -311,7 +311,7 @@
"Download": "Herunterladen", "Download": "Herunterladen",
"Download as: ": "Herunterladen als: ", "Download as: ": "Herunterladen als: ",
"%A %B %-d, %Y": "%A %-d %B %Y", "%A %B %-d, %Y": "%A %-d %B %Y",
"(edited)": "(bearbeitet)", "(edited)": "(editiert)",
"YouTube comment permalink": "YouTube-Kommentar Permalink", "YouTube comment permalink": "YouTube-Kommentar Permalink",
"permalink": "Permalink", "permalink": "Permalink",
"`x` marked it with a ❤": "`x` markierte es mit einem ❤", "`x` marked it with a ❤": "`x` markierte es mit einem ❤",
@@ -319,15 +319,15 @@
"Video mode": "Videomodus", "Video mode": "Videomodus",
"channel_tab_videos_label": "Videos", "channel_tab_videos_label": "Videos",
"Playlists": "Wiedergabelisten", "Playlists": "Wiedergabelisten",
"channel_tab_community_label": "Community", "channel_tab_community_label": "Gemeinschaft",
"search_filters_sort_option_relevance": "Relevanz", "search_filters_sort_option_relevance": "Relevanz",
"search_filters_sort_option_rating": "Bewertung", "search_filters_sort_option_rating": "Bewertung",
"search_filters_sort_option_date": "Hochladedatum", "search_filters_sort_option_date": "Datum",
"search_filters_sort_option_views": "Aufrufe", "search_filters_sort_option_views": "Aufrufe",
"search_filters_type_label": "Inhaltstyp", "search_filters_type_label": "Inhaltstyp",
"search_filters_duration_label": "Dauer", "search_filters_duration_label": "Dauer",
"search_filters_features_label": "Eigenschaften", "search_filters_features_label": "Eigenschaften",
"search_filters_sort_label": "Sortieren nach", "search_filters_sort_label": "sortieren",
"search_filters_date_option_hour": "Letzte Stunde", "search_filters_date_option_hour": "Letzte Stunde",
"search_filters_date_option_today": "Heute", "search_filters_date_option_today": "Heute",
"search_filters_date_option_week": "Diese Woche", "search_filters_date_option_week": "Diese Woche",
@@ -339,7 +339,7 @@
"search_filters_type_option_movie": "Film", "search_filters_type_option_movie": "Film",
"search_filters_type_option_show": "Anzeigen", "search_filters_type_option_show": "Anzeigen",
"search_filters_features_option_hd": "HD", "search_filters_features_option_hd": "HD",
"search_filters_features_option_subtitles": "Untertitel/CC", "search_filters_features_option_subtitles": "Untertitel / CC",
"search_filters_features_option_c_commons": "Creative Commons", "search_filters_features_option_c_commons": "Creative Commons",
"search_filters_features_option_three_d": "3D", "search_filters_features_option_three_d": "3D",
"search_filters_features_option_live": "Live", "search_filters_features_option_live": "Live",
@@ -356,7 +356,7 @@
"footer_modfied_source_code": "Modifizierter Quellcode", "footer_modfied_source_code": "Modifizierter Quellcode",
"footer_documentation": "Dokumentation", "footer_documentation": "Dokumentation",
"footer_source_code": "Quellcode", "footer_source_code": "Quellcode",
"adminprefs_modified_source_code_url_label": "URL zum Repository des modifizierten Quellcodes", "adminprefs_modified_source_code_url_label": "URL zum Repositorie des modifizierten Quellcodes",
"search_filters_duration_option_short": "Kurz (< 4 Minuten)", "search_filters_duration_option_short": "Kurz (< 4 Minuten)",
"preferences_region_label": "Land der Inhalte: ", "preferences_region_label": "Land der Inhalte: ",
"preferences_quality_option_dash": "DASH (adaptive Qualität)", "preferences_quality_option_dash": "DASH (adaptive Qualität)",
@@ -395,7 +395,7 @@
"generic_videos_count_plural": "{{count}} Videos", "generic_videos_count_plural": "{{count}} Videos",
"subscriptions_unseen_notifs_count": "{{count}} ungesehene Benachrichtung", "subscriptions_unseen_notifs_count": "{{count}} ungesehene Benachrichtung",
"subscriptions_unseen_notifs_count_plural": "{{count}} ungesehene Benachrichtungen", "subscriptions_unseen_notifs_count_plural": "{{count}} ungesehene Benachrichtungen",
"crash_page_refresh": "Versucht hast, <a href=\"`x`\">die Seite neu zu laden</a>", "crash_page_refresh": "Versucht haben, <a href=\"`x`\">die Seite neu zu laden</a>",
"comments_view_x_replies": "{{count}} Antwort anzeigen", "comments_view_x_replies": "{{count}} Antwort anzeigen",
"comments_view_x_replies_plural": "{{count}} Antworten anzeigen", "comments_view_x_replies_plural": "{{count}} Antworten anzeigen",
"generic_count_years": "{{count}} Jahr", "generic_count_years": "{{count}} Jahr",
@@ -404,15 +404,15 @@
"generic_count_weeks_plural": "{{count}} Wochen", "generic_count_weeks_plural": "{{count}} Wochen",
"generic_count_days": "{{count}} Tag", "generic_count_days": "{{count}} Tag",
"generic_count_days_plural": "{{count}} Tage", "generic_count_days_plural": "{{count}} Tage",
"crash_page_before_reporting": "Bevor du einen Bug meldest, stelle sicher, dass du:", "crash_page_before_reporting": "Bevor Sie einen Bug melden, stellen Sie sicher, dass Sie:",
"crash_page_switch_instance": "Eine <a href=\"`x`\">andere Instanz</a> versucht hast", "crash_page_switch_instance": "Eine <a href=\"`x`\">andere Instanz</a> versucht haben",
"generic_count_hours": "{{count}} Stunde", "generic_count_hours": "{{count}} Stunde",
"generic_count_hours_plural": "{{count}} Stunden", "generic_count_hours_plural": "{{count}} Stunden",
"generic_count_minutes": "{{count}} Minute", "generic_count_minutes": "{{count}} Minute",
"generic_count_minutes_plural": "{{count}} Minuten", "generic_count_minutes_plural": "{{count}} Minuten",
"crash_page_read_the_faq": "Das <a href=\"`x`\">FAQ</a> gelesen hast", "crash_page_read_the_faq": "Das <a href=\"`x`\">FAQ</a> gelesen haben",
"crash_page_search_issue": "Nach <a href=\"`x`\">bereits gemeldeten Bugs auf GitHub</a> gesucht hast", "crash_page_search_issue": "Nach <a href=\"`x`\">bereits gemeldeten Bugs auf GitHub</a> gesucht haben",
"crash_page_report_issue": "Wenn all dies nicht geholfen hat, <a href=\"`x`\">öffne bitte ein neues Problem (issue) auf GitHub</a> (vorzugsweise auf Englisch) und füge den folgenden Text in deine Nachricht ein (bitte übersetze diesen Text NICHT):", "crash_page_report_issue": "Wenn all dies nicht geholfen hat, <a href=\"`x`\">öffnen Sie bitte ein neues Problem (issue) auf Github</a> (vorzugsweise auf Englisch) und fügen Sie den folgenden Text in Ihre Nachricht ein (bitte übersetzen Sie diesen Text NICHT):",
"generic_views_count": "{{count}} Aufruf", "generic_views_count": "{{count}} Aufruf",
"generic_views_count_plural": "{{count}} Aufrufe", "generic_views_count_plural": "{{count}} Aufrufe",
"generic_count_seconds": "{{count}} Sekunde", "generic_count_seconds": "{{count}} Sekunde",
@@ -423,7 +423,7 @@
"tokens_count_plural": "{{count}} Tokens", "tokens_count_plural": "{{count}} Tokens",
"comments_points_count": "{{count}} Punkt", "comments_points_count": "{{count}} Punkt",
"comments_points_count_plural": "{{count}} Punkte", "comments_points_count_plural": "{{count}} Punkte",
"crash_page_you_found_a_bug": "Anscheinend hast du einen Fehler in Invidious gefunden!", "crash_page_you_found_a_bug": "Anscheinend haben Sie einen Fehler in Invidious gefunden!",
"generic_count_months": "{{count}} Monat", "generic_count_months": "{{count}} Monat",
"generic_count_months_plural": "{{count}} Monaten", "generic_count_months_plural": "{{count}} Monaten",
"Cantonese (Hong Kong)": "Kantonesisch (Hong Kong)", "Cantonese (Hong Kong)": "Kantonesisch (Hong Kong)",
@@ -453,8 +453,8 @@
"Korean (auto-generated)": "Koreanisch (automatisch generiert)", "Korean (auto-generated)": "Koreanisch (automatisch generiert)",
"Portuguese (auto-generated)": "Portugiesisch (automatisch generiert)", "Portuguese (auto-generated)": "Portugiesisch (automatisch generiert)",
"search_filters_title": "Filtern", "search_filters_title": "Filtern",
"search_message_change_filters_or_query": "Versuche, deine Suchanfrage zu erweitern und/oder die Filter zu ändern.", "search_message_change_filters_or_query": "Versuchen Sie, Ihre Suchanfrage zu erweitern und/oder die Filter zu ändern.",
"search_message_use_another_instance": "Du kannst auch <a href=\"`x`\">auf einer anderen Instanz suchen</a>.", "search_message_use_another_instance": " Sie können auch <a href=\"`x`\">auf einer anderen Instanz suchen</a>.",
"Popular enabled: ": "„Beliebt“-Seite aktiviert: ", "Popular enabled: ": "„Beliebt“-Seite aktiviert: ",
"search_message_no_results": "Keine Ergebnisse gefunden.", "search_message_no_results": "Keine Ergebnisse gefunden.",
"search_filters_duration_option_medium": "Mittel (4 - 20 Minuten)", "search_filters_duration_option_medium": "Mittel (4 - 20 Minuten)",
@@ -464,7 +464,7 @@
"search_filters_duration_option_none": "Beliebige Länge", "search_filters_duration_option_none": "Beliebige Länge",
"search_filters_date_label": "Upload-Datum", "search_filters_date_label": "Upload-Datum",
"search_filters_date_option_none": "Beliebiges Datum", "search_filters_date_option_none": "Beliebiges Datum",
"error_video_not_in_playlist": "Das angeforderte Video existiert nicht in dieser Wiedergabeliste. <a href=\"`x`\">Klicke hier, um zur Startseite der Wiedergabeliste zu gelangen.</a>", "error_video_not_in_playlist": "Das angeforderte Video existiert nicht in dieser Wiedergabeliste. <a href=\"`x`\">Klicken Sie hier, um zur Startseite der Wiedergabeliste zu gelangen.</a>",
"channel_tab_shorts_label": "Shorts", "channel_tab_shorts_label": "Shorts",
"channel_tab_streams_label": "Livestreams", "channel_tab_streams_label": "Livestreams",
"Music in this video": "Musik in diesem Video", "Music in this video": "Musik in diesem Video",
@@ -489,18 +489,9 @@
"generic_channels_count_plural": "{{count}} Kanäle", "generic_channels_count_plural": "{{count}} Kanäle",
"Import YouTube watch history (.json)": "YouTube Wiedergabeverlauf importieren (.json)", "Import YouTube watch history (.json)": "YouTube Wiedergabeverlauf importieren (.json)",
"Answer": "Antwort", "Answer": "Antwort",
"The Popular feed has been disabled by the administrator.": "Der Feed für beliebte Inhalte wurde vom Administrator deaktiviert.", "The Popular feed has been disabled by the administrator.": "Der Angesagt-Feed wurde vom Administrator deaktiviert.",
"Add to playlist": "Einer Wiedergabeliste hinzufügen", "Add to playlist": "Einer Wiedergabeliste hinzufügen",
"Search for videos": "Nach Videos suchen", "Search for videos": "Nach Videos suchen",
"toggle_theme": "Thema wechseln", "toggle_theme": "Thema wechseln",
"Add to playlist: ": "Einer Wiedergabeliste hinzufügen: ", "Add to playlist: ": "Einer Wiedergabeliste hinzufügen: "
"carousel_go_to": "Zu Element `x` springen",
"carousel_slide": "Seite {{current}} von {{total}}",
"carousel_skip": "Galerie überspringen",
"Filipino (auto-generated)": "Philippinisch (automatisch generiert)",
"channel_tab_courses_label": "Kurse",
"channel_tab_posts_label": "Beiträge",
"timeline_parse_error_show_technical_details": "Technische Details anzeigen",
"timeline_parse_error_placeholder_heading": "Element kann nicht geparsed werden",
"timeline_parse_error_placeholder_message": "Invidious ist beim Parsen dieses Elements auf einen Fehler gestossen. Für weitere Informationen siehe unten:"
} }

View File

@@ -21,7 +21,7 @@
"Import and Export Data": "Εισαγωγή και Εξαγωγή Δεδομένων", "Import and Export Data": "Εισαγωγή και Εξαγωγή Δεδομένων",
"Import": "Εισαγωγή", "Import": "Εισαγωγή",
"Import Invidious data": "Εsαγωγή δεδομένων Invidious JSON", "Import Invidious data": "Εsαγωγή δεδομένων Invidious JSON",
"Import YouTube subscriptions": "Εισαγωγή συνδρομών YouTube απο CVS/OPML", "Import YouTube subscriptions": "Εισαγωγή συνδρομών YouTube/OPML",
"Import FreeTube subscriptions (.db)": "Εισαγωγή συνδρομών FreeTube (.db)", "Import FreeTube subscriptions (.db)": "Εισαγωγή συνδρομών FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Εισαγωγή συνδρομών NewPipe (.json)", "Import NewPipe subscriptions (.json)": "Εισαγωγή συνδρομών NewPipe (.json)",
"Import NewPipe data (.zip)": "Εισαγωγή δεδομένων NewPipe (.zip)", "Import NewPipe data (.zip)": "Εισαγωγή δεδομένων NewPipe (.zip)",
@@ -39,6 +39,8 @@
"User ID": "Ταυτότητα χρήστη", "User ID": "Ταυτότητα χρήστη",
"Password": "Κωδικός πρόσβασης", "Password": "Κωδικός πρόσβασης",
"Time (h:mm:ss):": "Ώρα (ω:λλ:δδ):", "Time (h:mm:ss):": "Ώρα (ω:λλ:δδ):",
"Text CAPTCHA": "Κείμενο CAPTCHA",
"Image CAPTCHA": "Εικόνα CAPTCHA",
"Sign In": "Εγγραφή", "Sign In": "Εγγραφή",
"Register": "Εγγραφή", "Register": "Εγγραφή",
"E-mail": "Ηλεκτρονικό ταχυδρομείο", "E-mail": "Ηλεκτρονικό ταχυδρομείο",
@@ -453,7 +455,7 @@
"channel_tab_streams_label": "Ζωντανή μετάδοση", "channel_tab_streams_label": "Ζωντανή μετάδοση",
"playlist_button_add_items": "Προσθήκη βίντεο", "playlist_button_add_items": "Προσθήκη βίντεο",
"Artist: ": "Καλλιτέχνης: ", "Artist: ": "Καλλιτέχνης: ",
"search_message_use_another_instance": "Μπορείτε επίσης <a href=\"`x`\">να αναζητήσετε σε άλλο instance</a>.", "search_message_use_another_instance": " Μπορείτε επίσης <a href=\"`x`\">να αναζητήσετε σε άλλο instance</a>.",
"generic_button_save": "Αποθήκευση", "generic_button_save": "Αποθήκευση",
"generic_button_cancel": "Ακύρωση", "generic_button_cancel": "Ακύρωση",
"subscriptions_unseen_notifs_count": "{{count}} μη αναγνωσμένη ειδοποίηση", "subscriptions_unseen_notifs_count": "{{count}} μη αναγνωσμένη ειδοποίηση",
@@ -487,17 +489,5 @@
"search_filters_date_label": "Ημερομηνία αναφόρτωσης", "search_filters_date_label": "Ημερομηνία αναφόρτωσης",
"Search for videos": "Αναζήτηση βίντεο", "Search for videos": "Αναζήτηση βίντεο",
"The Popular feed has been disabled by the administrator.": "Η δημοφιλής ροή έχει απενεργοποιηθεί από τον διαχειριστή.", "The Popular feed has been disabled by the administrator.": "Η δημοφιλής ροή έχει απενεργοποιηθεί από τον διαχειριστή.",
"Answer": "Απάντηση", "Answer": "Απάντηση"
"Add to playlist": "Προσθήκη στην λίστα αναπαραγωγής",
"Add to playlist: ": "Προσθήκη στην λίστα αναπαραγωγής : ",
"carousel_slide": "Εικόνα {{current}}απο {{total}}",
"carousel_go_to": "Πήγαινε στην εικόνα`x`",
"toggle_theme": "Αλλαγή θέματος",
"Import YouTube watch history (.json)": "Εισαγωγή ιστορικού προβολής YouTube (.json)",
"Filipino (auto-generated)": "Φιλιππινέζικα (αυτόματη παραγωγή)",
"preferences_preload_label": "Προφόρτιση δεδομένων βίντεο: ",
"carousel_skip": "Αποφυγή εμφάνισης εικόνων",
"First page": "Πρώτη σελίδα",
"channel_tab_courses_label": "Μαθήματα",
"channel_tab_posts_label": "Δημοσιεύσεις"
} }

View File

@@ -33,7 +33,6 @@
"last": "last", "last": "last",
"Next page": "Next page", "Next page": "Next page",
"Previous page": "Previous page", "Previous page": "Previous page",
"First page": "First page",
"Clear watch history?": "Clear watch history?", "Clear watch history?": "Clear watch history?",
"New password": "New password", "New password": "New password",
"New passwords must match": "New passwords must match", "New passwords must match": "New passwords must match",
@@ -64,13 +63,14 @@
"User ID": "User ID", "User ID": "User ID",
"Password": "Password", "Password": "Password",
"Time (h:mm:ss):": "Time (h:mm:ss):", "Time (h:mm:ss):": "Time (h:mm:ss):",
"Text CAPTCHA": "Text CAPTCHA",
"Image CAPTCHA": "Image CAPTCHA",
"Sign In": "Sign In", "Sign In": "Sign In",
"Register": "Register", "Register": "Register",
"E-mail": "E-mail", "E-mail": "E-mail",
"Preferences": "Preferences", "Preferences": "Preferences",
"preferences_category_player": "Player preferences", "preferences_category_player": "Player preferences",
"preferences_video_loop_label": "Always loop: ", "preferences_video_loop_label": "Always loop: ",
"preferences_preload_label": "Preload video data: ",
"preferences_autoplay_label": "Autoplay: ", "preferences_autoplay_label": "Autoplay: ",
"preferences_continue_label": "Play next by default: ", "preferences_continue_label": "Play next by default: ",
"preferences_continue_autoplay_label": "Autoplay next video: ", "preferences_continue_autoplay_label": "Autoplay next video: ",
@@ -122,8 +122,6 @@
"Redirect homepage to feed: ": "Redirect homepage to feed: ", "Redirect homepage to feed: ": "Redirect homepage to feed: ",
"preferences_max_results_label": "Number of videos shown in feed: ", "preferences_max_results_label": "Number of videos shown in feed: ",
"preferences_sort_label": "Sort videos by: ", "preferences_sort_label": "Sort videos by: ",
"preferences_default_playlist": "Default playlist: ",
"preferences_default_playlist_none": "No default playlist set",
"published": "published", "published": "published",
"published - reverse": "published - reverse", "published - reverse": "published - reverse",
"alphabetically": "alphabetically", "alphabetically": "alphabetically",
@@ -192,7 +190,7 @@
"Switch Invidious Instance": "Switch Invidious Instance", "Switch Invidious Instance": "Switch Invidious Instance",
"search_message_no_results": "No results found.", "search_message_no_results": "No results found.",
"search_message_change_filters_or_query": "Try widening your search query and/or changing the filters.", "search_message_change_filters_or_query": "Try widening your search query and/or changing the filters.",
"search_message_use_another_instance": "You can also <a href=\"`x`\">search on another instance</a>.", "search_message_use_another_instance": " You can also <a href=\"`x`\">search on another instance</a>.",
"Hide annotations": "Hide annotations", "Hide annotations": "Hide annotations",
"Show annotations": "Show annotations", "Show annotations": "Show annotations",
"Genre: ": "Genre: ", "Genre: ": "Genre: ",
@@ -287,7 +285,6 @@
"Esperanto": "Esperanto", "Esperanto": "Esperanto",
"Estonian": "Estonian", "Estonian": "Estonian",
"Filipino": "Filipino", "Filipino": "Filipino",
"Filipino (auto-generated)": "Filipino (auto-generated)",
"Finnish": "Finnish", "Finnish": "Finnish",
"French": "French", "French": "French",
"French (auto-generated)": "French (auto-generated)", "French (auto-generated)": "French (auto-generated)",
@@ -408,7 +405,6 @@
"Default": "Default", "Default": "Default",
"Music": "Music", "Music": "Music",
"Gaming": "Gaming", "Gaming": "Gaming",
"Livestreams": "Livestreams",
"News": "News", "News": "News",
"Movies": "Movies", "Movies": "Movies",
"Download": "Download", "Download": "Download",
@@ -426,7 +422,7 @@
"search_filters_title": "Filters", "search_filters_title": "Filters",
"search_filters_date_label": "Upload date", "search_filters_date_label": "Upload date",
"search_filters_date_option_none": "Any date", "search_filters_date_option_none": "Any date",
"search_filters_date_option_hour": "Last hour", "search_filters_date_option_hour": "Last Hour",
"search_filters_date_option_today": "Today", "search_filters_date_option_today": "Today",
"search_filters_date_option_week": "This week", "search_filters_date_option_week": "This week",
"search_filters_date_option_month": "This month", "search_filters_date_option_month": "This month",
@@ -458,7 +454,7 @@
"search_filters_sort_label": "Sort By", "search_filters_sort_label": "Sort By",
"search_filters_sort_option_relevance": "Relevance", "search_filters_sort_option_relevance": "Relevance",
"search_filters_sort_option_rating": "Rating", "search_filters_sort_option_rating": "Rating",
"search_filters_sort_option_date": "Upload date", "search_filters_sort_option_date": "Upload Date",
"search_filters_sort_option_views": "View count", "search_filters_sort_option_views": "View count",
"search_filters_apply_button": "Apply selected filters", "search_filters_apply_button": "Apply selected filters",
"Current version: ": "Current version: ", "Current version: ": "Current version: ",
@@ -494,17 +490,11 @@
"channel_tab_streams_label": "Livestreams", "channel_tab_streams_label": "Livestreams",
"channel_tab_podcasts_label": "Podcasts", "channel_tab_podcasts_label": "Podcasts",
"channel_tab_releases_label": "Releases", "channel_tab_releases_label": "Releases",
"channel_tab_courses_label": "Courses",
"channel_tab_playlists_label": "Playlists", "channel_tab_playlists_label": "Playlists",
"channel_tab_community_label": "Community", "channel_tab_community_label": "Community",
"channel_tab_posts_label": "Posts",
"channel_tab_channels_label": "Channels", "channel_tab_channels_label": "Channels",
"toggle_theme": "Toggle Theme", "toggle_theme": "Toggle Theme",
"carousel_slide": "Slide {{current}} of {{total}}", "carousel_slide": "Slide {{current}} of {{total}}",
"carousel_skip": "Skip the Carousel", "carousel_skip": "Skip the Carousel",
"carousel_go_to": "Go to slide `x`", "carousel_go_to": "Go to slide `x`"
"timeline_parse_error_placeholder_heading": "Unable to parse item",
"timeline_parse_error_placeholder_message": "Invidious encountered an error while trying to parse this item. For more information see below:",
"timeline_parse_error_show_technical_details": "Show technical details",
"dmca_content": "This video cannot be downloaded on this instance due to a DMCA/copyright infringement letter sent to the instance administrator."
} }

View File

@@ -39,6 +39,8 @@
"User ID": "Uzula identigilo", "User ID": "Uzula identigilo",
"Password": "Pasvorto", "Password": "Pasvorto",
"Time (h:mm:ss):": "Horo (h:mm:ss):", "Time (h:mm:ss):": "Horo (h:mm:ss):",
"Text CAPTCHA": "Teksta CAPTCHA",
"Image CAPTCHA": "Bilda CAPTCHA",
"Sign In": "Ensaluti", "Sign In": "Ensaluti",
"Register": "Registriĝi", "Register": "Registriĝi",
"E-mail": "Retpoŝto", "E-mail": "Retpoŝto",

View File

@@ -39,6 +39,8 @@
"User ID": "Nombre", "User ID": "Nombre",
"Password": "Contraseña", "Password": "Contraseña",
"Time (h:mm:ss):": "Hora (h:mm:ss):", "Time (h:mm:ss):": "Hora (h:mm:ss):",
"Text CAPTCHA": "CAPTCHA en texto",
"Image CAPTCHA": "CAPTCHA en imagen",
"Sign In": "Iniciar sesión", "Sign In": "Iniciar sesión",
"Register": "Registrarse", "Register": "Registrarse",
"E-mail": "Correo", "E-mail": "Correo",
@@ -76,8 +78,6 @@
"Redirect homepage to feed: ": "Redirigir la página de inicio a la fuente: ", "Redirect homepage to feed: ": "Redirigir la página de inicio a la fuente: ",
"preferences_max_results_label": "Número de videos mostrados en la fuente: ", "preferences_max_results_label": "Número de videos mostrados en la fuente: ",
"preferences_sort_label": "Ordenar los videos por: ", "preferences_sort_label": "Ordenar los videos por: ",
"preferences_default_playlist": "Lista de reproducción por defecto: ",
"preferences_default_playlist_none": "Ninguna lista de reproducción por defecto establecida",
"published": "fecha de publicación", "published": "fecha de publicación",
"published - reverse": "fecha de publicación: orden inverso", "published - reverse": "fecha de publicación: orden inverso",
"alphabetically": "alfabéticamente", "alphabetically": "alfabéticamente",
@@ -187,10 +187,10 @@
"Hidden field \"token\" is a required field": "El campo oculto «símbolo» es un campo obligatorio", "Hidden field \"token\" is a required field": "El campo oculto «símbolo» es un campo obligatorio",
"Erroneous challenge": "Desafío no válido", "Erroneous challenge": "Desafío no válido",
"Erroneous token": "Símbolo no válido", "Erroneous token": "Símbolo no válido",
"No such user": "El usuario no existe", "No such user": "Usuario no existe",
"Token is expired, please try again": "El símbolo ha caducado, inténtelo de nuevo", "Token is expired, please try again": "El símbolo ha caducado, inténtelo de nuevo",
"English": "Inglés", "English": "Inglés",
"English (auto-generated)": "Inglés (generados automáticamente)", "English (auto-generated)": "Inglés (generado automáticamente)",
"Afrikaans": "Afrikáans", "Afrikaans": "Afrikáans",
"Albanian": "Albanés", "Albanian": "Albanés",
"Amharic": "Amárico", "Amharic": "Amárico",
@@ -276,7 +276,7 @@
"Somali": "Somalí", "Somali": "Somalí",
"Southern Sotho": "Sesoto", "Southern Sotho": "Sesoto",
"Spanish": "Español", "Spanish": "Español",
"Spanish (Latin America)": "Español (Latinoamérica)", "Spanish (Latin America)": "Español (Hispanoamérica)",
"Sundanese": "Sondanés", "Sundanese": "Sondanés",
"Swahili": "Suajili", "Swahili": "Suajili",
"Swedish": "Sueco", "Swedish": "Sueco",
@@ -317,7 +317,7 @@
"`x` marked it with a ❤": "`x` lo ha marcado con un ❤", "`x` marked it with a ❤": "`x` lo ha marcado con un ❤",
"Audio mode": "Modo de audio", "Audio mode": "Modo de audio",
"Video mode": "Modo de video", "Video mode": "Modo de video",
"channel_tab_videos_label": "Vídeos", "channel_tab_videos_label": "Videos",
"Playlists": "Listas de reproducción", "Playlists": "Listas de reproducción",
"channel_tab_community_label": "Comunidad", "channel_tab_community_label": "Comunidad",
"search_filters_sort_option_relevance": "Relevancia", "search_filters_sort_option_relevance": "Relevancia",
@@ -412,8 +412,8 @@
"generic_count_weeks_1": "{{count}} semanas", "generic_count_weeks_1": "{{count}} semanas",
"generic_count_weeks_2": "{{count}} semanas", "generic_count_weeks_2": "{{count}} semanas",
"generic_playlists_count_0": "{{count}} lista de reproducción", "generic_playlists_count_0": "{{count}} lista de reproducción",
"generic_playlists_count_1": "{{count}} listas de reproducción", "generic_playlists_count_1": "{{count}} listas de reproducciones",
"generic_playlists_count_2": "{{count}} listas de reproducción", "generic_playlists_count_2": "{{count}} listas de reproducciones",
"generic_videos_count_0": "{{count}} video", "generic_videos_count_0": "{{count}} video",
"generic_videos_count_1": "{{count}} videos", "generic_videos_count_1": "{{count}} videos",
"generic_videos_count_2": "{{count}} videos", "generic_videos_count_2": "{{count}} videos",
@@ -437,7 +437,7 @@
"generic_count_seconds_2": "{{count}} segundos", "generic_count_seconds_2": "{{count}} segundos",
"crash_page_before_reporting": "Antes de notificar un error asegúrate de que has:", "crash_page_before_reporting": "Antes de notificar un error asegúrate de que has:",
"crash_page_switch_instance": "probado a <a href=\"`x`\">usar otra instancia</a>", "crash_page_switch_instance": "probado a <a href=\"`x`\">usar otra instancia</a>",
"crash_page_read_the_faq": "lee las <a href=\"`x`\">Preguntas Frecuentes</a>", "crash_page_read_the_faq": "leído las <a href=\"`x`\">Preguntas Frecuentes</a>",
"crash_page_search_issue": "buscado <a href=\"`x`\">problemas existentes en GitHub</a>", "crash_page_search_issue": "buscado <a href=\"`x`\">problemas existentes en GitHub</a>",
"crash_page_you_found_a_bug": "¡Parece que has encontrado un error en Invidious!", "crash_page_you_found_a_bug": "¡Parece que has encontrado un error en Invidious!",
"crash_page_refresh": "probado a <a href=\"`x`\">recargar la página</a>", "crash_page_refresh": "probado a <a href=\"`x`\">recargar la página</a>",
@@ -463,7 +463,7 @@
"Chinese (Hong Kong)": "Chino (Hong Kong)", "Chinese (Hong Kong)": "Chino (Hong Kong)",
"Chinese (China)": "Chino (China)", "Chinese (China)": "Chino (China)",
"Korean (auto-generated)": "Coreano (generados automáticamente)", "Korean (auto-generated)": "Coreano (generados automáticamente)",
"Spanish (Mexico)": "Español (México)", "Spanish (Mexico)": "Español (Méjico)",
"Spanish (auto-generated)": "Español (generados automáticamente)", "Spanish (auto-generated)": "Español (generados automáticamente)",
"preferences_watch_history_label": "Habilitar historial de reproducciones: ", "preferences_watch_history_label": "Habilitar historial de reproducciones: ",
"search_message_no_results": "No se han encontrado resultados.", "search_message_no_results": "No se han encontrado resultados.",
@@ -478,9 +478,9 @@
"tokens_count_0": "{{count}} token", "tokens_count_0": "{{count}} token",
"tokens_count_1": "{{count}} tokens", "tokens_count_1": "{{count}} tokens",
"tokens_count_2": "{{count}} tokens", "tokens_count_2": "{{count}} tokens",
"search_message_use_another_instance": "También puedes <a href=\"`x`\">buscar en otra instancia</a>.", "search_message_use_another_instance": " También puede <a href=\"`x`\">buscar en otra instancia</a>.",
"Popular enabled: ": "¿Habilitar la sección popular? ", "Popular enabled: ": "¿Habilitar la sección popular? ",
"error_video_not_in_playlist": "El vídeo que has solicitado no existe en esta lista de reproducción. <a href=\"`x`\">Haz clic aquí para acceder a la página de inicio de la lista de reproducción.</a>", "error_video_not_in_playlist": "El video que solicitaste no existe en esta lista de reproducción. <a href=\"`x`\">Haz clic aquí para acceder a la página de inicio de la lista de reproducción.</a>",
"channel_tab_streams_label": "Directos", "channel_tab_streams_label": "Directos",
"channel_tab_channels_label": "Canales", "channel_tab_channels_label": "Canales",
"channel_tab_shorts_label": "Cortos", "channel_tab_shorts_label": "Cortos",
@@ -500,7 +500,7 @@
"generic_button_cancel": "Cancelar", "generic_button_cancel": "Cancelar",
"generic_button_rss": "RSS", "generic_button_rss": "RSS",
"channel_tab_podcasts_label": "Podcasts", "channel_tab_podcasts_label": "Podcasts",
"channel_tab_releases_label": "Lanzamientos", "channel_tab_releases_label": "Publicaciones",
"generic_channels_count_0": "{{count}} canal", "generic_channels_count_0": "{{count}} canal",
"generic_channels_count_1": "{{count}} canales", "generic_channels_count_1": "{{count}} canales",
"generic_channels_count_2": "{{count}} canales", "generic_channels_count_2": "{{count}} canales",
@@ -513,13 +513,5 @@
"The Popular feed has been disabled by the administrator.": "El feed Popular ha sido desactivado por el administrador.", "The Popular feed has been disabled by the administrator.": "El feed Popular ha sido desactivado por el administrador.",
"carousel_slide": "Diapositiva {{current}} de {{total}}", "carousel_slide": "Diapositiva {{current}} de {{total}}",
"carousel_skip": "Saltar el carrusel", "carousel_skip": "Saltar el carrusel",
"carousel_go_to": "Ir a la diapositiva `x`", "carousel_go_to": "Ir a la diapositiva `x`"
"preferences_preload_label": "Precargar datos del vídeo: ",
"Filipino (auto-generated)": "Filipino (generados automáticamente)",
"channel_tab_posts_label": "Publicaciones",
"First page": "Primera página",
"channel_tab_courses_label": "Cursos",
"timeline_parse_error_show_technical_details": "Enseñar detalles técnicos",
"timeline_parse_error_placeholder_message": "Invidious ha encontrado un error al tratar de procesar este elemento. Para más información ver abajo:",
"timeline_parse_error_placeholder_heading": "Imposible procesar este elemento"
} }

View File

@@ -5,7 +5,7 @@
"View channel on YouTube": "Vaata kanalit YouTube'is", "View channel on YouTube": "Vaata kanalit YouTube'is",
"Log in": "Logi sisse", "Log in": "Logi sisse",
"Log in/register": "Logi sisse/registreeru", "Log in/register": "Logi sisse/registreeru",
"Dark mode: ": "Tume kujundus: ", "Dark mode: ": "Tume režiim: ",
"generic_videos_count": "{{count}} video", "generic_videos_count": "{{count}} video",
"generic_videos_count_plural": "{{count}} videot", "generic_videos_count_plural": "{{count}} videot",
"generic_subscribers_count": "{{count}} tellija", "generic_subscribers_count": "{{count}} tellija",
@@ -22,12 +22,12 @@
"last": "viimane", "last": "viimane",
"Next page": "Järgmine leht", "Next page": "Järgmine leht",
"Previous page": "Eelmine leht", "Previous page": "Eelmine leht",
"Clear watch history?": "Kas kustutame vaatamiste ajaloo?", "Clear watch history?": "Kustuta vaatamiste ajalugu?",
"New password": "Uus salasõna", "New password": "Uus salasõna",
"New passwords must match": "Uued salasõnad peavad ühtima", "New passwords must match": "Uued salasõnad peavad ühtima",
"Import and Export Data": "Impordi ja ekspordi andmed", "Import and Export Data": "Impordi ja ekspordi andmed",
"Import": "Impordi", "Import": "Impordi",
"Import YouTube subscriptions": "Impordi CSV või OPML-vormingus Youtube'i tellimused", "Import YouTube subscriptions": "Impordi tellimused Youtube'ist/OPML-ist",
"Import FreeTube subscriptions (.db)": "Impordi tellimused FreeTube'ist (.db)", "Import FreeTube subscriptions (.db)": "Impordi tellimused FreeTube'ist (.db)",
"Import NewPipe data (.zip)": "Impordi NewPipe'i andmed (.zip)", "Import NewPipe data (.zip)": "Impordi NewPipe'i andmed (.zip)",
"Export": "Ekspordi", "Export": "Ekspordi",
@@ -37,9 +37,11 @@
"History": "Ajalugu", "History": "Ajalugu",
"JavaScript license information": "JavaScripti litsentsi info", "JavaScript license information": "JavaScripti litsentsi info",
"source": "allikas", "source": "allikas",
"User ID": "Kasutajatunnus", "User ID": "Kasutada ID",
"Password": "Salasõna", "Password": "Salasõna",
"Time (h:mm:ss):": "Aeg (h:mm:ss):", "Time (h:mm:ss):": "Aeg (h:mm:ss):",
"Text CAPTCHA": "CAPTCHA-tekst",
"Image CAPTCHA": "CAPTCHA-foto",
"Sign In": "Logi sisse", "Sign In": "Logi sisse",
"Register": "Registreeru", "Register": "Registreeru",
"E-mail": "E-post", "E-mail": "E-post",
@@ -55,48 +57,48 @@
"preferences_quality_dash_option_auto": "Automaatne", "preferences_quality_dash_option_auto": "Automaatne",
"preferences_quality_dash_option_best": "Parim", "preferences_quality_dash_option_best": "Parim",
"preferences_quality_dash_option_worst": "Halvim", "preferences_quality_dash_option_worst": "Halvim",
"preferences_volume_label": "Video helivaljus: ", "preferences_volume_label": "Video helitugevus: ",
"youtube": "YouTube", "youtube": "YouTube",
"reddit": "Reddit", "reddit": "Reddit",
"preferences_related_videos_label": "Näita sarnaseid videoid: ", "preferences_related_videos_label": "Näita sarnaseid videosid: ",
"preferences_vr_mode_label": "Interaktiivne 360-kraadine video (vajalik WebGL): ", "preferences_vr_mode_label": "Interaktiivne 360-kraadine video (vajalik WebGL): ",
"preferences_dark_mode_label": "Kujundus: ", "preferences_dark_mode_label": "Teema: ",
"dark": "tume", "dark": "tume",
"light": "hele", "light": "hele",
"preferences_category_subscription": "Tellimuse eelistused", "preferences_category_subscription": "Tellimuse seaded",
"preferences_max_results_label": "Avalehel näidatavate videote arv: ", "preferences_max_results_label": "Avalehel näidatavate videote arv: ",
"preferences_sort_label": "Sorteeri: ", "preferences_sort_label": "Sorteeri: ",
"published": "avaldatud", "published": "avaldatud",
"alphabetically": "tähestikulises järjekorras", "alphabetically": "tähestikulises järjekorras",
"alphabetically - reverse": "vastupidi tähestikulises järjekorras", "alphabetically - reverse": "vastupidi tähestikulises järjekorras",
"channel name": "kanali nimi", "channel name": "kanali nimi",
"preferences_unseen_only_label": "Näita ainult vaatamata videoid: ", "preferences_unseen_only_label": "Näita ainult vaatamata videosid: ",
"Only show latest video from channel: ": "Näita ainult viimast videot: ", "Only show latest video from channel: ": "Näita ainult viimast videot: ",
"preferences_notifications_only_label": "Näita ainult teavitusi (kui neid on): ", "preferences_notifications_only_label": "Näita ainult teavitusi (kui neid on): ",
"Enable web notifications": "Luba veebiteavitused", "Enable web notifications": "Luba veebiteavitused",
"`x` uploaded a video": "`x` laadis video üles", "`x` uploaded a video": "`x` laadis video üles",
"`x` is live": "`x` teeb otseülekannet", "`x` is live": "`x` teeb otseülekannet",
"preferences_category_data": "Andme-eelistused", "preferences_category_data": "Andme-eelistused",
"Clear watch history": "Kustuta vaatamisajalugu", "Clear watch history": "Puhasta vaatamisajalugu",
"Import/export data": "Impordi/ekspordi andmed", "Import/export data": "Impordi/ekspordi andmed",
"Change password": "Muuda salasõna", "Change password": "Muuda salasõna",
"Watch history": "Vaatamisajalugu", "Watch history": "Vaatamisajalugu",
"Delete account": "Kustuta kasutaja", "Delete account": "Kustuta kasutaja",
"Save preferences": "Salvesta eelistused", "Save preferences": "Salvesta eelistused",
"Token": "Tunnusluba", "Token": "Token",
"Import/export": "Imprort/eksport", "Import/export": "Imprort/eksport",
"unsubscribe": "loobu tellimusest", "unsubscribe": "loobu tellimusest",
"Subscriptions": "Tellimused", "Subscriptions": "Tellimused",
"search": "otsi", "search": "otsi",
"Source available here.": "Lähtekood on kättesaadaval siin.", "Source available here.": "Allikas on kättesaadaval siin.",
"View privacy policy.": "Vaata andmekaitsepõhimõtteid.", "View privacy policy.": "Vaata privaatsuspoliitikat.",
"Public": "Avalik", "Public": "Avalik",
"Private": "Privaatne", "Private": "Privaatne",
"View all playlists": "Vaata kõiki esitusloendeid", "View all playlists": "Vaata kõiki esitusloendeid",
"Updated `x` ago": "Uuendas `x` tagasi", "Updated `x` ago": "Uuendas `x` tagasi",
"Delete playlist `x`?": "Kustuta esitusloend `x`?", "Delete playlist `x`?": "Kustuta esitusloend `x`?",
"Delete playlist": "Kustuta esitusloend", "Delete playlist": "Kustuta esitusloend",
"Create playlist": "Koosta esitlusloend", "Create playlist": "Loo esitlusloend",
"Title": "Pealkiri", "Title": "Pealkiri",
"Playlist privacy": "Esitusloendi privaatsus", "Playlist privacy": "Esitusloendi privaatsus",
"Show more": "Näita rohkem", "Show more": "Näita rohkem",
@@ -115,14 +117,14 @@
"Show replies": "Näita vastuseid", "Show replies": "Näita vastuseid",
"Incorrect password": "Vale salasõna", "Incorrect password": "Vale salasõna",
"Wrong answer": "Vale vastus", "Wrong answer": "Vale vastus",
"User ID is a required field": "Kasutajatunnus on kohustuslik väli", "User ID is a required field": "Kasutaja ID on kohustuslik väli",
"Password is a required field": "Salasõna on kohustuslik väli", "Password is a required field": "Salasõna on kohustuslik väli",
"Wrong username or password": "Vale kasutajanimi või salasõna", "Wrong username or password": "Vale kasutajanimi või salasõna",
"Password cannot be longer than 55 characters": "Salasõna ei tohi olla pikem kui 55 tähemärki", "Password cannot be longer than 55 characters": "Salasõna ei tohi olla pikem kui 55 tähemärki",
"Password cannot be empty": "Salasõna ei tohi olla tühi", "Password cannot be empty": "Salasõna ei tohi olla tühi",
"Please log in": "Palun logi sisse", "Please log in": "Palun logige sisse",
"channel:`x`": "kanal:`x`", "channel:`x`": "kanal:`x`",
"Deleted or invalid channel": "Kanal on kustutatud või seda ei leidu", "Deleted or invalid channel": "Kanal on kustutatud või seda ei leitud",
"This channel does not exist.": "Sellist kanalit pole olemas.", "This channel does not exist.": "Sellist kanalit pole olemas.",
"comments_view_x_replies": "{{count}} vastus", "comments_view_x_replies": "{{count}} vastus",
"comments_view_x_replies_plural": "{{count}} vastust", "comments_view_x_replies_plural": "{{count}} vastust",
@@ -132,86 +134,86 @@
"Not a playlist.": "Tegu pole esitusloendiga.", "Not a playlist.": "Tegu pole esitusloendiga.",
"Playlist does not exist.": "Seda esitusloendit pole olemas.", "Playlist does not exist.": "Seda esitusloendit pole olemas.",
"No such user": "Sellist kasutajat pole", "No such user": "Sellist kasutajat pole",
"English": "inglise", "English": "Inglise",
"English (United Kingdom)": "inglise (Suurbritannia)", "English (United Kingdom)": "Inglise (Suurbritannia)",
"English (United States)": "inglise (USA)", "English (United States)": "Inglise (USA)",
"English (auto-generated)": "inglise (automaatselt koostatud)", "English (auto-generated)": "Inglise (automaatselt koostatud)",
"Afrikaans": "afrikaani", "Afrikaans": "Afrikaani",
"Albanian": "albaania", "Albanian": "Albaania",
"Arabic": "araabia", "Arabic": "Araabia",
"Armenian": "armeenia", "Armenian": "Armeenia",
"Bangla": "bengali", "Bangla": "Bengali",
"Basque": "baski", "Basque": "Baski",
"Belarusian": "valgevene", "Belarusian": "Valgevene",
"Bulgarian": "bulgaaria", "Bulgarian": "Bulgaaria",
"Burmese": "birma", "Burmese": "Birma",
"Cantonese (Hong Kong)": "kantoni (Hongkong)", "Cantonese (Hong Kong)": "Kantoni (Hong Konk)",
"Chinese (China)": "hiina (Hiina)", "Chinese (China)": "Hiina (Hiina)",
"Chinese (Hong Kong)": "hiina (Hongkong)", "Chinese (Hong Kong)": "Hiina (Hong Kong)",
"Chinese (Simplified)": "hiina (lihtsustatud)", "Chinese (Simplified)": "Hiina (lihtsustatud)",
"Chinese (Taiwan)": "hiina (Taiwan)", "Chinese (Taiwan)": "Hiina (Taiwan)",
"Croatian": "horvaadi", "Croatian": "Horvaatia",
"Czech": "tšehhi", "Czech": "Tšehhi",
"Danish": "taani", "Danish": "Taani",
"Dutch": "hollandi", "Dutch": "Hollandi",
"Esperanto": "esperanto", "Esperanto": "Esperanto",
"Estonian": "eesti", "Estonian": "Eesti",
"Filipino": "filipiini", "Filipino": "Filipiini",
"Finnish": "soome", "Finnish": "Soome",
"French": "prantsuse", "French": "Prantsuse",
"French (auto-generated)": "prantsuse (automaatselt koostatud)", "French (auto-generated)": "Prantsuse (automaatne)",
"Dutch (auto-generated)": "hollandi (automaatne)", "Dutch (auto-generated)": "Hollandi (automaatne)",
"Galician": "galeegi", "Galician": "Kaliitsia",
"Georgian": "gruusia", "Georgian": "Gruusia",
"Haitian Creole": "haiti kreooli", "Haitian Creole": "Haiti kreool",
"Hausa": "hausa", "Hausa": "Hausa",
"Hawaiian": "havaii", "Hawaiian": "Havaii",
"Hebrew": "heebrea", "Hebrew": "Heebrea",
"Hindi": "hindi", "Hindi": "Hindi",
"Hungarian": "ungari", "Hungarian": "Ungari",
"Icelandic": "islandi", "Icelandic": "Islandi",
"Indonesian": "indoneesia", "Indonesian": "Indoneesia",
"Japanese (auto-generated)": "jaapani (automaatselt koostatud)", "Japanese (auto-generated)": "Jaapani (automaatne)",
"Kannada": "kannada", "Kannada": "Kannada",
"Kazakh": "kasahhi", "Kazakh": "Kasahhi",
"Luxembourgish": "letseburgi", "Luxembourgish": "Luksemburgi",
"Macedonian": "makedoonia", "Macedonian": "Makedoonia",
"Malay": "malai", "Malay": "Malai",
"Maltese": "malta", "Maltese": "Malta",
"Maori": "maoori", "Maori": "Maori",
"Marathi": "marathi", "Marathi": "Marathi",
"Mongolian": "mongoli", "Mongolian": "Mongoli",
"Nepali": "nepaali", "Nepali": "Nepaali",
"Norwegian Bokmål": "norra (Bokmål)", "Norwegian Bokmål": "Norra (Bokmål)",
"Persian": "pärsia", "Persian": "Pärsia",
"Polish": "poola", "Polish": "Poola",
"Portuguese": "portugali", "Portuguese": "Portugali",
"Portuguese (auto-generated)": "portugali (automaatne)", "Portuguese (auto-generated)": "Portugali (automaatne)",
"Portuguese (Brazil)": "portugali (Brasiilia)", "Portuguese (Brazil)": "Portugali (Brasiilia)",
"Romanian": "rumeenia", "Romanian": "Rumeenia",
"Russian": "vene", "Russian": "Vene",
"Russian (auto-generated)": "vene (automaatne)", "Russian (auto-generated)": "Vene (automaatne)",
"Scottish Gaelic": "gaeli", "Scottish Gaelic": "Šoti (Gaeli)",
"Serbian": "serbia", "Serbian": "Serbia",
"Slovak": "slovaki", "Slovak": "Slovaki",
"Slovenian": "sloveeni", "Slovenian": "Sloveeni",
"Somali": "somaali", "Somali": "Somaali",
"Spanish": "hispaania", "Spanish": "Hispaania",
"Spanish (auto-generated)": "hispaania (automaatne)", "Spanish (auto-generated)": "Hispaania (automaatne)",
"Spanish (Latin America)": "hispaania (Ladina-Ameerika)", "Spanish (Latin America)": "Hispaania (Ladina-Ameerika)",
"Spanish (Mexico)": "hispaania (Mehhiko)", "Spanish (Mexico)": "Hispaania (Mehhiko)",
"Spanish (Spain)": "hispaania (Hispaania)", "Spanish (Spain)": "Hispaania (Hispaania)",
"Swahili": "suahiili", "Swahili": "Suahili",
"Swedish": "rootsi", "Swedish": "Rootsi",
"Tajik": "tadžiki", "Tajik": "Tadžiki",
"Tamil": "tamili", "Tamil": "Tamiili",
"Thai": "tai", "Thai": "Tai",
"Turkish": "türgi", "Turkish": "Türgi",
"Turkish (auto-generated)": "türgi (automaatne)", "Turkish (auto-generated)": "Türgi (automaatne)",
"Ukrainian": "ukraina", "Ukrainian": "Ukraina",
"Uzbek": "usbeki", "Uzbek": "Usbeki",
"Vietnamese": "vietnami", "Vietnamese": "Vietnami",
"Vietnamese (auto-generated)": "vietnami (automaatne)", "Vietnamese (auto-generated)": "Vietnami (automaatne)",
"generic_count_years": "{{count}} aasta", "generic_count_years": "{{count}} aasta",
"generic_count_years_plural": "{{count}} aastat", "generic_count_years_plural": "{{count}} aastat",
"generic_count_months": "{{count}} kuu", "generic_count_months": "{{count}} kuu",
@@ -226,15 +228,15 @@
"generic_count_minutes_plural": "{{count}} minutit", "generic_count_minutes_plural": "{{count}} minutit",
"Popular": "Populaarne", "Popular": "Populaarne",
"Search": "Otsi", "Search": "Otsi",
"Top": "Parimad", "Top": "Top",
"About": "Saidi teave", "About": "Leheküljest",
"preferences_locale_label": "Keel: ", "preferences_locale_label": "Keel: ",
"View as playlist": "Vaata esitusloendina", "View as playlist": "Vaata esitusloendina",
"Movies": "Filmid", "Movies": "Filmid",
"Download as: ": "Laadi alla kui: ", "Download as: ": "Laadi kui: ",
"(edited)": "(muudetud)", "(edited)": "(muudetud)",
"`x` marked it with a ❤": "`x` märkis ❤", "`x` marked it with a ❤": "`x` märkis ❤",
"Audio mode": "Helirežiim", "Audio mode": "Audiorežiim",
"Video mode": "Videorežiim", "Video mode": "Videorežiim",
"search_filters_date_label": "Üleslaadimise kuupäev", "search_filters_date_label": "Üleslaadimise kuupäev",
"search_filters_date_option_none": "Ükskõik mis kuupäev", "search_filters_date_option_none": "Ükskõik mis kuupäev",
@@ -244,10 +246,10 @@
"search_filters_date_option_month": "Sel kuul", "search_filters_date_option_month": "Sel kuul",
"search_filters_date_option_year": "Sel aastal", "search_filters_date_option_year": "Sel aastal",
"search_filters_type_label": "Tüüp", "search_filters_type_label": "Tüüp",
"search_filters_type_option_all": "Ükskõik mis tüüpi", "search_filters_type_option_all": "Ükskõik mis tüüp",
"search_filters_duration_label": "Kestus", "search_filters_duration_label": "Kestus",
"search_filters_type_option_show": "Näita", "search_filters_type_option_show": "Näita",
"search_filters_duration_option_none": "Ükskõik mis kestusega", "search_filters_duration_option_none": "Ükskõik mis kestus",
"search_filters_duration_option_short": "Lühike (alla 4 minuti)", "search_filters_duration_option_short": "Lühike (alla 4 minuti)",
"search_filters_duration_option_medium": "Keskmine (4 - 20 minutit)", "search_filters_duration_option_medium": "Keskmine (4 - 20 minutit)",
"search_filters_duration_option_long": "Pikk (üle 20 minuti)", "search_filters_duration_option_long": "Pikk (üle 20 minuti)",
@@ -256,9 +258,9 @@
"search_filters_features_option_hd": "HD", "search_filters_features_option_hd": "HD",
"search_filters_features_option_subtitles": "Subtiitrid", "search_filters_features_option_subtitles": "Subtiitrid",
"search_filters_features_option_location": "Asukoht", "search_filters_features_option_location": "Asukoht",
"search_filters_sort_label": "Järjestus", "search_filters_sort_label": "Sorteeri",
"search_filters_sort_option_views": "Vaatamiste arv", "search_filters_sort_option_views": "Vaatamiste arv",
"next_steps_error_message": "Pärast seda võiksid proovida: ", "next_steps_error_message": "Pärast mida võiksite proovida: ",
"videoinfo_started_streaming_x_ago": "Alustas otseülekannet `x` tagasi", "videoinfo_started_streaming_x_ago": "Alustas otseülekannet `x` tagasi",
"Yes": "Jah", "Yes": "Jah",
"generic_views_count": "{{count}} vaatamine", "generic_views_count": "{{count}} vaatamine",
@@ -268,48 +270,48 @@
"preferences_region_label": "Riik: ", "preferences_region_label": "Riik: ",
"View YouTube comments": "Vaata YouTube'i kommentaare", "View YouTube comments": "Vaata YouTube'i kommentaare",
"preferences_extend_desc_label": "Ava video kirjeldus automaatselt: ", "preferences_extend_desc_label": "Ava video kirjeldus automaatselt: ",
"German (auto-generated)": "saksa (automaatselt koostatud)", "German (auto-generated)": "Saksa (automaatne)",
"Italian": "itaalia", "Italian": "Itaalia",
"preferences_player_style_label": "Meediaesitaja stiil: ", "preferences_player_style_label": "Mängija stiil: ",
"subscriptions_unseen_notifs_count": "{{count}} lugemata teavitus", "subscriptions_unseen_notifs_count": "{{count}} lugemata teavitus",
"subscriptions_unseen_notifs_count_plural": "{{count}} lugemata teavitust", "subscriptions_unseen_notifs_count_plural": "{{count}} lugemata teavitust",
"View more comments on Reddit": "Vaata teisi kommentaare Redditis", "View more comments on Reddit": "Vaata teisi kommentaare Redditis",
"Only show latest unwatched video from channel: ": "Näita ainult viimast vaatamata videot: ", "Only show latest unwatched video from channel: ": "Näita ainult viimast vaatamata videot: ",
"tokens_count": "{{count}} tunnusluba", "tokens_count": "{{count}} token",
"tokens_count_plural": "{{count}} tunnusluba", "tokens_count_plural": "{{count}} tokenit",
"Log out": "Logi välja", "Log out": "Logi välja",
"Premieres `x`": "Linastub`x`", "Premieres `x`": "Linastub`x`",
"View `x` comments": { "View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "Vaata `x` kommentaari", "([^.,0-9]|^)1([^.,0-9]|$)": "Vaata `x` kommentaari",
"": "Vaata `x` kommentaare" "": "Vaata `x` kommentaare"
}, },
"Khmer": "khmeeri", "Khmer": "Khmeeri",
"Bosnian": "bosnia", "Bosnian": "Bosnia",
"Corsican": "korsika", "Corsican": "Korsika",
"Javanese": "jaava", "Javanese": "Jaava",
"Lithuanian": "leedu", "Lithuanian": "Leedu",
"channel_tab_videos_label": "Videod", "channel_tab_videos_label": "Videod",
"channel_tab_community_label": "Kogukond", "channel_tab_community_label": "Kogukond",
"CAPTCHA is a required field": "Robotilõks on kohustuslik väli", "CAPTCHA is a required field": "CAPTCHA on kohustuslik väli",
"comments_points_count": "{{count}} punkt", "comments_points_count": "{{count}} punkt",
"comments_points_count_plural": "{{count}} punkti", "comments_points_count_plural": "{{count}} punkti",
"Chinese": "hiina", "Chinese": "Hiina",
"German": "saksa", "German": "Saksa",
"Indonesian (auto-generated)": "indoneesia (automaatselt koostatud)", "Indonesian (auto-generated)": "Indoneesia (automaatne)",
"Italian (auto-generated)": "itaalia (automaatselt koostatud)", "Italian (auto-generated)": "Itaalia (automaatne)",
"Kyrgyz": "kirgiisi", "Kyrgyz": "Kirkiisi",
"Latin": "ladina", "Latin": "Ladina",
"generic_count_seconds": "{{count}} sekund", "generic_count_seconds": "{{count}} sekund",
"generic_count_seconds_plural": "{{count}} sekundit", "generic_count_seconds_plural": "{{count}} sekundit",
"Catalan": "katalaani", "Catalan": "Katalaani",
"Chinese (Traditional)": "hiina (traditsiooniline)", "Chinese (Traditional)": "Hiina (traditsiooniline)",
"Greek": "kreeka", "Greek": "Kreeka",
"Kurdish": "kurdi", "Kurdish": "Kurdi",
"Latvian": "läti", "Latvian": "Läti",
"Irish": "iiri", "Irish": "Iiri",
"Korean": "korea", "Korean": "Korea",
"Japanese": "jaapani", "Japanese": "Jaapani",
"Korean (auto-generated)": "korea (automaatselt koostatud)", "Korean (auto-generated)": "Korea (automaatne)",
"Music": "Muusika", "Music": "Muusika",
"Playlists": "Esitusloendid", "Playlists": "Esitusloendid",
"search_filters_type_option_video": "Video", "search_filters_type_option_video": "Video",
@@ -323,186 +325,8 @@
"search_filters_type_option_channel": "Kanal", "search_filters_type_option_channel": "Kanal",
"search_filters_type_option_playlist": "Esitusloend", "search_filters_type_option_playlist": "Esitusloend",
"search_filters_type_option_movie": "Film", "search_filters_type_option_movie": "Film",
"next_steps_error_message_go_to_youtube": "Mine YouTube'i", "next_steps_error_message_go_to_youtube": "Minna YouTube'i",
"next_steps_error_message_refresh": "Laadi uuesti", "next_steps_error_message_refresh": "Laadida uuesti",
"footer_donate_page": "Anneta", "footer_donate_page": "Anneta",
"videoinfo_watch_on_youTube": "Vaata YouTube'is", "videoinfo_watch_on_youTube": "Vaata YouTube'is"
"Authorize token for `x`?": "Kas volitad tunnusloa kasutamise `x`-le?",
"Export data as JSON": "Expordi Invidious andmed JSON-ina",
"Import Invidious data": "Impordi Invidious JSON andmed",
"preferences_local_label": "Edasta videod vaheserveri kaudu: ",
"Music in this video": "Muusika selles videos",
"Token manager": "Tunnuslubade haldur",
"search_message_use_another_instance": "Võid ka <a href=\"`x`\">otsida teisest serverist</a>.",
"Standard YouTube license": "Tavaline Youtube'i litsens",
"Song: ": "Lugu: ",
"Add to playlist": "Lisa esitlusloendisse",
"Add to playlist: ": "Lisa esitlusloendisse: ",
"Search for videos": "Otsi videoid",
"The Popular feed has been disabled by the administrator.": "Administraator on populaarse voo välja lülitanud.",
"preferences_quality_dash_option_2160p": "2160p",
"generic_button_rss": "RSS uudisvoog",
"Import YouTube watch history (.json)": "Impordi Youtube vaatamiste ajalugu (.json)",
"published - reverse": "avaldatud - vastupidine",
"preferences_default_home_label": "Vaikimisi koduleht: ",
"preferences_feed_menu_label": "Voogude menüü: ",
"Login enabled: ": "Sisselogimine lubatud: ",
"Registration enabled: ": "Registreerimine lubatud: ",
"CAPTCHA enabled: ": "Robotilõks on kasutusel: ",
"Blacklisted regions: ": "Mustas nimekirjas piirkonnad: ",
"Wilson score: ": "Wilsoni skoor: ",
"generic_button_delete": "Kustuta",
"generic_button_edit": "Muuda",
"generic_button_save": "Salvesta",
"generic_button_cancel": "Tühista",
"Import YouTube playlist (.csv)": "Impordi Youtube esitlusloend (.csv)",
"preferences_category_misc": "Muud seadistused",
"preferences_annotations_subscribed_label": "Kas vaikimisi näitame tellitud kanalite sisukokkuvõtteid?: ",
"preferences_quality_dash_option_480p": "480p",
"preferences_continue_label": "Vaikimisi mängi järgmine video: ",
"View JavaScript license information.": "Vaata JavaScripti litsensiteavet.",
"preferences_listen_label": "Kuula vaikimisi: ",
"preferences_quality_dash_option_1080p": "1080p",
"Erroneous CAPTCHA": "Vigane robotilõks",
"Hidden field \"challenge\" is a required field": "Peidetud väli \"väljakutse\" on kohustuslik väli",
"Fallback captions: ": "Tagavara subtiitrid: ",
"preferences_category_admin": "Administraatori seadistused",
"preferences_automatic_instance_redirect_label": "Automaatne serveri ümbersuunamine (varuvariandile redirect.invidious.io): ",
"channel name - reverse": "kanali nimi - vastupidine",
"An alternative front-end to YouTube": "Alternatiivne Youtube esiliides",
"Subscription manager": "Tellimuste haldur",
"Redirect homepage to feed: ": "Suuna koduleht voole: ",
"Azerbaijani": "aserbaidžaani",
"Gujarati": "gudžarati",
"generic_channels_count": "{{count}} kanal",
"generic_channels_count_plural": "{{count}} kanalit",
"preferences_video_loop_label": "Alati korda: ",
"preferences_watch_history_label": "Lülita vaatamiste ajalugu sisse: ",
"preferences_speed_label": "Vaikimisi kiirus: ",
"preferences_quality_dash_option_4320p": "4320p",
"preferences_quality_dash_option_1440p": "1440p",
"preferences_quality_dash_option_720p": "720p",
"preferences_quality_dash_option_360p": "360p",
"preferences_quality_dash_option_240p": "240p",
"preferences_captions_label": "Vaikimisi subtiitrid: ",
"preferences_annotations_label": "Vaikimisi näita sisukokkuvõtteid: ",
"preferences_thin_mode_label": "Napp režiim: ",
"Manage subscriptions": "Halda tellimusi",
"Manage tokens": "Halda tunnuslube",
"preferences_show_nick_label": "Näita üleval hüüdnime ",
"revoke": "võta tagasi",
"Released under the AGPLv3 on Github.": "Avaldatud GitHubis AGPLv3 litsentsi alusel.",
"Trending": "Trendikas",
"Unlisted": "Ajajooneväline",
"Switch Invidious Instance": "Vaheta Invidiouse Serverit",
"Whitelisted regions: ": "Valges nimekirjas piirkonnad: ",
"Artist: ": "Esitaja: ",
"Could not fetch comments": "Kommentaaride laadimine ei õnnestunud",
"Album: ": "Album: ",
"Invidious Private Feed for `x`": "Invidiouse privaatne Voog `x`-ile",
"Could not pull trending pages.": "Ei saanud alla laadida trendikaid lehti.",
"Hidden field \"token\" is a required field": "Peidetud väli \"tunnusluba\" on kohustuslik väli",
"Erroneous challenge": "Ekslik väljakutse",
"Erroneous token": "Ekslik tunnusluba",
"Token is expired, please try again": "Tunnusluba on aegunud, palun proovi uuesti",
"Amharic": "amhari",
"Cebuano": "sebu",
"preferences_autoplay_label": "Automaatesitus: ",
"invidious": "Invidious",
"preferences_quality_dash_option_144p": "144p",
"Popular enabled: ": "Populaarsed videod on kasutusel: ",
"Top enabled: ": "Ülariba lubatud: ",
"Editing playlist `x`": "Esitlusloendi `x` muutmine",
"Show annotations": "Näita sisukokkuvõtteid",
"Hide annotations": "Peida sisukokkuvõtted",
"Could not create mix.": "Ei saanud miksi luua.",
"Authorize token?": "Kas volitad tunnusloa kasutamise?",
"playlist_button_add_items": "Lisa videoid",
"First page": "Esimene leht",
"preferences_preload_label": "Eellaadi videoandmed: ",
"preferences_category_visual": "Visuaalsed seadistused",
"preferences_comments_label": "Vaikimisi kommentaarid: ",
"Filipino (auto-generated)": "filipiini (automaatselt koostatud)",
"Could not get channel info.": "Kanali info tuvastamine ei õnnestunud.",
"Answer": "Vastus",
"Report statistics: ": "Teavita statistikast: ",
"Hmong": "hmongi",
"Igbo": "igbo",
"Interlingue": "interlingue",
"Lao": "lao",
"Malagasy": "malagassi",
"Malayalam": "malajalami",
"Pashto": "puštu",
"Nyanja": "njandža",
"Punjabi": "pandžabi",
"Samoan": "samoa",
"Shona": "šona",
"Sindhi": "sindhi",
"Sinhala": "singali",
"Southern Sotho": "lõunasotho",
"Sundanese": "sunda",
"Telugu": "telugu",
"Urdu": "urdu",
"Welsh": "kõmri",
"Western Frisian": "läänefriisi",
"Xhosa": "koosa",
"Yiddish": "jidiši",
"Yoruba": "joruba",
"Zulu": "suulu",
"Fallback comments: ": "Kommentaaride tagavaravariant: ",
"Rating: ": "Hinnang: ",
"Default": "Vaikimisi",
"Download is disabled": "Allalaadimine on keelatud",
"YouTube comment permalink": "YouTube'i kommentaari püsilink",
"permalink": "püsilink",
"Channel Sponsor": "Kanali sponsor",
"search_filters_features_label": "Omadused",
"search_filters_features_option_c_commons": "Creative Commons litsents",
"search_filters_features_option_three_sixty": "360°-video",
"search_filters_features_option_vr180": "VR180-video",
"search_filters_features_option_three_d": "3D-video",
"search_filters_features_option_hdr": "HDR-video",
"search_filters_features_option_purchased": "Ostetud",
"search_filters_sort_option_relevance": "Olulisus",
"search_filters_sort_option_rating": "Hinnang",
"search_filters_apply_button": "Rakenda valitud filtrid",
"footer_source_code": "Lähtekood",
"footer_original_source_code": "Algne lähtekood",
"footer_modfied_source_code": "Muudetud lähtekood",
"none": "mitte midagi",
"videoinfo_youTube_embed_link": "Lõimi",
"videoinfo_invidious_embed_link": "Lõimi link",
"adminprefs_modified_source_code_url_label": "Link muudetud lähtekoodi hoidlale",
"channel_tab_podcasts_label": "Taskuhäälingud",
"Engagement: ": "Kaasatus: ",
"download_subtitles": "Subtiitrid - `x` (.vtt)",
"user_created_playlists": "`x` - koostatud esitusloendid",
"user_saved_playlists": "`x` - salvestatud esitusloendid",
"Video unavailable": "Video pole saadaval",
"preferences_save_player_pos_label": "Salvesta taasesituse asukoht: ",
"crash_page_you_found_a_bug": "Tundub, et oled Invidiousest leidnud vea!",
"crash_page_before_reporting": "Enne veast teatamist, palun kontrolli, et oleksid:",
"crash_page_refresh": "proovinud <a href=\"`x`\">lehte uuesti laadida</a>",
"crash_page_switch_instance": "proovinud <a href=\"`x`\">kasutada mõnda muud Invidiouse serverit</a>",
"crash_page_read_the_faq": "lugenud <a href=\"`x`\">Korduma kippuvaid küsimusi (KKK)</a>",
"crash_page_search_issue": "otsinud <a href=\"`x`\">GitHubist sarnaseid ja juba teaeatud vigu</a>",
"crash_page_report_issue": "Kui ükski ülaltoodud võimalustest seda viga ei lahendanud, siis palun <a href=\"`x`\">koosta GitHubis meie veahalduses uus veateade</a> (soovitavalt inglise keeles) ja lisa sinnakogu järgnev tekst (palun ÄRA tõlgi seda teksti):",
"error_video_not_in_playlist": "Selles esitusloendis ei leidu soovitud videot. <a href=\"`x`\">Siit pääsed esitusloendi avalehele.</a>",
"channel_tab_shorts_label": "Lühivideod",
"channel_tab_streams_label": "Otseülekanded",
"%A %B %-d, %Y": "%A %B %-d, %Y",
"channel_tab_releases_label": "Versioonid",
"channel_tab_courses_label": "Kursused",
"channel_tab_playlists_label": "Esitusloendid",
"channel_tab_posts_label": "Postitused",
"channel_tab_channels_label": "Kanalid",
"toggle_theme": "Vaheta kujundust",
"carousel_slide": "Slaid {{current}} / {{total}}",
"carousel_skip": "Jäta karussell vahele",
"carousel_go_to": "Ava slaid `x`",
"timeline_parse_error_placeholder_heading": "Objekti töötlemine ei õnnestu",
"timeline_parse_error_placeholder_message": "Selle objekti töötlemisel tekkis Invidiouses viga. Lisateave on alljärgnevas:",
"timeline_parse_error_show_technical_details": "Näita tehnilisi üksikasju",
"preferences_default_playlist": "Vaikimisi esitusloend: ",
"preferences_default_playlist_none": "Ühtegi vaikimisi esitusloendit ei leidu"
} }

View File

@@ -38,6 +38,8 @@
"User ID": "Erabiltzaile IDa", "User ID": "Erabiltzaile IDa",
"Password": "Pasahitza", "Password": "Pasahitza",
"Time (h:mm:ss):": "Denbora (h:mm:ss):", "Time (h:mm:ss):": "Denbora (h:mm:ss):",
"Text CAPTCHA": "CAPTCHA testua",
"Image CAPTCHA": "CAPTCHA irudia",
"Sign In": "Hasi saioa", "Sign In": "Hasi saioa",
"Register": "Eman izena", "Register": "Eman izena",
"E-mail": "E-posta", "E-mail": "E-posta",

View File

@@ -1,12 +1,12 @@
{ {
"generic_views_count": "{{count}} بازدید", "generic_views_count": "{{count}} بازدید",
"generic_views_count_plural": "{{count}} بازدید", "generic_views_count_plural": "{{count}} بازدید",
"generic_videos_count": "{{count}} ویدیو", "generic_videos_count": "{{count}} ویدئو",
"generic_videos_count_plural": "{{count}} ویدیو", "generic_videos_count_plural": "{{count}} ویدئو",
"generic_playlists_count": "{{count}} فهرست پخش", "generic_playlists_count": "{{count}} فهرست پخش",
"generic_playlists_count_plural": "{{count}} فهرست پخش", "generic_playlists_count_plural": "{{count}} فهرست پخش",
"generic_subscribers_count": "{{count}} دنبالکننده", "generic_subscribers_count": "{{count}} دنبال کننده",
"generic_subscribers_count_plural": "{{count}} دنبالکننده", "generic_subscribers_count_plural": "{{count}} دنبال کننده",
"generic_subscriptions_count": "{{count}} اشتراک", "generic_subscriptions_count": "{{count}} اشتراک",
"generic_subscriptions_count_plural": "{{count}} اشتراک", "generic_subscriptions_count_plural": "{{count}} اشتراک",
"LIVE": "زنده", "LIVE": "زنده",
@@ -24,21 +24,21 @@
"Clear watch history?": "پاک کردن تاریخچه نمایش؟", "Clear watch history?": "پاک کردن تاریخچه نمایش؟",
"New password": "گذرواژه تازه", "New password": "گذرواژه تازه",
"New passwords must match": "گذارواژه های تازه باید باهم همخوانی داشته باشند", "New passwords must match": "گذارواژه های تازه باید باهم همخوانی داشته باشند",
"Authorize token?": "اجازه دادن به توکن؟", "Authorize token?": "توکن دسترسی؟",
"Authorize token for `x`?": "اجازه دادن به توکن برای `x`؟", "Authorize token for `x`?": "توکن دسترسی برای `x`؟",
"Yes": "آری", "Yes": "بله",
"No": "نه", "No": "خیر",
"Import and Export Data": "درون‌برد و برون‌برد داده", "Import and Export Data": "درون‌برد و برون‌برد داده",
"Import": "درون‌برد", "Import": "درون‌برد",
"Import Invidious data": "درون‌برد داده JSON اینویدیوس", "Import Invidious data": "وارد کردن داده JSON اینویدیوس",
"Import YouTube subscriptions": "درون‌برد پروندهٔ CSV یا OPML اشتراک‌های یوتیوب", "Import YouTube subscriptions": "وارد کردن فایل CSV یا OPML سابسکرایب های یوتیوب",
"Import FreeTube subscriptions (.db)": "درون‌برد اشتراک‌های فری‌تیوب (.db)", "Import FreeTube subscriptions (.db)": "درون‌برد اشتراک‌های فری‌تیوب (.db)",
"Import NewPipe subscriptions (.json)": "درون‌برد اشتراک‌های نیوپایپ (.json)", "Import NewPipe subscriptions (.json)": "درون‌برد اشتراک‌های نیوپایپ (.json)",
"Import NewPipe data (.zip)": "درون‌برد داده نیوپایپ (.zip)", "Import NewPipe data (.zip)": "درون‌برد داده نیوپایپ (.zip)",
"Export": "برون‌برد", "Export": "برون‌برد",
"Export subscriptions as OPML": "برون‌برد اشتراک‌ها در قالب OPML", "Export subscriptions as OPML": "برون‌برد اشتراک‌ها در قالب OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "برون‌برد اشتراک‌ها در قالب OPML (برای نیوپایپ و فری‌تیوب)", "Export subscriptions as OPML (for NewPipe & FreeTube)": "برون‌برد اشتراک‌ها در قالب OPML (برای نیوپایپ و فری‌تیوب)",
"Export data as JSON": "برون‌برد دادهٔ اینویدیوس به‌عنوان JSON", "Export data as JSON": "گرفتن(خارج کردن) اطلاعات اینویدیوس با فرمت JSON",
"Delete account?": "حذف حساب کاربری؟", "Delete account?": "حذف حساب کاربری؟",
"History": "تاریخچه", "History": "تاریخچه",
"An alternative front-end to YouTube": "یک پیشانه جایگزین برای یوتیوب", "An alternative front-end to YouTube": "یک پیشانه جایگزین برای یوتیوب",
@@ -49,13 +49,15 @@
"User ID": "شناسه کاربری", "User ID": "شناسه کاربری",
"Password": "گذرواژه", "Password": "گذرواژه",
"Time (h:mm:ss):": "زمان (h:mm:ss):", "Time (h:mm:ss):": "زمان (h:mm:ss):",
"Text CAPTCHA": "کپچای متنی",
"Image CAPTCHA": "کپچای تصویری",
"Sign In": "ورود", "Sign In": "ورود",
"Register": "ثبت نام", "Register": "ثبت نام",
"E-mail": "ایمیل", "E-mail": "ایمیل",
"Preferences": "ترجیحات", "Preferences": "ترجیحات",
"preferences_category_player": "ترجیحات نمایش‌دهنده", "preferences_category_player": "ترجیحات نمایش‌دهنده",
"preferences_video_loop_label": "همیشه بازپخش کن: ", "preferences_video_loop_label": "همواره ویدئو را بازپخش کن ",
"preferences_autoplay_label": "پخش خودکار: ", "preferences_autoplay_label": "نمایش خودکار: ",
"preferences_continue_label": "پخش بعدی به طور پیشفرض: ", "preferences_continue_label": "پخش بعدی به طور پیشفرض: ",
"preferences_continue_autoplay_label": "پخش خودکار ویدیو بعدی: ", "preferences_continue_autoplay_label": "پخش خودکار ویدیو بعدی: ",
"preferences_listen_label": "گوش کردن به طور پیشفرض: ", "preferences_listen_label": "گوش کردن به طور پیشفرض: ",
@@ -66,14 +68,14 @@
"preferences_comments_label": "نظرات پیشفرض: ", "preferences_comments_label": "نظرات پیشفرض: ",
"youtube": "یوتیوب", "youtube": "یوتیوب",
"reddit": "ردیت", "reddit": "ردیت",
"preferences_captions_label": "زیرنویسهای پیشفرض: ", "preferences_captions_label": "زیرنویس های پیشفرض: ",
"Fallback captions: ": "عقبگرد زیرنویسها: ", "Fallback captions: ": "عقب گرد زیرنویس ها: ",
"preferences_related_videos_label": "نمایش ویدیوهای مرتبط: ", "preferences_related_videos_label": "نمایش ویدیو های مرتبط: ",
"preferences_annotations_label": "نمایش حاشیهنویسیها بهطور پیشفرض: ", "preferences_annotations_label": "نمایش حاشیه نویسی ها به طور پیشفرض: ",
"preferences_extend_desc_label": "گسترش خودکار توضیحات ویدیو: ", "preferences_extend_desc_label": "گسترش خودکار توضیحات ویدئو: ",
"preferences_vr_mode_label": "ویدیوهای ۳۶۰ درجهٔ تعاملی (نیازمند WebGL): ", "preferences_vr_mode_label": "ویدئوها ۳۶۰ درجه تعاملی(نیازمند WebGL): ",
"preferences_category_visual": "ترجیحات بصری", "preferences_category_visual": "ترجیحات بصری",
"preferences_player_style_label": "حالت پخشکننده: ", "preferences_player_style_label": "حالت پخش کننده: ",
"Dark mode: ": "حالت تاریک: ", "Dark mode: ": "حالت تاریک: ",
"preferences_dark_mode_label": "تم: ", "preferences_dark_mode_label": "تم: ",
"dark": "تاریک", "dark": "تاریک",
@@ -82,7 +84,7 @@
"preferences_category_misc": "ترجیحات متفرقه", "preferences_category_misc": "ترجیحات متفرقه",
"preferences_automatic_instance_redirect_label": "هدایت خودکار نمونه (انتقال به redirect.invidious.io): ", "preferences_automatic_instance_redirect_label": "هدایت خودکار نمونه (انتقال به redirect.invidious.io): ",
"preferences_category_subscription": "ترجیحات اشتراک", "preferences_category_subscription": "ترجیحات اشتراک",
"preferences_annotations_subscribed_label": "نمایش حاشیهنویسیها بهطور پیشفرض برای کانالهای مشترکشده: ", "preferences_annotations_subscribed_label": "نمایش حاشیه نویسی ها به طور پیشفرض برای کانال های مشترک شده: ",
"Redirect homepage to feed: ": "تغییر مسیر صفحه خانه به خوراک: ", "Redirect homepage to feed: ": "تغییر مسیر صفحه خانه به خوراک: ",
"preferences_max_results_label": "تعداد ویدیو های نمایش داده شده در خوراک: ", "preferences_max_results_label": "تعداد ویدیو های نمایش داده شده در خوراک: ",
"preferences_sort_label": "مرتب سازی ویدیو ها بر اساس: ", "preferences_sort_label": "مرتب سازی ویدیو ها بر اساس: ",
@@ -358,7 +360,7 @@
"search_filters_duration_label": "مدت", "search_filters_duration_label": "مدت",
"search_filters_features_label": "ویژگی‌ها", "search_filters_features_label": "ویژگی‌ها",
"search_filters_sort_label": "به ترتیب", "search_filters_sort_label": "به ترتیب",
"search_filters_date_option_hour": "ساعت گذشته", "search_filters_date_option_hour": "یک ساعت گذشته",
"search_filters_date_option_today": "امروز", "search_filters_date_option_today": "امروز",
"search_filters_date_option_week": "این هفته", "search_filters_date_option_week": "این هفته",
"search_filters_date_option_month": "این ماه", "search_filters_date_option_month": "این ماه",
@@ -381,21 +383,21 @@
"next_steps_error_message_refresh": "تازه‌سازی", "next_steps_error_message_refresh": "تازه‌سازی",
"next_steps_error_message_go_to_youtube": "رفتن به یوتیوب", "next_steps_error_message_go_to_youtube": "رفتن به یوتیوب",
"preferences_quality_option_hd720": "HD720", "preferences_quality_option_hd720": "HD720",
"preferences_quality_option_dash": "DASH (کیفیت سازگارشونده)", "preferences_quality_option_dash": "DASH (کیفیت تطبیفی)",
"preferences_quality_option_medium": "میانه", "preferences_quality_option_medium": "میانه",
"preferences_quality_option_small": "پایین", "preferences_quality_option_small": "پایین",
"preferences_quality_dash_option_auto": "خودکار", "preferences_quality_dash_option_auto": "خودکار",
"preferences_quality_dash_option_best": "بهترین", "preferences_quality_dash_option_best": "بهترین",
"preferences_quality_dash_option_worst": "بدترین", "preferences_quality_dash_option_worst": "بدترین",
"preferences_quality_dash_option_4320p": "۴۳۲۰p", "preferences_quality_dash_option_4320p": "4320p",
"preferences_quality_dash_option_2160p": "۲۱۶۰p", "preferences_quality_dash_option_2160p": "2160p",
"preferences_quality_dash_option_1440p": "۱۴۴۰p", "preferences_quality_dash_option_1440p": "1440p",
"preferences_quality_dash_option_1080p": "۱۰۸۰p", "preferences_quality_dash_option_1080p": "1080p",
"preferences_quality_dash_option_720p": "۷۲۰p", "preferences_quality_dash_option_720p": "720p",
"preferences_quality_dash_option_480p": "۴۸۰p", "preferences_quality_dash_option_480p": "480p",
"preferences_quality_dash_option_360p": "۳۶۰p", "preferences_quality_dash_option_360p": "360p",
"preferences_quality_dash_option_240p": "۲۴۰p", "preferences_quality_dash_option_240p": "240p",
"preferences_quality_dash_option_144p": "۱۴۴p", "preferences_quality_dash_option_144p": "144p",
"invidious": "اینویدیوس", "invidious": "اینویدیوس",
"search_filters_features_option_three_sixty": "360°", "search_filters_features_option_three_sixty": "360°",
"footer_donate_page": "کمک مالی", "footer_donate_page": "کمک مالی",
@@ -459,7 +461,7 @@
"Song: ": "آهنگ: ", "Song: ": "آهنگ: ",
"Channel Sponsor": "اسپانسر کانال", "Channel Sponsor": "اسپانسر کانال",
"Standard YouTube license": "پروانه استاندارد YouTube", "Standard YouTube license": "پروانه استاندارد YouTube",
"search_message_use_another_instance": "همچنین می‌توانید <a href=\"`x`\">در نمونه‌ای دیگر هم جست‌وجو کنید</a>.", "search_message_use_another_instance": " شما همچنین می‌توانید <a href=\"`x`\">در نمونه دیگر هم جستجو کنید</a>.",
"Download is disabled": "دریافت غیرفعال است", "Download is disabled": "دریافت غیرفعال است",
"crash_page_before_reporting": "پیش از گزارش ایراد، مطمئنید شوید که:", "crash_page_before_reporting": "پیش از گزارش ایراد، مطمئنید شوید که:",
"playlist_button_add_items": "افزودن ویدیو", "playlist_button_add_items": "افزودن ویدیو",
@@ -474,8 +476,8 @@
"generic_button_rss": "خوراک RSS", "generic_button_rss": "خوراک RSS",
"crash_page_read_the_faq": "که <a href=\"`x`\">سوالات بیشتر پرسیده شده (FAQ)</a> را خوانده‌اید", "crash_page_read_the_faq": "که <a href=\"`x`\">سوالات بیشتر پرسیده شده (FAQ)</a> را خوانده‌اید",
"generic_button_delete": "حذف", "generic_button_delete": "حذف",
"Import YouTube playlist (.csv)": "درون‌برد فهرست‌پخش YouTube (.csv)", "Import YouTube playlist (.csv)": "واردکردن فهرست‌پخش YouTube (.csv)",
"Import YouTube watch history (.json)": "درون‌برد تاریخچهٔ تماشای یوتیوب (.json)", "Import YouTube watch history (.json)": "وارد کردن فهرست پخش YouTube (.json)",
"crash_page_you_found_a_bug": "به نظر می‌رسد که ایرادی در Invidious پیدا کرده‌اید!", "crash_page_you_found_a_bug": "به نظر می‌رسد که ایرادی در Invidious پیدا کرده‌اید!",
"channel_tab_podcasts_label": "پادکست‌ها", "channel_tab_podcasts_label": "پادکست‌ها",
"channel_tab_streams_label": "پخش زنده‌ها", "channel_tab_streams_label": "پخش زنده‌ها",
@@ -483,10 +485,10 @@
"channel_tab_playlists_label": "فهرست‌های پخش", "channel_tab_playlists_label": "فهرست‌های پخش",
"channel_tab_channels_label": "کانال‌ها", "channel_tab_channels_label": "کانال‌ها",
"error_video_not_in_playlist": "ویدیوی درخواستی معلق به این فهرست پخش نیست. <a href=\"`x`\">کلیک کنید تا به صفحهٔ اصلی فهرست پخش بروید.</a>", "error_video_not_in_playlist": "ویدیوی درخواستی معلق به این فهرست پخش نیست. <a href=\"`x`\">کلیک کنید تا به صفحهٔ اصلی فهرست پخش بروید.</a>",
"Add to playlist": "افزودن به فهرست پخش", "Add to playlist": "به لیست پخش افزوده شود",
"Answer": "پاسخ", "Answer": "پاسخ",
"Search for videos": "جست‌وجو برای ویدیوها", "Search for videos": "جست و جو برای ویدیوها",
"Add to playlist: ": "افزودن به فهرست پخش ", "Add to playlist: ": "افزودن به لیست پخش ",
"The Popular feed has been disabled by the administrator.": "بخش ویدیوهای پرطرفدار توسط مدیر غیرفعال شده است.", "The Popular feed has been disabled by the administrator.": "بخش ویدیوهای پرطرفدار توسط مدیر غیرفعال شده است.",
"carousel_slide": "اسلاید {{current}} از {{total}}", "carousel_slide": "اسلاید {{current}} از {{total}}",
"carousel_skip": "رد شدن از گرداننده", "carousel_skip": "رد شدن از گرداننده",
@@ -494,12 +496,5 @@
"crash_page_search_issue": "دنبال <a href=\"`x`\"> گشتیم بین مشکلات در گیت هاب </a>", "crash_page_search_issue": "دنبال <a href=\"`x`\"> گشتیم بین مشکلات در گیت هاب </a>",
"crash_page_report_issue": "اگر هیچ یک از روش های بالا کمکی نکردند لطفا <a href=\"`x`\"> (ترجیحا به انگلیسی) یک سوال جدید در گیت هاب بپرسید و </a> طوری که سوالتون شامل متن زیر باشه:", "crash_page_report_issue": "اگر هیچ یک از روش های بالا کمکی نکردند لطفا <a href=\"`x`\"> (ترجیحا به انگلیسی) یک سوال جدید در گیت هاب بپرسید و </a> طوری که سوالتون شامل متن زیر باشه:",
"channel_tab_releases_label": "آثار", "channel_tab_releases_label": "آثار",
"toggle_theme": "تغییر وضعیت تم", "toggle_theme": "تغییر وضعیت تم"
"preferences_preload_label": "پیش بار کردن داده‌های ویدیو: ",
"First page": "نخستین صفحه",
"Filipino (auto-generated)": "فیلیپنی (تولید خودکار)",
"channel_tab_posts_label": "فرسته‌ها",
"timeline_parse_error_placeholder_heading": "ناتوانی در تجزیهٔ مورد",
"timeline_parse_error_placeholder_message": "اینویدیوس هنگام کوشش برای تجزیهٔ این مورد به خطایی برخورد. برای اطلاعات بیشتر زیر را ببینید:",
"timeline_parse_error_show_technical_details": "نمایش جزئیات فنی"
} }

View File

@@ -39,6 +39,8 @@
"User ID": "Käyttäjätunnus", "User ID": "Käyttäjätunnus",
"Password": "Salasana", "Password": "Salasana",
"Time (h:mm:ss):": "Aika (h:mm:ss):", "Time (h:mm:ss):": "Aika (h:mm:ss):",
"Text CAPTCHA": "Teksti-CAPTCHA",
"Image CAPTCHA": "Kuva-CAPTCHA",
"Sign In": "Kirjaudu sisään", "Sign In": "Kirjaudu sisään",
"Register": "Rekisteröidy", "Register": "Rekisteröidy",
"E-mail": "Sähköposti", "E-mail": "Sähköposti",
@@ -458,7 +460,7 @@
"search_filters_apply_button": "Ota valitut suodattimet käyttöön", "search_filters_apply_button": "Ota valitut suodattimet käyttöön",
"search_filters_date_label": "Latausaika", "search_filters_date_label": "Latausaika",
"search_filters_duration_option_medium": "Keskipituinen (4 - 20 minuuttia)", "search_filters_duration_option_medium": "Keskipituinen (4 - 20 minuuttia)",
"search_message_use_another_instance": "Voit myös <a href=\"`x`\">hakea toisella instanssilla</a>.", "search_message_use_another_instance": " Voit myös <a href=\"`x`\">hakea toisella instanssilla</a>.",
"search_filters_date_option_none": "Milloin tahansa", "search_filters_date_option_none": "Milloin tahansa",
"search_filters_type_option_all": "Mikä tahansa tyyppi", "search_filters_type_option_all": "Mikä tahansa tyyppi",
"Popular enabled: ": "Suosittu käytössä: ", "Popular enabled: ": "Suosittu käytössä: ",
@@ -494,8 +496,5 @@
"generic_channels_count_plural": "{{count}} kanavaa", "generic_channels_count_plural": "{{count}} kanavaa",
"The Popular feed has been disabled by the administrator.": "Järjestelmänvalvoja on poistanut Suositut-syötteen.", "The Popular feed has been disabled by the administrator.": "Järjestelmänvalvoja on poistanut Suositut-syötteen.",
"Import YouTube watch history (.json)": "Tuo Youtube-katseluhistoria (.json)", "Import YouTube watch history (.json)": "Tuo Youtube-katseluhistoria (.json)",
"toggle_theme": "Vaihda teemaa", "toggle_theme": "Vaihda teemaa"
"preferences_preload_label": "Esilataa video data. ",
"timeline_parse_error_show_technical_details": "Näytä tekniset yksityiskohdat",
"First page": "Ensimmäinen sivu"
} }

View File

@@ -62,6 +62,8 @@
"User ID": "Identifiant utilisateur", "User ID": "Identifiant utilisateur",
"Password": "Mot de passe", "Password": "Mot de passe",
"Time (h:mm:ss):": "Heure (h:mm:ss) :", "Time (h:mm:ss):": "Heure (h:mm:ss) :",
"Text CAPTCHA": "CAPTCHA textuel",
"Image CAPTCHA": "CAPTCHA pictural",
"Sign In": "S'identifier", "Sign In": "S'identifier",
"Register": "S'inscrire", "Register": "S'inscrire",
"E-mail": "Courriel", "E-mail": "Courriel",
@@ -482,7 +484,7 @@
"search_filters_duration_option_medium": "Moyenne (de 4 à 20 minutes)", "search_filters_duration_option_medium": "Moyenne (de 4 à 20 minutes)",
"search_filters_apply_button": "Appliquer les filtres", "search_filters_apply_button": "Appliquer les filtres",
"search_message_no_results": "Aucun résultat.", "search_message_no_results": "Aucun résultat.",
"search_message_use_another_instance": "Vous pouvez également <a href=\"`x`\">effectuer votre recherche sur une autre instance</a>.", "search_message_use_another_instance": " Vous pouvez également <a href=\"`x`\">effectuer votre recherche sur une autre instance</a>.",
"search_filters_type_option_all": "Tous les types", "search_filters_type_option_all": "Tous les types",
"search_filters_date_label": "Date d'ajout", "search_filters_date_label": "Date d'ajout",
"search_filters_features_option_vr180": "VR180", "search_filters_features_option_vr180": "VR180",
@@ -503,7 +505,7 @@
"channel_tab_releases_label": "Parutions", "channel_tab_releases_label": "Parutions",
"channel_tab_podcasts_label": "Émissions audio", "channel_tab_podcasts_label": "Émissions audio",
"Import YouTube watch history (.json)": "Importer l'historique de visionnement YouTube (.json)", "Import YouTube watch history (.json)": "Importer l'historique de visionnement YouTube (.json)",
"Add to playlist: ": "Ajouter à la playlist : ", "Add to playlist: ": "Ajouter à la playlist: ",
"Add to playlist": "Ajouter à la playlist", "Add to playlist": "Ajouter à la playlist",
"Answer": "Répondre", "Answer": "Répondre",
"Search for videos": "Rechercher des vidéos", "Search for videos": "Rechercher des vidéos",
@@ -511,11 +513,5 @@
"carousel_skip": "Passez le carrousel", "carousel_skip": "Passez le carrousel",
"carousel_slide": "Diapositive {{current}} sur {{total}}", "carousel_slide": "Diapositive {{current}} sur {{total}}",
"carousel_go_to": "Aller à la diapositive `x`", "carousel_go_to": "Aller à la diapositive `x`",
"toggle_theme": "Changer le Thème", "toggle_theme": "Changer le Thème"
"Filipino (auto-generated)": "Philippines (automatiquement générer)",
"preferences_preload_label": "Précharger les données de la vidéo : ",
"First page": "Première page",
"channel_tab_courses_label": "Cours",
"channel_tab_posts_label": "Messages",
"timeline_parse_error_show_technical_details": "Afficher les détails techniques"
} }

View File

@@ -1,506 +0,0 @@
{
"Add to playlist": "Enere Widergabelischte hinzuefüege",
"Add to playlist: ": "Enere Widergabelischte hinzuefüege: ",
"Answer": "Antwort",
"Search for videos": "Nach Videos sueche",
"The Popular feed has been disabled by the administrator.": "De Feed für beliebti Inhält isch vom Administrator deaktiviert worde.",
"generic_channels_count": "{{count}} Kanal",
"generic_channels_count_plural": "{{count}} Kanäl",
"generic_views_count": "{{count}} Uufruef",
"generic_views_count_plural": "{{count}} Uufrüef",
"generic_videos_count": "{{count}} Video",
"generic_videos_count_plural": "{{count}} Videos",
"generic_playlists_count": "{{count}} Widergabelischte",
"generic_playlists_count_plural": "{{count}} Widergabelischtene",
"generic_subscribers_count": "{{count}} Abonnent",
"generic_subscribers_count_plural": "{{count}} Abonnente",
"generic_subscriptions_count": "{{count}} Abo",
"generic_subscriptions_count_plural": "{{count}} Abos",
"generic_button_delete": "Lösche",
"generic_button_edit": "Bearbeite",
"generic_button_save": "Speichere",
"generic_button_cancel": "Abbreche",
"generic_button_rss": "RSS",
"LIVE": "LIVE",
"Shared `x` ago": "Vor `x` teilt",
"Unsubscribe": "Abo beende",
"Subscribe": "Abonniere",
"View channel on YouTube": "Kanal uf YouTube aazeige",
"View playlist on YouTube": "Widergabelischte uf YouTube aazeige",
"newest": "neusti",
"oldest": "ältisti",
"popular": "beliebtisti",
"last": "neusti",
"Next page": "Nächsti Siite",
"Previous page": "Vorherigi Siite",
"First page": "Ersti Siite",
"Clear watch history?": "Widergabeverlauf lösche?",
"New password": "Neus Passwort",
"New passwords must match": "Neui Passwörter müend übereinstimme",
"Authorize token?": "Token autorisiere?",
"Authorize token for `x`?": "Token für `x` autorisiere?",
"Yes": "Ja",
"No": "Nei",
"Import and Export Data": "Date importiere und exportiere",
"Import": "Importiere",
"Import Invidious data": "Invidious-JSON-Date importiere",
"Import YouTube subscriptions": "YouTube-CSV/OPML-Abonnements importiere",
"Import YouTube playlist (.csv)": "YouTube-Widergabelischte importiere (.csv)",
"Import YouTube watch history (.json)": "YouTube-Widergabeverlauf importiere (.json)",
"Import FreeTube subscriptions (.db)": "FreeTube Abonnements importiere (.db)",
"Import NewPipe subscriptions (.json)": "NewPipe Abonnements importiere (.json)",
"Import NewPipe data (.zip)": "NewPipe Date importiere (.zip)",
"Export": "Exportiere",
"Export subscriptions as OPML": "Abonnements als OPML exportiere",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Abonnements als OPML exportiere (für NewPipe & FreeTube)",
"Export data as JSON": "Invidious-Date als JSON exportiere",
"Delete account?": "Konto lösche?",
"History": "Verlauf",
"An alternative front-end to YouTube": "En alternativi Oberflächi für YouTube",
"JavaScript license information": "JavaScript Lizenzinformatione",
"source": "Quelle",
"Log in": "Aamelde",
"Log in/register": "Aamelde/registriere",
"User ID": "Benutzer-ID",
"Password": "Passwort",
"Time (h:mm:ss):": "Ziit (h:mm:ss):",
"Sign In": "Aamelde",
"Register": "Registriere",
"E-mail": "E-Mail",
"Preferences": "Iistellige",
"preferences_category_player": "Widergabeiistellige",
"preferences_video_loop_label": "Immer widerhole: ",
"preferences_preload_label": "Videodate vorlade: ",
"preferences_autoplay_label": "Automatisch abspiele: ",
"preferences_continue_label": "Immer automatisch nächsts Video abspiele: ",
"preferences_continue_autoplay_label": "Nächsts Video automatisch abspiele: ",
"preferences_listen_label": "Nur Ton als Standard: ",
"preferences_local_label": "Videos dur Proxy leite: ",
"preferences_watch_history_label": "Widergabeverlauf aktiviere: ",
"preferences_speed_label": "Standardgschwindigkeit: ",
"preferences_quality_label": "Bevorzugti Videoqualität: ",
"preferences_quality_option_dash": "DASH (adaptivi Qualität)",
"preferences_quality_option_hd720": "HD720",
"preferences_quality_option_medium": "Mittel",
"preferences_quality_option_small": "Niedrig",
"preferences_quality_dash_label": "Bevorzugti DASH-Videoqualität: ",
"preferences_quality_dash_option_auto": "Auto",
"preferences_quality_dash_option_best": "Höchsti",
"preferences_quality_dash_option_worst": "Niedrigsti",
"preferences_quality_dash_option_4320p": "4320p",
"preferences_quality_dash_option_2160p": "2160p",
"preferences_quality_dash_option_1440p": "1440p",
"preferences_quality_dash_option_1080p": "1080p",
"preferences_quality_dash_option_720p": "720p",
"preferences_quality_dash_option_480p": "480p",
"preferences_quality_dash_option_360p": "360p",
"preferences_quality_dash_option_240p": "240p",
"preferences_quality_dash_option_144p": "144p",
"preferences_volume_label": "Widergabeluutstärchi: ",
"preferences_comments_label": "Standardkommentär: ",
"youtube": "YouTube",
"reddit": "Reddit",
"invidious": "Invidious",
"preferences_captions_label": "Standarduntertitel: ",
"Fallback captions: ": "Ersatzuntertitel: ",
"preferences_related_videos_label": "Ähnlichi Videos aazeige: ",
"preferences_annotations_label": "Aamerkige standardmässig aazeige: ",
"preferences_extend_desc_label": "Videobeschriibig automatisch erwiitere: ",
"preferences_vr_mode_label": "Interaktivi 360-Grad-Videos (bruucht WebGL): ",
"preferences_category_visual": "Aazeigeiistellige",
"preferences_region_label": "Land vo de Inhält: ",
"preferences_player_style_label": "Player-Stil: ",
"Dark mode: ": "Nachtmodus: ",
"preferences_dark_mode_label": "Modus: ",
"dark": "Nachtmodus",
"light": "hell",
"preferences_thin_mode_label": "Schlanke Modus: ",
"preferences_category_misc": "Suschtigi Iistellige",
"preferences_automatic_instance_redirect_label": "Automatischi Instanzwiiterleitig (über redirect.invidious.io): ",
"preferences_category_subscription": "Abonnementiistellige",
"preferences_annotations_subscribed_label": "Aamerkige für abonnierti Kanäl standardmässig aazeige? ",
"Redirect homepage to feed: ": "Startsiite zu Feed umleite: ",
"preferences_max_results_label": "Aazahl vo Videos wo im Feed aazeigt werded: ",
"preferences_sort_label": "Videos sortiere nach: ",
"published": "veröffentlicht",
"published - reverse": "veröffentlicht - invertiert",
"alphabetically": "alphabetisch",
"alphabetically - reverse": "alphabetisch - invertiert",
"channel name": "Kanalname",
"channel name - reverse": "Kanalname - invertiert",
"Only show latest video from channel: ": "Nur neusti Videos vom Kanal aazeige: ",
"Only show latest unwatched video from channel: ": "Neu neusti ungseheni Videos vom Kanal aazeige: ",
"preferences_unseen_only_label": "Nur ungseheni aazeige: ",
"preferences_notifications_only_label": "Nur Benachrichtigunge aazeige (wenns welchi git): ",
"Enable web notifications": "Webbenachrichtigunge aktiviere",
"`x` uploaded a video": "`x` het es Video ufeglade",
"`x` is live": "`x` isch live",
"preferences_category_data": "Dateiistellige",
"Clear watch history": "Verlauf lösche",
"Import/export data": "Date importiere/exportiere",
"Change password": "Passwort ändere",
"Manage subscriptions": "Abonnements verwalte",
"Manage tokens": "Tokens verwalte",
"Watch history": "Widergabeverlauf",
"Delete account": "Account lösche",
"preferences_category_admin": "Administrator-Iistellige",
"preferences_default_home_label": "Standard-Startsiite: ",
"preferences_feed_menu_label": "Feed-Menü: ",
"preferences_show_nick_label": "Nutzernäme obe aazeige: ",
"Popular enabled: ": "„Beliebt“-Siite aktiviert: ",
"Top enabled: ": "Top aktiviert? ",
"CAPTCHA enabled: ": "CAPTCHA aktiviert? ",
"Login enabled: ": "Aameldig aktiviert: ",
"Registration enabled: ": "Registrierig aktiviert: ",
"Report statistics: ": "Statistike brichte: ",
"Save preferences": "Iistellige speichere",
"Subscription manager": "Abonnementsverwaltig",
"Token manager": "Tokenverwaltig",
"Token": "Token",
"tokens_count": "{{count}} Token",
"tokens_count_plural": "{{count}} Tokens",
"Import/export": "Importiere/Exportiere",
"unsubscribe": "abbstelle",
"revoke": "widerrüefe",
"Subscriptions": "Abonnements",
"subscriptions_unseen_notifs_count": "{{count}} ungsehni Benachrichtigung",
"subscriptions_unseen_notifs_count_plural": "{{count}} ungsehni Benachrichtigunge",
"search": "Sueche",
"Log out": "Abmelde",
"Released under the AGPLv3 on Github.": "Uf GitHub under de AGPLv3 Lizenz veröffentlicht.",
"Source available here.": "Quellcode da verfüegbar.",
"View JavaScript license information.": "JavaScript-Lizenzinformatione aazeige.",
"View privacy policy.": "Dateschutzerchlärig iigseh.",
"Trending": "Aagseit",
"Public": "Öffentlich",
"Unlisted": "Nöd glischtet",
"Private": "Privat",
"View all playlists": "Alli Widergabelischtene aazeige",
"Updated `x` ago": "Aktualisiert vor `x`",
"Delete playlist `x`?": "Widergabelischte `x` lösche?",
"Delete playlist": "Widergabelischte lösche",
"Create playlist": "Widergabelischte erstelle",
"Title": "Titel",
"Playlist privacy": "Widergabelischte-Privatsphäri",
"Editing playlist `x`": "Widergabelischte `x` bearbeite",
"playlist_button_add_items": "Videos hinzuefüege",
"Show more": "Meh aazeige",
"Show less": "Weniger aazeige",
"Watch on YouTube": "Video uf YouTube aaluege",
"Switch Invidious Instance": "Invidious Instanz wechsle",
"search_message_no_results": "Kei Ergebnis gfunde.",
"search_message_change_filters_or_query": "Versuech, dini Suechaafrag z erwiitere und/oder d Filter z ändere.",
"search_message_use_another_instance": "Du chasch au <a href=\"`x`\">uf ere andere Instanz sueche</a>.",
"Hide annotations": "Aamerkige uusblende",
"Show annotations": "Aamerkige aazeige",
"Genre: ": "Genre: ",
"License: ": "Lizenz: ",
"Standard YouTube license": "Standard YouTube-Lizenz",
"Family friendly? ": "Familiefründlich? ",
"Wilson score: ": "Wilson-Score: ",
"Engagement: ": "Engagement: ",
"Whitelisted regions: ": "Erlaubti Regione: ",
"Blacklisted regions: ": "Unerlaubti Regione: ",
"Music in this video": "Musig i dem Video",
"Artist: ": "Künschtler: ",
"Song: ": "Musig: ",
"Album: ": "Album: ",
"Shared `x`": "Teilt `x`",
"Premieres in `x`": "Premiere i `x`",
"Premieres `x`": "Premiere `x`",
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Hallo! Anschinend hesch du JavaScript deaktiviert. Klick da, zum Kommentär aazzeige, beacht, dass es chli länger duure cha, zum sie z lade.",
"View YouTube comments": "YouTube Kommentär aazeige",
"View more comments on Reddit": "Meh Kommentär uf Reddit aazeige",
"View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` Kommentar aazeige",
"": "`x` Kommentär aazeige"
},
"View Reddit comments": "Reddit-Kommentär aazeige",
"Hide replies": "Antworte verstecke",
"Show replies": "Antworte aazeige",
"Incorrect password": "Falschs Passwort",
"Wrong answer": "Ungültigi Antwort",
"Erroneous CAPTCHA": "Ungültigs CAPTCHA",
"CAPTCHA is a required field": "CAPTCHA isch en erforderlichi Iigab",
"User ID is a required field": "Benutzer ID isch en erforderlichi Iigab",
"Password is a required field": "Passwort isch en erforderlichi Iigab",
"Wrong username or password": "Ungültige Benutzername oder Passwort",
"Password cannot be empty": "Passwort derf nöd leer sii",
"Password cannot be longer than 55 characters": "Passwort derf nöd länger als 55 Zeiche sii",
"Please log in": "Bitte aamelde",
"Invidious Private Feed for `x`": "Invidious Persönliche Feed für `x`",
"channel:`x`": "Kanal:`x`",
"Deleted or invalid channel": "Glöschte oder ungültige Kanal",
"This channel does not exist.": "De Kanal existiert nöd.",
"Could not get channel info.": "Kanalinformatione hend nöd chönne glade werde.",
"Could not fetch comments": "Kommentär hend nöd chönne glade werde",
"comments_view_x_replies": "{{count}} Antwort aazeige",
"comments_view_x_replies_plural": "{{count}} Antworte aazeige",
"`x` ago": "vor `x`",
"Load more": "Meh lade",
"comments_points_count": "{{count}} Punkt",
"comments_points_count_plural": "{{count}} Pünkt",
"Could not create mix.": "Mix het nöd chönne erstellt werde.",
"Empty playlist": "Widergabelischte isch leer",
"Not a playlist.": "Ungültigi Widergabelischte.",
"Playlist does not exist.": "Widergabelischte existiert nöd.",
"Could not pull trending pages.": "Beliebt-Siitene hend nöd chönne glade werde.",
"Hidden field \"challenge\" is a required field": "Versteckts Feld „challenge“ isch en erforderlichi Iigab",
"Hidden field \"token\" is a required field": "Versteckts Feld „token“ isch en erforderlichi Iigab",
"Erroneous challenge": "Ungültige Test",
"Erroneous token": "Ungültige Token",
"No such user": "Ungültige Benutzer",
"Token is expired, please try again": "Token isch abgloffe, bitte nomal versueche",
"generic_count_years": "{{count}} Jahr",
"generic_count_years_plural": "{{count}} Jahr",
"generic_count_months": "{{count}} Monet",
"generic_count_months_plural": "{{count}} Mönet",
"generic_count_weeks": "{{count}} Wuche",
"generic_count_weeks_plural": "{{count}} Wuche",
"generic_count_days": "{{count}} Tag",
"generic_count_days_plural": "{{count}} Täg",
"generic_count_hours": "{{count}} Stund",
"generic_count_hours_plural": "{{count}} Stunde",
"generic_count_minutes": "{{count}} Minute",
"generic_count_minutes_plural": "{{count}} Minute",
"generic_count_seconds": "{{count}} Sekunde",
"generic_count_seconds_plural": "{{count}} Sekunde",
"Fallback comments: ": "Alternativi Kommentär: ",
"Popular": "Populär",
"Search": "Sueche",
"Top": "Top",
"About": "Über",
"Rating: ": "Bewertig: ",
"preferences_locale_label": "Spraach: ",
"View as playlist": "Als Widergabelischte aazeige",
"Default": "Standard",
"Music": "Musig",
"Gaming": "Videospiel",
"News": "Neuigkeite",
"Movies": "Film",
"Download": "Abelade",
"Download as: ": "Abelade als: ",
"Download is disabled": "Abelade isch deaktiviert",
"%A %B %-d, %Y": "%A %-d %B %Y",
"(edited)": "(bearbeitet)",
"YouTube comment permalink": "YouTube-Kommentar Permalink",
"permalink": "Permalink",
"`x` marked it with a ❤": "`x` hets mitme ❤ markiert",
"Channel Sponsor": "Kanalsponsor",
"Audio mode": "Audiomodus",
"Video mode": "Videomodus",
"Playlists": "Widergabelischtene",
"search_filters_title": "Filtere",
"search_filters_date_label": "Upload-Datum",
"search_filters_date_option_none": "Bliebigs Datum",
"search_filters_date_option_hour": "Letschti Stund",
"search_filters_date_option_today": "Hüt",
"search_filters_date_option_week": "Die Wuche",
"search_filters_date_option_month": "De Monet",
"search_filters_date_option_year": "Das Jahr",
"search_filters_type_label": "Inhaltstyp",
"search_filters_type_option_all": "Bliebige Typ",
"search_filters_type_option_video": "Video",
"search_filters_type_option_channel": "Kanal",
"search_filters_type_option_playlist": "Widergabelischte",
"search_filters_type_option_movie": "Film",
"search_filters_type_option_show": "Aazeige",
"search_filters_duration_label": "Duur",
"search_filters_duration_option_none": "Bliebigi Längi",
"search_filters_duration_option_short": "Churz (< 4 Minute)",
"search_filters_duration_option_medium": "Mittel (4 - 20 Minute)",
"search_filters_duration_option_long": "Lang (> 20 Minute)",
"search_filters_features_label": "Eigeschafte",
"search_filters_features_option_live": "Live",
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_hd": "HD",
"search_filters_features_option_subtitles": "Untertitel/CC",
"search_filters_features_option_c_commons": "Creative Commons",
"search_filters_features_option_three_sixty": "360°",
"search_filters_features_option_vr180": "VR180",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_hdr": "HDR",
"search_filters_features_option_location": "Standort",
"search_filters_features_option_purchased": "Kauft",
"search_filters_sort_label": "Sortiere nach",
"search_filters_sort_option_relevance": "Relevanz",
"search_filters_sort_option_rating": "Bewertig",
"search_filters_sort_option_date": "Ueladedatum",
"search_filters_sort_option_views": "Uufrüef",
"search_filters_apply_button": "Uusgwählti Filter aawende",
"Current version: ": "Aktuelli Version: ",
"next_steps_error_message": "Nachher das versueche: ",
"next_steps_error_message_refresh": "Aktualisiere",
"next_steps_error_message_go_to_youtube": "Zu YouTube gah",
"footer_donate_page": "Spende",
"footer_documentation": "Dokumentation",
"footer_source_code": "Quellcode",
"footer_original_source_code": "Original Quellcode",
"footer_modfied_source_code": "Modifizierte Quellcode",
"adminprefs_modified_source_code_url_label": "URL zum Repository vom modifizierte Quellcode",
"none": "kei",
"videoinfo_started_streaming_x_ago": "Stream het vor `x` aagfange",
"videoinfo_watch_on_youTube": "Uf YouTube aaluege",
"videoinfo_youTube_embed_link": "Iibettet",
"videoinfo_invidious_embed_link": "Link zum Iibette",
"download_subtitles": "Untertitel - `x` (.vtt)",
"user_created_playlists": "`x` Widergabelischtene erstellt",
"user_saved_playlists": "`x` Widergabelischtene gspeicheret",
"Video unavailable": "Video nöd verfüegbar",
"preferences_save_player_pos_label": "Widergabeposition speichere: ",
"crash_page_you_found_a_bug": "Anschinend hesch du en Fehler in Invidious gfunde!",
"crash_page_before_reporting": "Bevor du en Bug meldsch, stell sicher, dass du:",
"crash_page_refresh": "Versuecht hesch, <a href=\"`x`\">d Siite neu z lade</a>",
"crash_page_switch_instance": "En <a href=\"`x`\">anderi Instanz</a> versuecht hesch",
"crash_page_read_the_faq": "S <a href=\"`x`\">FAQ</a> glese hesch",
"crash_page_search_issue": "Nach <a href=\"`x`\">scho gmeldete Bugs uf GitHub</a> gsuecht hesch",
"crash_page_report_issue": "Wenn all das nöd ghulfe het, <a href=\"`x`\">öffne bitte es neus Problem (issue) uf GitHub</a> (vorzugswiis uf Englisch) und füeg de folgendi Text i dini Nachricht ii (bitte übersetz de Text NÖD):",
"error_video_not_in_playlist": "S agforderete Video existiert nöd i dere Widergabelischte. <a href=\"`x`\">Klick da, zum zur Startsiite vo de Widergabelischte z cho.</a>",
"channel_tab_videos_label": "Videos",
"channel_tab_shorts_label": "Shorts",
"channel_tab_streams_label": "Livestreams",
"channel_tab_podcasts_label": "Podcasts",
"channel_tab_releases_label": "Veröffentlichige",
"channel_tab_courses_label": "Kürs",
"channel_tab_playlists_label": "Widergabelischtene",
"channel_tab_community_label": "Community",
"channel_tab_posts_label": "Biiträg",
"channel_tab_channels_label": "Kanäl",
"toggle_theme": "Thema wechsle",
"carousel_slide": "Siite {{current}} vo {{total}}",
"carousel_skip": "Galerie überspringe",
"carousel_go_to": "Zu Element `x` springe",
"timeline_parse_error_placeholder_heading": "Element cha nöd parsed werde",
"timeline_parse_error_placeholder_message": "Invidious isch bim Parse vo dem Element uf en Fehler gstosse. Für wiiteri Information lueg da une:",
"timeline_parse_error_show_technical_details": "Technischi Details aazeige",
"English": "Englisch",
"English (United Kingdom)": "Englisch (Vereinigts Königriich)",
"English (United States)": "Englisch (Vereinigti Staate)",
"English (auto-generated)": "Englisch (automatisch generiert)",
"Afrikaans": "Afrikaans",
"Albanian": "Albanisch",
"Amharic": "Amharisch",
"Arabic": "Arabisch",
"Armenian": "Armenisch",
"Azerbaijani": "Aserbaidschanisch",
"Bangla": "Bengalisch",
"Basque": "Baskisch",
"Belarusian": "Wiissrussisch",
"Bosnian": "Bosnisch",
"Bulgarian": "Bulgarisch",
"Burmese": "Burmesisch",
"Cantonese (Hong Kong)": "Kantonesisch (Hong Kong)",
"Catalan": "Katalanisch",
"Cebuano": "Cebuano",
"Chinese": "Chinesisch",
"Chinese (China)": "Chinesisch (China)",
"Chinese (Hong Kong)": "Chinesisch (Hong Kong)",
"Chinese (Simplified)": "Chinesisch (vereifacht)",
"Chinese (Taiwan)": "Chinesisch (Taiwan)",
"Chinese (Traditional)": "Chinesisch (traditionell)",
"Corsican": "Korsisch",
"Croatian": "Kroatisch",
"Czech": "Tschechisch",
"Danish": "Dänisch",
"Dutch": "Niederländisch",
"Dutch (auto-generated)": "Niederländisch (automatisch generiert)",
"Esperanto": "Esperanto",
"Estonian": "Estnisch",
"Filipino": "Philippinisch",
"Filipino (auto-generated)": "Philippinisch (automatisch generiert)",
"Finnish": "Finnisch",
"French": "Französisch",
"French (auto-generated)": "Französisch (automatisch generiert)",
"Galician": "Galizisch",
"Georgian": "Gerogisch",
"German": "Dütsch",
"German (auto-generated)": "Dütsch (automatisch generiert)",
"Greek": "Griechisch",
"Gujarati": "Gujarati",
"Haitian Creole": "Haitianischs Kreolisch",
"Hausa": "Hausa",
"Hawaiian": "Hawaiianisch",
"Hebrew": "Hebräisch",
"Hindi": "Hindi",
"Hmong": "Hmong",
"Hungarian": "Ungarisch",
"Icelandic": "Isländisch",
"Igbo": "Igbo",
"Indonesian": "Indonesisch",
"Indonesian (auto-generated)": "Indonesisch (automatisch generiert)",
"Interlingue": "Interlingue",
"Irish": "Irisch",
"Italian": "Italienisch",
"Italian (auto-generated)": "Italienisch (automatisch generiert)",
"Japanese": "Japanisch",
"Japanese (auto-generated)": "Japanisch (automatisch generiert)",
"Javanese": "Javanisch",
"Kannada": "Kannada",
"Kazakh": "Kasachisch",
"Khmer": "Khmer",
"Korean": "Koreanisch",
"Korean (auto-generated)": "Koreanisch (automatisch generiert)",
"Kurdish": "Kurdisch",
"Kyrgyz": "Kirgisisch",
"Lao": "Laotisch",
"Latin": "Latinisch",
"Latvian": "Lettisch",
"Lithuanian": "Litauisch",
"Luxembourgish": "Luxeburgisch",
"Macedonian": "Mazedonisch",
"Malagasy": "Madagassisch",
"Malay": "Malaiisch",
"Malayalam": "Malayalam",
"Maltese": "Maltesisch",
"Maori": "Maori",
"Marathi": "Marathi",
"Mongolian": "Mongolisch",
"Nepali": "Nepalesisch",
"Norwegian Bokmål": "Norwegisch",
"Nyanja": "Nyanja",
"Pashto": "Paschtunisch",
"Persian": "Persisch",
"Polish": "Polnisch",
"Portuguese": "Portugiesisch",
"Portuguese (auto-generated)": "Portugiesisch (automatisch generiert)",
"Portuguese (Brazil)": "Portugiesisch (Brasilie)",
"Punjabi": "Pandschabi",
"Romanian": "Rumänisch",
"Russian": "Russisch",
"Russian (auto-generated)": "Russisch (automatisch generiert)",
"Samoan": "Samoanisch",
"Scottish Gaelic": "Schottischs Gällisch",
"Serbian": "Serbisch",
"Shona": "Schona",
"Sindhi": "Sindhi",
"Sinhala": "Singhalesisch",
"Slovak": "Slowakisch",
"Slovenian": "Slowenisch",
"Somali": "Somali",
"Southern Sotho": "Südlichs Sotho",
"Spanish": "Spanisch",
"Spanish (auto-generated)": "Spanisch (automatisch generiert)",
"Spanish (Latin America)": "Spanisch (Latinamerika)",
"Spanish (Mexico)": "Spanisch (Mexiko)",
"Spanish (Spain)": "Spanisch (Spanie)",
"Sundanese": "Sundanesisch",
"Swahili": "Suaheli",
"Swedish": "Schwedisch",
"Tajik": "Tadschikisch",
"Tamil": "Tamilisch",
"Telugu": "Telugu",
"Thai": "Thailändisch",
"Turkish": "Türkisch",
"Turkish (auto-generated)": "Türkisch (automatisch generiert)",
"Ukrainian": "Ukrainisch",
"Urdu": "Urdu",
"Uzbek": "Usbekisch",
"Vietnamese": "Vietnamesisch",
"Vietnamese (auto-generated)": "Vietnamesisch (automatisch generiert)",
"Welsh": "Walisisch",
"Western Frisian": "Weschtfriesisch",
"Xhosa": "Xhosa",
"Yiddish": "Jiddisch",
"Yoruba": "Joruba",
"Zulu": "Zulu"
}

View File

@@ -39,6 +39,8 @@
"User ID": "שם משתמש", "User ID": "שם משתמש",
"Password": "סיסמה", "Password": "סיסמה",
"Time (h:mm:ss):": "זמן (h:mm:ss):", "Time (h:mm:ss):": "זמן (h:mm:ss):",
"Text CAPTCHA": "Text CAPTCHA",
"Image CAPTCHA": "Image CAPTCHA",
"Sign In": "התחברות", "Sign In": "התחברות",
"Register": "הרשמה", "Register": "הרשמה",
"E-mail": "דוא״ל", "E-mail": "דוא״ל",

View File

@@ -80,6 +80,8 @@
"Register": "पंजीकृत करें", "Register": "पंजीकृत करें",
"E-mail": "ईमेल", "E-mail": "ईमेल",
"Time (h:mm:ss):": "समय (घं:मिमि:सेसे):", "Time (h:mm:ss):": "समय (घं:मिमि:सेसे):",
"Text CAPTCHA": "टेक्स्ट CAPTCHA",
"Image CAPTCHA": "चित्र CAPTCHA",
"Sign In": "साइन इन करें", "Sign In": "साइन इन करें",
"Preferences": "प्राथमिकताएँ", "Preferences": "प्राथमिकताएँ",
"preferences_category_player": "प्लेयर की प्राथमिकताएँ", "preferences_category_player": "प्लेयर की प्राथमिकताएँ",
@@ -197,7 +199,7 @@
"Switch Invidious Instance": "Invidious उदाहरण बदलें", "Switch Invidious Instance": "Invidious उदाहरण बदलें",
"search_message_no_results": "कोई परिणाम नहीं मिला।", "search_message_no_results": "कोई परिणाम नहीं मिला।",
"search_message_change_filters_or_query": "अपने खोज क्वेरी को और चौड़ा करें और/या फ़िल्टर बदलें।", "search_message_change_filters_or_query": "अपने खोज क्वेरी को और चौड़ा करें और/या फ़िल्टर बदलें।",
"search_message_use_another_instance": "आप <a href=\"`x`\">दूसरे उदाहरण पर भी खोज सकते हैं</a>।", "search_message_use_another_instance": " आप <a href=\"`x`\">दूसरे उदाहरण पर भी खोज सकते हैं</a>।",
"Hide annotations": "टिप्पणियाँ छिपाएँ", "Hide annotations": "टिप्पणियाँ छिपाएँ",
"Show annotations": "टिप्पणियाँ दिखाएँ", "Show annotations": "टिप्पणियाँ दिखाएँ",
"Genre: ": "श्रेणी: ", "Genre: ": "श्रेणी: ",
@@ -432,7 +434,7 @@
"search_filters_features_option_location": "जगह", "search_filters_features_option_location": "जगह",
"search_filters_features_option_purchased": "खरीदा गया", "search_filters_features_option_purchased": "खरीदा गया",
"search_filters_sort_label": "इस क्रम से लगाएँ", "search_filters_sort_label": "इस क्रम से लगाएँ",
"search_filters_sort_option_date": "अपलोड की ताीख", "search_filters_sort_option_date": "अपलोड की ताीख",
"search_filters_sort_option_views": "देखे जाने की संख्या", "search_filters_sort_option_views": "देखे जाने की संख्या",
"search_filters_apply_button": "चयनित फ़िल्टर लागू करें", "search_filters_apply_button": "चयनित फ़िल्टर लागू करें",
"footer_documentation": "प्रलेख", "footer_documentation": "प्रलेख",
@@ -474,7 +476,7 @@
"generic_button_cancel": "रद्द करें", "generic_button_cancel": "रद्द करें",
"generic_button_rss": "आरएसएस", "generic_button_rss": "आरएसएस",
"generic_button_edit": "संपादित करें", "generic_button_edit": "संपादित करें",
"generic_button_delete": "हटाए", "generic_button_delete": "हटाए",
"playlist_button_add_items": "वीडियो जोड़ें", "playlist_button_add_items": "वीडियो जोड़ें",
"Song: ": "गाना: ", "Song: ": "गाना: ",
"channel_tab_podcasts_label": "पाॅडकास्ट", "channel_tab_podcasts_label": "पाॅडकास्ट",
@@ -494,13 +496,5 @@
"carousel_skip": "कैरोसेल छोड़ें", "carousel_skip": "कैरोसेल छोड़ें",
"Add to playlist: ": "प्लेलिस्ट में जोड़ें: ", "Add to playlist: ": "प्लेलिस्ट में जोड़ें: ",
"Search for videos": "वीडियो खोजें", "Search for videos": "वीडियो खोजें",
"carousel_go_to": "स्लाइड `x` पर जाएँ", "carousel_go_to": "स्लाइड `x` पर जाएँ"
"First page": "पहला पृष्ठ",
"preferences_preload_label": "वीडियो डेटा प्रीलोड करें: ",
"Filipino (auto-generated)": "फ़िलिपीनो (अपने-आप जनरेट हुआ)",
"channel_tab_courses_label": "कोर्स",
"channel_tab_posts_label": "पोस्ट",
"timeline_parse_error_placeholder_heading": "आयटम को पार्स नहीं किया जा सका",
"timeline_parse_error_placeholder_message": "इस आयटम को पार्स करते समय Invidious को एक त्रुटि आई। अधिक जानकारी के लिए नीचे देखें:",
"timeline_parse_error_show_technical_details": "तकनीकी जानकारी दिखाएँ"
} }

View File

@@ -39,6 +39,8 @@
"User ID": "Korisnički ID", "User ID": "Korisnički ID",
"Password": "Lozinka", "Password": "Lozinka",
"Time (h:mm:ss):": "Vrijeme (h:mm:ss):", "Time (h:mm:ss):": "Vrijeme (h:mm:ss):",
"Text CAPTCHA": "Tekstualni CAPTCHA",
"Image CAPTCHA": "Slikovni CAPTCHA",
"Sign In": "Prijavi se", "Sign In": "Prijavi se",
"Register": "Registriraj se", "Register": "Registriraj se",
"E-mail": "E-mail adresa", "E-mail": "E-mail adresa",
@@ -447,30 +449,30 @@
"Cantonese (Hong Kong)": "Kantonski (Hong Kong)", "Cantonese (Hong Kong)": "Kantonski (Hong Kong)",
"Chinese": "Kineski", "Chinese": "Kineski",
"Chinese (Taiwan)": "Kineski (Tajvan)", "Chinese (Taiwan)": "Kineski (Tajvan)",
"Dutch (auto-generated)": "Nizozemski (automatski generirano)", "Dutch (auto-generated)": "Nizozemski (automatski generiran)",
"French (auto-generated)": "Francuski (automatski generirano)", "French (auto-generated)": "Francuski (automatski generiran)",
"Indonesian (auto-generated)": "Indonezijski (automatski generirano)", "Indonesian (auto-generated)": "Indonezijski (automatski generiran)",
"Interlingue": "Interlingua", "Interlingue": "Interlingua",
"Japanese (auto-generated)": "Japanski (automatski generirano)", "Japanese (auto-generated)": "Japanski (automatski generiran)",
"Russian (auto-generated)": "Ruski (automatski generirano)", "Russian (auto-generated)": "Ruski (automatski generiran)",
"Turkish (auto-generated)": "Turski (automatski generirano)", "Turkish (auto-generated)": "Turski (automatski generiran)",
"Vietnamese (auto-generated)": "Vijetnamski (automatski generirano)", "Vietnamese (auto-generated)": "Vijetnamski (automatski generiran)",
"Spanish (Spain)": "Španjolski (Španjolska)", "Spanish (Spain)": "Španjolski (Španjolska)",
"Italian (auto-generated)": "Talijanski (automatski generirano)", "Italian (auto-generated)": "Talijanski (automatski generiran)",
"Portuguese (Brazil)": "Portugalski (Brazil)", "Portuguese (Brazil)": "Portugalski (Brazil)",
"Spanish (Mexico)": "Španjolski (Meksiko)", "Spanish (Mexico)": "Španjolski (Meksiko)",
"German (auto-generated)": "Njemački (automatski generirano)", "German (auto-generated)": "Njemački (automatski generiran)",
"Chinese (China)": "Kineski (Kina)", "Chinese (China)": "Kineski (Kina)",
"Chinese (Hong Kong)": "Kineski (Hong Kong)", "Chinese (Hong Kong)": "Kineski (Hong Kong)",
"Korean (auto-generated)": "Korejski (automatski generirano)", "Korean (auto-generated)": "Korejski (automatski generiran)",
"Portuguese (auto-generated)": "Portugalski (automatski generirano)", "Portuguese (auto-generated)": "Portugalski (automatski generiran)",
"Spanish (auto-generated)": "Španjolski (automatski generirano)", "Spanish (auto-generated)": "Španjolski (automatski generiran)",
"preferences_watch_history_label": "Aktiviraj povijest gledanja: ", "preferences_watch_history_label": "Aktiviraj povijest gledanja: ",
"search_filters_title": "Filtri", "search_filters_title": "Filtri",
"search_filters_date_option_none": "Bilo koji datum", "search_filters_date_option_none": "Bilo koji datum",
"search_filters_date_label": "Datum prijenosa", "search_filters_date_label": "Datum prijenosa",
"search_message_no_results": "Nema rezultata.", "search_message_no_results": "Nema rezultata.",
"search_message_use_another_instance": "Također možeš <a href=\"`x`\">tražiti na jednoj drugoj instanci</a>.", "search_message_use_another_instance": " Također možeš <a href=\"`x`\">tražiti na jednoj drugoj instanci</a>.",
"search_message_change_filters_or_query": "Pokušaj proširiti upit za pretragu i/ili promijeni filtre.", "search_message_change_filters_or_query": "Pokušaj proširiti upit za pretragu i/ili promijeni filtre.",
"search_filters_features_option_vr180": "VR180", "search_filters_features_option_vr180": "VR180",
"search_filters_duration_option_none": "Bilo koje duljine", "search_filters_duration_option_none": "Bilo koje duljine",
@@ -511,13 +513,5 @@
"toggle_theme": "Uklj./Isklj. temu", "toggle_theme": "Uklj./Isklj. temu",
"carousel_slide": "Kadar {{current}} od {{total}}", "carousel_slide": "Kadar {{current}} od {{total}}",
"carousel_go_to": "Idi na kadar `x`", "carousel_go_to": "Idi na kadar `x`",
"carousel_skip": "Preskoči vrtuljak", "carousel_skip": "Preskoči vrtuljak"
"Filipino (auto-generated)": "Filipinski (automatski generirano)",
"preferences_preload_label": "Unaprijed učitaj podatke videa: ",
"channel_tab_posts_label": "Objave",
"timeline_parse_error_placeholder_heading": "Nije moguće obraditi stavku",
"timeline_parse_error_placeholder_message": "Invidious je naišao na grešku prilikom obrade ove stavke. Za više informacija pogledajte niže dolje:",
"timeline_parse_error_show_technical_details": "Prikaži tehničke detalje",
"First page": "Prva stranica",
"channel_tab_courses_label": "Tečajevi"
} }

View File

@@ -49,6 +49,8 @@
"User ID": "Felhasználói azonosító", "User ID": "Felhasználói azonosító",
"Password": "Jelszó", "Password": "Jelszó",
"Time (h:mm:ss):": "A pontos idő (ó:pp:mm):", "Time (h:mm:ss):": "A pontos idő (ó:pp:mm):",
"Text CAPTCHA": "Szöveges CAPTCHA kérése",
"Image CAPTCHA": "Kép CAPTCHA kérése",
"Sign In": "Bejelentkezés", "Sign In": "Bejelentkezés",
"Register": "Regisztrálás", "Register": "Regisztrálás",
"E-mail": "E-mail-cím", "E-mail": "E-mail-cím",

View File

@@ -5,8 +5,9 @@
"oldest": "plus ancian", "oldest": "plus ancian",
"published": "data de publication", "published": "data de publication",
"invidious": "Invidious", "invidious": "Invidious",
"Image CAPTCHA": "Imagine CAPTCHA",
"newest": "plus nove", "newest": "plus nove",
"generic_button_save": "Salveguardar", "generic_button_save": "Salvar",
"Dark mode: ": "Modo obscur: ", "Dark mode: ": "Modo obscur: ",
"preferences_dark_mode_label": "Thema: ", "preferences_dark_mode_label": "Thema: ",
"preferences_category_subscription": "Preferentias de subscription", "preferences_category_subscription": "Preferentias de subscription",
@@ -22,7 +23,7 @@
"light": "clar", "light": "clar",
"No": "Non", "No": "Non",
"youtube": "YouTube", "youtube": "YouTube",
"LIVE": "IN DIRECTO", "LIVE": "IN DIRECTE",
"reddit": "Reddit", "reddit": "Reddit",
"preferences_category_player": "Preferentias de reproductor", "preferences_category_player": "Preferentias de reproductor",
"Preferences": "Preferentias", "Preferences": "Preferentias",

View File

@@ -44,6 +44,8 @@
"User ID": "ID Pengguna", "User ID": "ID Pengguna",
"Password": "Kata Sandi", "Password": "Kata Sandi",
"Time (h:mm:ss):": "Waktu (j:mm:dd):", "Time (h:mm:ss):": "Waktu (j:mm:dd):",
"Text CAPTCHA": "Teks CAPTCHA",
"Image CAPTCHA": "Gambar CAPTCHA",
"Sign In": "Masuk", "Sign In": "Masuk",
"Register": "Daftar", "Register": "Daftar",
"E-mail": "Surel", "E-mail": "Surel",

View File

@@ -2,7 +2,7 @@
"LIVE": "BEINT", "LIVE": "BEINT",
"Shared `x` ago": "Deilt fyrir `x` síðan", "Shared `x` ago": "Deilt fyrir `x` síðan",
"Unsubscribe": "Afskrá", "Unsubscribe": "Afskrá",
"Subscribe": "Setja í áskrift", "Subscribe": "Áskrifa",
"View channel on YouTube": "Skoða rás á YouTube", "View channel on YouTube": "Skoða rás á YouTube",
"View playlist on YouTube": "Skoða spilunarlista á YouTube", "View playlist on YouTube": "Skoða spilunarlista á YouTube",
"newest": "nýjasta", "newest": "nýjasta",
@@ -14,8 +14,8 @@
"Clear watch history?": "Hreinsa áhorfsferil?", "Clear watch history?": "Hreinsa áhorfsferil?",
"New password": "Nýtt lykilorð", "New password": "Nýtt lykilorð",
"New passwords must match": "Nýtt lykilorð verður að passa", "New passwords must match": "Nýtt lykilorð verður að passa",
"Authorize token?": "Auðkenna teikn?", "Authorize token?": "Leyfa teikn?",
"Authorize token for `x`?": "Auðkenna teikn fyrir `x`?", "Authorize token for `x`?": "Leyfa teikn fyrir `x`?",
"Yes": "Já", "Yes": "Já",
"No": "Nei", "No": "Nei",
"Import and Export Data": "Inn- og útflutningur gagna", "Import and Export Data": "Inn- og útflutningur gagna",
@@ -36,15 +36,17 @@
"source": "uppruni", "source": "uppruni",
"Log in": "Skrá inn", "Log in": "Skrá inn",
"Log in/register": "Innskráning/nýskráning", "Log in/register": "Innskráning/nýskráning",
"User ID": "Auðkenni notanda", "User ID": "Notandakenni",
"Password": "Lykilorð", "Password": "Lykilorð",
"Time (h:mm:ss):": "Tími (h:mm: ss):", "Time (h:mm:ss):": "Tími (h:mm: ss):",
"Text CAPTCHA": "Texta CAPTCHA",
"Image CAPTCHA": "Mynd CAPTCHA",
"Sign In": "Skrá inn", "Sign In": "Skrá inn",
"Register": "Nýskrá", "Register": "Nýskrá",
"E-mail": "Tölvupóstur", "E-mail": "Tölvupóstur",
"Preferences": "Kjörstillingar", "Preferences": "Kjörstillingar",
"preferences_category_player": "Kjörstillingar spilara", "preferences_category_player": "Kjörstillingar spilara",
"preferences_video_loop_label": "Alltaf endurtaka: ", "preferences_video_loop_label": "Alltaf lykkja: ",
"preferences_autoplay_label": "Sjálfvirk spilun: ", "preferences_autoplay_label": "Sjálfvirk spilun: ",
"preferences_continue_label": "Spila næst sjálfgefið: ", "preferences_continue_label": "Spila næst sjálfgefið: ",
"preferences_continue_autoplay_label": "Spila næsta myndskeið sjálfkrafa: ", "preferences_continue_autoplay_label": "Spila næsta myndskeið sjálfkrafa: ",
@@ -83,7 +85,7 @@
"preferences_unseen_only_label": "Sýna aðeins óséð: ", "preferences_unseen_only_label": "Sýna aðeins óséð: ",
"preferences_notifications_only_label": "Sýna aðeins tilkynningar (ef einhverjar eru): ", "preferences_notifications_only_label": "Sýna aðeins tilkynningar (ef einhverjar eru): ",
"Enable web notifications": "Virkja veftilkynningar", "Enable web notifications": "Virkja veftilkynningar",
"`x` uploaded a video": "`x` sendi inn myndskeið", "`x` uploaded a video": "`x` hlóð upp myndband",
"`x` is live": "`x` er í beinni", "`x` is live": "`x` er í beinni",
"preferences_category_data": "Gagnastillingar", "preferences_category_data": "Gagnastillingar",
"Clear watch history": "Hreinsa áhorfsferil", "Clear watch history": "Hreinsa áhorfsferil",
@@ -102,8 +104,8 @@
"Registration enabled: ": "Nýskráning virkjuð? ", "Registration enabled: ": "Nýskráning virkjuð? ",
"Report statistics: ": "Skrá tölfræði? ", "Report statistics: ": "Skrá tölfræði? ",
"Save preferences": "Vista stillingar", "Save preferences": "Vista stillingar",
"Subscription manager": "Áskriftastýring", "Subscription manager": "Áskriftarstjóri",
"Token manager": "Teiknastýring", "Token manager": "Teiknastjórnun",
"Token": "Teikn", "Token": "Teikn",
"Import/export": "Flytja inn/út", "Import/export": "Flytja inn/út",
"unsubscribe": "afskrá", "unsubscribe": "afskrá",
@@ -231,7 +233,7 @@
"Korean": "Kóreska", "Korean": "Kóreska",
"Kurdish": "Kúrdíska", "Kurdish": "Kúrdíska",
"Kyrgyz": "Kirgisíska", "Kyrgyz": "Kirgisíska",
"Lao": "Laóska", "Lao": "Laó",
"Latin": "Latína", "Latin": "Latína",
"Latvian": "Lettneska", "Latvian": "Lettneska",
"Lithuanian": "Litháíska", "Lithuanian": "Litháíska",
@@ -293,18 +295,18 @@
"View as playlist": "Skoða sem spilunarlista", "View as playlist": "Skoða sem spilunarlista",
"Default": "Sjálfgefið", "Default": "Sjálfgefið",
"Music": "Tónlist", "Music": "Tónlist",
"Gaming": "Spilun leikja", "Gaming": "Tólvuleikja",
"News": "Fréttir", "News": "Fréttir",
"Movies": "Kvikmyndir", "Movies": "Kvikmyndir",
"Download": "Niðurhal", "Download": "Niðurhal",
"Download as: ": "Sækja sem: ", "Download as: ": "Niðurhala sem: ",
"%A %B %-d, %Y": "%A %B %-d, %Y", "%A %B %-d, %Y": "%A %B %-d, %Y",
"(edited)": "(breytt)", "(edited)": "(breytt)",
"YouTube comment permalink": "Varanlegur tengill á YouTube-ummæli", "YouTube comment permalink": "YouTube ummæli varanlegur tengill",
"permalink": "Varanlegur tengill", "permalink": "Varanlegur tengill",
"`x` marked it with a ❤": "`x` merkti það með ❤", "`x` marked it with a ❤": "`x` merkti það með ❤",
"Audio mode": "Hljóðhamur", "Audio mode": "Hljóð ham",
"Video mode": "Myndhamur", "Video mode": "Myndband ham",
"channel_tab_videos_label": "Myndskeið", "channel_tab_videos_label": "Myndskeið",
"Playlists": "Spilunarlistar", "Playlists": "Spilunarlistar",
"channel_tab_community_label": "Samfélag", "channel_tab_community_label": "Samfélag",
@@ -386,7 +388,7 @@
"crash_page_before_reporting": "Áður en þú tilkynnir villu, gakktu úr skugga um að þú hafir:", "crash_page_before_reporting": "Áður en þú tilkynnir villu, gakktu úr skugga um að þú hafir:",
"crash_page_switch_instance": "reynt að <a href=\"`x`\">nota annað tilvik</a>", "crash_page_switch_instance": "reynt að <a href=\"`x`\">nota annað tilvik</a>",
"crash_page_report_issue": "Ef ekkert af ofantöldu hjálpaði, ættirðu að <a href=\"`x`\">opna nýja verkbeiðni (issue) á GitHub</a> (helst á ensku) og láta fylgja eftirfarandi texta í skilaboðunum þínum (alls EKKI þýða þennan texta):", "crash_page_report_issue": "Ef ekkert af ofantöldu hjálpaði, ættirðu að <a href=\"`x`\">opna nýja verkbeiðni (issue) á GitHub</a> (helst á ensku) og láta fylgja eftirfarandi texta í skilaboðunum þínum (alls EKKI þýða þennan texta):",
"channel_tab_shorts_label": "Símamyndir", "channel_tab_shorts_label": "Stuttmyndir",
"carousel_slide": "Skyggna {{current}} af {{total}}", "carousel_slide": "Skyggna {{current}} af {{total}}",
"carousel_go_to": "Fara á skyggnu `x`", "carousel_go_to": "Fara á skyggnu `x`",
"channel_tab_streams_label": "Bein streymi", "channel_tab_streams_label": "Bein streymi",
@@ -394,13 +396,13 @@
"toggle_theme": "Víxla þema", "toggle_theme": "Víxla þema",
"carousel_skip": "Sleppa hringekjunni", "carousel_skip": "Sleppa hringekjunni",
"preferences_quality_option_medium": "Miðlungs", "preferences_quality_option_medium": "Miðlungs",
"search_message_use_another_instance": "Þú getur líka <a href=\"`x`\">leitað á öðrum netþjóni</a>.", "search_message_use_another_instance": " Þú getur líka <a href=\"`x`\">leitað á öðrum netþjóni</a>.",
"footer_source_code": "Grunnkóði", "footer_source_code": "Grunnkóði",
"English (United Kingdom)": "Enska (Bretland)", "English (United Kingdom)": "Enska (Bretland)",
"English (United States)": "Enska (Bandarísk)", "English (United States)": "Enska (Bandarísk)",
"Vietnamese (auto-generated)": "Víetnamska (sjálfvirkt útbúið)", "Vietnamese (auto-generated)": "Víetnamska (sjálfvirkt útbúið)",
"generic_count_months": "{{count}} mánuði", "generic_count_months": "{{count}} mánuður",
"generic_count_months_plural": "{{count}} mánuðum", "generic_count_months_plural": "{{count}} mánuðir",
"search_filters_sort_option_rating": "Einkunn", "search_filters_sort_option_rating": "Einkunn",
"videoinfo_youTube_embed_link": "Ívefja", "videoinfo_youTube_embed_link": "Ívefja",
"error_video_not_in_playlist": "Umbeðið myndskeið fyrirfinnst ekki í þessum spilunarlista. <a href=\"`x`\">Smelltu hér til að fara á heimasíðu spilunarlistans.</a>", "error_video_not_in_playlist": "Umbeðið myndskeið fyrirfinnst ekki í þessum spilunarlista. <a href=\"`x`\">Smelltu hér til að fara á heimasíðu spilunarlistans.</a>",
@@ -427,11 +429,11 @@
"Spanish (auto-generated)": "Spænska (sjálfvirkt útbúið)", "Spanish (auto-generated)": "Spænska (sjálfvirkt útbúið)",
"Spanish (Mexico)": "Spænska (Mexíkó)", "Spanish (Mexico)": "Spænska (Mexíkó)",
"generic_count_hours": "{{count}} klukkustund", "generic_count_hours": "{{count}} klukkustund",
"generic_count_hours_plural": "{{count}} klukkustundum", "generic_count_hours_plural": "{{count}} klukkustundir",
"generic_count_years": "{{count}} ári", "generic_count_years": "{{count}} ár",
"generic_count_years_plural": "{{count}} árum", "generic_count_years_plural": "{{count}} ár",
"generic_count_weeks": "{{count}} viku", "generic_count_weeks": "{{count}} vika",
"generic_count_weeks_plural": "{{count}} vikum", "generic_count_weeks_plural": "{{count}} vikur",
"search_filters_date_option_none": "Hvaða dagsetning sem er", "search_filters_date_option_none": "Hvaða dagsetning sem er",
"Channel Sponsor": "Styrktaraðili rásar", "Channel Sponsor": "Styrktaraðili rásar",
"search_filters_date_option_week": "Í þessari viku", "search_filters_date_option_week": "Í þessari viku",
@@ -474,8 +476,8 @@
"preferences_quality_dash_option_144p": "144p", "preferences_quality_dash_option_144p": "144p",
"invidious": "Invidious", "invidious": "Invidious",
"Korean (auto-generated)": "Kóreska (sjálfvirkt útbúið)", "Korean (auto-generated)": "Kóreska (sjálfvirkt útbúið)",
"generic_count_days": "{{count}} degi", "generic_count_days": "{{count}} dagur",
"generic_count_days_plural": "{{count}} dögum", "generic_count_days_plural": "{{count}} dagar",
"search_filters_date_option_today": "Í dag", "search_filters_date_option_today": "Í dag",
"search_filters_type_label": "Tegund", "search_filters_type_label": "Tegund",
"search_filters_type_option_all": "Hvaða tegund sem er", "search_filters_type_option_all": "Hvaða tegund sem er",
@@ -494,13 +496,5 @@
"footer_documentation": "Leiðbeiningar", "footer_documentation": "Leiðbeiningar",
"channel_tab_channels_label": "Rásir", "channel_tab_channels_label": "Rásir",
"Import YouTube playlist (.csv)": "Flytja inn YouTube spilunarlista (.csv)", "Import YouTube playlist (.csv)": "Flytja inn YouTube spilunarlista (.csv)",
"preferences_quality_option_dash": "DASH (aðlaganleg gæði)", "preferences_quality_option_dash": "DASH (aðlaganleg gæði)"
"preferences_preload_label": "Forhlaða gögnum myndskeiðs: ",
"Filipino (auto-generated)": "Filippínska (sjálfvirkt útbúin)",
"channel_tab_posts_label": "Færslur",
"First page": "Fyrsta síða",
"channel_tab_courses_label": "Kennsluefni",
"timeline_parse_error_placeholder_heading": "Tekst ekki að meðhöndla þetta atriði",
"timeline_parse_error_placeholder_message": "Invidious rakst á villu við að reyna að meðhöndla þetta atriði. Skoðaðu nánari upplýsingar hér fyrir neðan:",
"timeline_parse_error_show_technical_details": "Sýna nánari tæknilegar upplýsingar"
} }

View File

@@ -48,6 +48,8 @@
"User ID": "ID utente", "User ID": "ID utente",
"Password": "Password", "Password": "Password",
"Time (h:mm:ss):": "Orario (h:mm:ss):", "Time (h:mm:ss):": "Orario (h:mm:ss):",
"Text CAPTCHA": "Testo del CAPTCHA",
"Image CAPTCHA": "Immagine CAPTCHA",
"Sign In": "Accedi", "Sign In": "Accedi",
"Register": "Registrati", "Register": "Registrati",
"E-mail": "E-mail", "E-mail": "E-mail",
@@ -127,7 +129,7 @@
"subscriptions_unseen_notifs_count_0": "{{count}} notifica non visualizzata", "subscriptions_unseen_notifs_count_0": "{{count}} notifica non visualizzata",
"subscriptions_unseen_notifs_count_1": "{{count}} notifiche non visualizzate", "subscriptions_unseen_notifs_count_1": "{{count}} notifiche non visualizzate",
"subscriptions_unseen_notifs_count_2": "{{count}} notifiche non visualizzate", "subscriptions_unseen_notifs_count_2": "{{count}} notifiche non visualizzate",
"search": "cerca", "search": "Cerca",
"Log out": "Esci", "Log out": "Esci",
"Source available here.": "Codice sorgente.", "Source available here.": "Codice sorgente.",
"View JavaScript license information.": "Guarda le informazioni di licenza del codice JavaScript.", "View JavaScript license information.": "Guarda le informazioni di licenza del codice JavaScript.",
@@ -447,7 +449,7 @@
"Portuguese (Brazil)": "Portoghese (Brasile)", "Portuguese (Brazil)": "Portoghese (Brasile)",
"preferences_watch_history_label": "Attiva cronologia di riproduzione: ", "preferences_watch_history_label": "Attiva cronologia di riproduzione: ",
"French (auto-generated)": "Francese (generati automaticamente)", "French (auto-generated)": "Francese (generati automaticamente)",
"search_message_use_another_instance": "Puoi anche <a href=\"`x`\">cercare in un'altra istanza</a>.", "search_message_use_another_instance": " Puoi anche <a href=\"`x`\">cercare in un'altra istanza</a>.",
"search_message_no_results": "Nessun risultato trovato.", "search_message_no_results": "Nessun risultato trovato.",
"search_message_change_filters_or_query": "Prova ad ampliare la ricerca e/o modificare i filtri.", "search_message_change_filters_or_query": "Prova ad ampliare la ricerca e/o modificare i filtri.",
"English (United States)": "Inglese (Stati Uniti)", "English (United States)": "Inglese (Stati Uniti)",
@@ -467,8 +469,8 @@
"Spanish (auto-generated)": "Spagnolo (generati automaticamente)", "Spanish (auto-generated)": "Spagnolo (generati automaticamente)",
"Spanish (Mexico)": "Spagnolo (Messico)", "Spanish (Mexico)": "Spagnolo (Messico)",
"Spanish (Spain)": "Spagnolo (Spagna)", "Spanish (Spain)": "Spagnolo (Spagna)",
"Turkish (auto-generated)": "Turco (generati automaticamente)", "Turkish (auto-generated)": "Turco (auto-generato)",
"Vietnamese (auto-generated)": "Vietnamita (generati automaticamente)", "Vietnamese (auto-generated)": "Vietnamita (auto-generato)",
"search_filters_date_label": "Data caricamento", "search_filters_date_label": "Data caricamento",
"search_filters_date_option_none": "Qualunque data", "search_filters_date_option_none": "Qualunque data",
"search_filters_type_option_all": "Qualunque tipo", "search_filters_type_option_all": "Qualunque tipo",
@@ -511,13 +513,5 @@
"The Popular feed has been disabled by the administrator.": "La sezione dei contenuti popolari è stata disabilitata dall'amministratore.", "The Popular feed has been disabled by the administrator.": "La sezione dei contenuti popolari è stata disabilitata dall'amministratore.",
"carousel_slide": "Fotogramma {{current}} di {{total}}", "carousel_slide": "Fotogramma {{current}} di {{total}}",
"carousel_skip": "Salta la galleria", "carousel_skip": "Salta la galleria",
"carousel_go_to": "Vai al fotogramma `x`", "carousel_go_to": "Vai al fotogramma `x`"
"preferences_preload_label": "Precarica dati video: ",
"Filipino (auto-generated)": "Filippino (generati automaticamente)",
"First page": "Prima pagina",
"channel_tab_courses_label": "Corsi",
"channel_tab_posts_label": "Post",
"timeline_parse_error_show_technical_details": "Mostra i dettagli tecnici",
"timeline_parse_error_placeholder_message": "Invidious ha riscontrato un errore tentando di leggere questo elemento. Per altre informazioni vedi di seguito:",
"timeline_parse_error_placeholder_heading": "Lettura elemento non riuscita"
} }

View File

@@ -25,7 +25,7 @@
"No": "いいえ", "No": "いいえ",
"Import and Export Data": "データのインポートとエクスポート", "Import and Export Data": "データのインポートとエクスポート",
"Import": "インポート", "Import": "インポート",
"Import Invidious data": "Invidious JSON データをインポート", "Import Invidious data": "Invidious JSONデータをインポート",
"Import YouTube subscriptions": "YouTube/OPML 登録チャンネルをインポート", "Import YouTube subscriptions": "YouTube/OPML 登録チャンネルをインポート",
"Import FreeTube subscriptions (.db)": "FreeTube 登録チャンネルをインポート (.db)", "Import FreeTube subscriptions (.db)": "FreeTube 登録チャンネルをインポート (.db)",
"Import NewPipe subscriptions (.json)": "NewPipe 登録チャンネルをインポート (.json)", "Import NewPipe subscriptions (.json)": "NewPipe 登録チャンネルをインポート (.json)",
@@ -44,6 +44,8 @@
"User ID": "ユーザー ID", "User ID": "ユーザー ID",
"Password": "パスワード", "Password": "パスワード",
"Time (h:mm:ss):": "時間 (時:分分:秒秒):", "Time (h:mm:ss):": "時間 (時:分分:秒秒):",
"Text CAPTCHA": "テキスト CAPTCHA",
"Image CAPTCHA": "画像 CAPTCHA",
"Sign In": "サインイン", "Sign In": "サインイン",
"Register": "登録", "Register": "登録",
"E-mail": "メールアドレス", "E-mail": "メールアドレス",
@@ -66,7 +68,7 @@
"preferences_related_videos_label": "関連動画を表示: ", "preferences_related_videos_label": "関連動画を表示: ",
"preferences_annotations_label": "最初からアノテーションを表示: ", "preferences_annotations_label": "最初からアノテーションを表示: ",
"preferences_extend_desc_label": "動画の説明文を自動的に拡張: ", "preferences_extend_desc_label": "動画の説明文を自動的に拡張: ",
"preferences_vr_mode_label": "対話的な 360° 動画 (WebGL が必要): ", "preferences_vr_mode_label": "対話的な360°動画 (WebGLが必要): ",
"preferences_category_visual": "外観設定", "preferences_category_visual": "外観設定",
"preferences_player_style_label": "プレイヤーのスタイル: ", "preferences_player_style_label": "プレイヤーのスタイル: ",
"Dark mode: ": "ダークモード: ", "Dark mode: ": "ダークモード: ",
@@ -75,7 +77,7 @@
"light": "ライト", "light": "ライト",
"preferences_thin_mode_label": "最小モード: ", "preferences_thin_mode_label": "最小モード: ",
"preferences_category_misc": "ほかの設定", "preferences_category_misc": "ほかの設定",
"preferences_automatic_instance_redirect_label": "インスタンスの自動転送 (redirect.invidious.io にフォールバック): ", "preferences_automatic_instance_redirect_label": "インスタンスの自動転送 (redirect.invidious.ioにフォールバック): ",
"preferences_category_subscription": "登録チャンネル設定", "preferences_category_subscription": "登録チャンネル設定",
"preferences_annotations_subscribed_label": "最初から登録チャンネルのアノテーションを表示 ", "preferences_annotations_subscribed_label": "最初から登録チャンネルのアノテーションを表示 ",
"Redirect homepage to feed: ": "ホームからフィードにリダイレクト: ", "Redirect homepage to feed: ": "ホームからフィードにリダイレクト: ",
@@ -123,7 +125,7 @@
"subscriptions_unseen_notifs_count_0": "{{count}}件の未読通知", "subscriptions_unseen_notifs_count_0": "{{count}}件の未読通知",
"search": "検索", "search": "検索",
"Log out": "ログアウト", "Log out": "ログアウト",
"Released under the AGPLv3 on Github.": "GitHub 上で AGPLv3 の元で公開", "Released under the AGPLv3 on Github.": "GitHub上でAGPLv3の元で公開",
"Source available here.": "ソースはここで閲覧可能です。", "Source available here.": "ソースはここで閲覧可能です。",
"View JavaScript license information.": "JavaScriptライセンス情報", "View JavaScript license information.": "JavaScriptライセンス情報",
"View privacy policy.": "個人情報保護方針", "View privacy policy.": "個人情報保護方針",
@@ -141,8 +143,8 @@
"Editing playlist `x`": "再生リスト `x` を編集中", "Editing playlist `x`": "再生リスト `x` を編集中",
"Show more": "もっと見る", "Show more": "もっと見る",
"Show less": "表示を少なく", "Show less": "表示を少なく",
"Watch on YouTube": "YouTube で視聴", "Watch on YouTube": "YouTubeで視聴",
"Switch Invidious Instance": "Invidious インスタンスの変更", "Switch Invidious Instance": "Invidiousインスタンスの変更",
"Hide annotations": "アノテーションを隠す", "Hide annotations": "アノテーションを隠す",
"Show annotations": "アノテーションを表示", "Show annotations": "アノテーションを表示",
"Genre: ": "ジャンル: ", "Genre: ": "ジャンル: ",
@@ -328,7 +330,7 @@
"(edited)": "(編集済み)", "(edited)": "(編集済み)",
"YouTube comment permalink": "YouTube コメントのパーマリンク", "YouTube comment permalink": "YouTube コメントのパーマリンク",
"permalink": "パーマリンク", "permalink": "パーマリンク",
"`x` marked it with a ❤": "`x` がを送りました", "`x` marked it with a ❤": "`x` がを送りました",
"Audio mode": "音声モード", "Audio mode": "音声モード",
"Video mode": "動画モード", "Video mode": "動画モード",
"channel_tab_videos_label": "動画", "channel_tab_videos_label": "動画",
@@ -341,7 +343,7 @@
"search_filters_type_label": "種類", "search_filters_type_label": "種類",
"search_filters_duration_label": "再生時間", "search_filters_duration_label": "再生時間",
"search_filters_features_label": "特徴", "search_filters_features_label": "特徴",
"search_filters_sort_label": "並べ替え", "search_filters_sort_label": "順番",
"search_filters_date_option_hour": "1時間以内", "search_filters_date_option_hour": "1時間以内",
"search_filters_date_option_today": "今日", "search_filters_date_option_today": "今日",
"search_filters_date_option_week": "今週", "search_filters_date_option_week": "今週",
@@ -361,15 +363,15 @@
"search_filters_features_option_location": "場所", "search_filters_features_option_location": "場所",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"Current version: ": "現在のバージョン: ", "Current version: ": "現在のバージョン: ",
"next_steps_error_message": "以下をお試しください: ", "next_steps_error_message": "以下をお試しください: ",
"next_steps_error_message_refresh": "再読み込み", "next_steps_error_message_refresh": "再読み込み",
"next_steps_error_message_go_to_youtube": "YouTube を開く", "next_steps_error_message_go_to_youtube": "YouTubeを開く",
"search_filters_duration_option_short": "4分未満", "search_filters_duration_option_short": "4分未満",
"footer_documentation": "説明書", "footer_documentation": "説明書",
"footer_source_code": "ソースコード", "footer_source_code": "ソースコード",
"footer_original_source_code": "元のソースコード", "footer_original_source_code": "元のソースコード",
"footer_modfied_source_code": "改変し使用", "footer_modfied_source_code": "改変し使用",
"adminprefs_modified_source_code_url_label": "改変されたソースコードのレポジトリの URL", "adminprefs_modified_source_code_url_label": "改変されたソースコードのレポジトリのURL",
"search_filters_duration_option_long": "20分以上", "search_filters_duration_option_long": "20分以上",
"preferences_region_label": "地域: ", "preferences_region_label": "地域: ",
"footer_donate_page": "寄付する", "footer_donate_page": "寄付する",
@@ -394,10 +396,10 @@
"download_subtitles": "字幕 - `x` (.vtt)", "download_subtitles": "字幕 - `x` (.vtt)",
"search_filters_features_option_purchased": "購入済み", "search_filters_features_option_purchased": "購入済み",
"preferences_quality_option_dash": "DASH (適応的画質)", "preferences_quality_option_dash": "DASH (適応的画質)",
"preferences_quality_dash_option_worst": "最", "preferences_quality_dash_option_worst": "最",
"preferences_quality_dash_option_best": "最高", "preferences_quality_dash_option_best": "最高",
"videoinfo_started_streaming_x_ago": "`x`前に配信を開始", "videoinfo_started_streaming_x_ago": "`x`前に配信を開始",
"videoinfo_watch_on_youTube": "YouTube で視聴", "videoinfo_watch_on_youTube": "YouTubeで視聴",
"user_created_playlists": "`x`個の作成した再生リスト", "user_created_playlists": "`x`個の作成した再生リスト",
"Video unavailable": "動画は利用できません", "Video unavailable": "動画は利用できません",
"Chinese": "中国語", "Chinese": "中国語",
@@ -432,7 +434,7 @@
"crash_page_switch_instance": "<a href=\"`x`\">別のインスタンスを使用</a>を試す", "crash_page_switch_instance": "<a href=\"`x`\">別のインスタンスを使用</a>を試す",
"crash_page_read_the_faq": "<a href=\"`x`\">よくある質問 (FAQ)</a> を読む", "crash_page_read_the_faq": "<a href=\"`x`\">よくある質問 (FAQ)</a> を読む",
"Popular enabled: ": "人気動画を有効化 ", "Popular enabled: ": "人気動画を有効化 ",
"search_message_use_another_instance": "<a href=\"`x`\">別のインスタンス上での検索</a>も可能です。", "search_message_use_another_instance": " <a href=\"`x`\">別のインスタンス上での検索</a>も可能です。",
"search_filters_apply_button": "選択したフィルターを適用", "search_filters_apply_button": "選択したフィルターを適用",
"user_saved_playlists": "`x`個の保存済みの再生リスト", "user_saved_playlists": "`x`個の保存済みの再生リスト",
"crash_page_you_found_a_bug": "Invidious のバグのようです!", "crash_page_you_found_a_bug": "Invidious のバグのようです!",
@@ -444,7 +446,7 @@
"search_filters_duration_option_medium": "4 20分", "search_filters_duration_option_medium": "4 20分",
"preferences_save_player_pos_label": "再生位置を保存: ", "preferences_save_player_pos_label": "再生位置を保存: ",
"crash_page_before_reporting": "バグを報告する前に、次のことを確認してください。", "crash_page_before_reporting": "バグを報告する前に、次のことを確認してください。",
"crash_page_report_issue": "上記が助けにならない場合、<a href=\"`x`\">GitHub</a> に新しい issue を作成し (できれば英語で) 、メッセージに次のテキストを含めてください (テキストは翻訳しない) 。", "crash_page_report_issue": "上記が助けにならないなら、<a href=\"`x`\">GitHub</a> に新しい issue を作成し(英語が好ましい)、メッセージに次のテキストを含めてくださいテキストは翻訳しない。",
"crash_page_search_issue": "<a href=\"`x`\">GitHub の既存の問題 (issue)</a> を検索", "crash_page_search_issue": "<a href=\"`x`\">GitHub の既存の問題 (issue)</a> を検索",
"channel_tab_streams_label": "ライブ", "channel_tab_streams_label": "ライブ",
"channel_tab_playlists_label": "再生リスト", "channel_tab_playlists_label": "再生リスト",
@@ -477,15 +479,5 @@
"carousel_go_to": "スライド`x`を表示", "carousel_go_to": "スライド`x`を表示",
"carousel_slide": "スライド{{current}} / 全{{total}}個中", "carousel_slide": "スライド{{current}} / 全{{total}}個中",
"carousel_skip": "画像のスライド表示をスキップ", "carousel_skip": "画像のスライド表示をスキップ",
"toggle_theme": "テーマの切り替え", "toggle_theme": "テーマの切り替え"
"preferences_preload_label": "動画データを事前に読み込む: ",
"Filipino (auto-generated)": "フィリピノ語 (自動生成)",
"First page": "最初のページ",
"channel_tab_posts_label": "投稿",
"channel_tab_courses_label": "コース",
"timeline_parse_error_placeholder_message": "Invidious によるこの項目の解析中にエラーが発生。詳細は以下:",
"timeline_parse_error_placeholder_heading": "この項目を解析できません",
"timeline_parse_error_show_technical_details": "技術的詳細を表示",
"preferences_default_playlist": "デフォルトのプレイリスト: ",
"preferences_default_playlist_none": "デフォルトのプレイリストは設定されていません"
} }

View File

@@ -18,8 +18,8 @@
"preferences_related_videos_label": "관련 동영상 보기: ", "preferences_related_videos_label": "관련 동영상 보기: ",
"Fallback captions: ": "대체 자막: ", "Fallback captions: ": "대체 자막: ",
"preferences_captions_label": "기본 자막: ", "preferences_captions_label": "기본 자막: ",
"reddit": "레딧", "reddit": "Reddit",
"youtube": "유튜브", "youtube": "YouTube",
"preferences_comments_label": "기본 댓글: ", "preferences_comments_label": "기본 댓글: ",
"preferences_volume_label": "플레이어 볼륨: ", "preferences_volume_label": "플레이어 볼륨: ",
"preferences_quality_label": "선호하는 비디오 품질: ", "preferences_quality_label": "선호하는 비디오 품질: ",
@@ -36,6 +36,8 @@
"Register": "회원가입", "Register": "회원가입",
"Sign In": "로그인", "Sign In": "로그인",
"preferences_category_misc": "기타 설정", "preferences_category_misc": "기타 설정",
"Image CAPTCHA": "이미지 캡차",
"Text CAPTCHA": "텍스트 캡차",
"Time (h:mm:ss):": "시각 (h:mm:ss):", "Time (h:mm:ss):": "시각 (h:mm:ss):",
"Password": "비밀번호", "Password": "비밀번호",
"User ID": "사용자 ID", "User ID": "사용자 ID",
@@ -46,7 +48,7 @@
"An alternative front-end to YouTube": "유튜브의 프론트엔드 대안", "An alternative front-end to YouTube": "유튜브의 프론트엔드 대안",
"History": "시청 기록", "History": "시청 기록",
"Delete account?": "계정을 삭제 하시겠습니까?", "Delete account?": "계정을 삭제 하시겠습니까?",
"Export data as JSON": "인비디어스 데이터 내보내기 (.json)", "Export data as JSON": "JSON으로 데이터 내보내기",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "OPML로 구독 내보내기 (뉴파이프 및 프리튜브)", "Export subscriptions as OPML (for NewPipe & FreeTube)": "OPML로 구독 내보내기 (뉴파이프 및 프리튜브)",
"Export subscriptions as OPML": "OPML로 구독 내보내기", "Export subscriptions as OPML": "OPML로 구독 내보내기",
"Export": "내보내기", "Export": "내보내기",
@@ -68,7 +70,7 @@
"Next page": "다음 페이지", "Next page": "다음 페이지",
"last": "마지막", "last": "마지막",
"Shared `x` ago": "`x` 전", "Shared `x` ago": "`x` 전",
"popular": "인기", "popular": "인기",
"oldest": "과거순", "oldest": "과거순",
"newest": "최신순", "newest": "최신순",
"View playlist on YouTube": "유튜브에서 재생목록 보기", "View playlist on YouTube": "유튜브에서 재생목록 보기",
@@ -76,10 +78,10 @@
"Subscribe": "구독", "Subscribe": "구독",
"Unsubscribe": "구독 취소", "Unsubscribe": "구독 취소",
"LIVE": "실시간", "LIVE": "실시간",
"generic_views_count_0": "{{count}} 조회수", "generic_views_count_0": "조회수 {{count}}",
"generic_videos_count_0": "{{count}} 동영상", "generic_videos_count_0": "동영상 {{count}}",
"generic_playlists_count_0": "{{count}} 재생목록", "generic_playlists_count_0": "재생목록 {{count}}",
"generic_subscribers_count_0": "{{count}} 구독자", "generic_subscribers_count_0": "구독자 {{count}}",
"generic_subscriptions_count_0": "{{count}} 구독", "generic_subscriptions_count_0": "{{count}} 구독",
"search_filters_type_option_playlist": "재생목록", "search_filters_type_option_playlist": "재생목록",
"Korean": "한국어", "Korean": "한국어",
@@ -107,14 +109,14 @@
"This channel does not exist.": "이 채널은 존재하지 않습니다.", "This channel does not exist.": "이 채널은 존재하지 않습니다.",
"Deleted or invalid channel": "삭제되었거나 더 이상 존재하지 않는 채널", "Deleted or invalid channel": "삭제되었거나 더 이상 존재하지 않는 채널",
"channel:`x`": "채널:`x`", "channel:`x`": "채널:`x`",
"Show replies": "댓글 보기", "Show replies": "댓글 보기",
"Hide replies": "댓글 숨기기", "Hide replies": "댓글 숨기기",
"Incorrect password": "잘못된 비밀번호", "Incorrect password": "잘못된 비밀번호",
"License: ": "라이선스: ", "License: ": "라이선스: ",
"Genre: ": "장르: ", "Genre: ": "장르: ",
"Editing playlist `x`": "재생목록 `x` 수정하기", "Editing playlist `x`": "재생목록 `x` 수정하기",
"Playlist privacy": "재생목록 공개 범위", "Playlist privacy": "재생목록 공개 범위",
"Watch on YouTube": "유튜브에서 보기", "Watch on YouTube": "YouTube에서 보기",
"Show less": "간략히", "Show less": "간략히",
"Show more": "더보기", "Show more": "더보기",
"Title": "제목", "Title": "제목",
@@ -123,7 +125,7 @@
"Delete playlist": "재생목록 삭제", "Delete playlist": "재생목록 삭제",
"Delete playlist `x`?": "재생목록 `x` 를 삭제하시겠습니까?", "Delete playlist `x`?": "재생목록 `x` 를 삭제하시겠습니까?",
"Updated `x` ago": "`x` 전에 업데이트됨", "Updated `x` ago": "`x` 전에 업데이트됨",
"Released under the AGPLv3 on Github.": "깃허브에 AGPLv3 으로 배포됩니다.", "Released under the AGPLv3 on Github.": "GitHub에 AGPLv3 으로 배포됩니다.",
"View all playlists": "모든 재생목록 보기", "View all playlists": "모든 재생목록 보기",
"Private": "비공개", "Private": "비공개",
"Unlisted": "목록에 없음", "Unlisted": "목록에 없음",
@@ -133,12 +135,12 @@
"Source available here.": "소스는 여기에서 사용할 수 있습니다.", "Source available here.": "소스는 여기에서 사용할 수 있습니다.",
"Log out": "로그아웃", "Log out": "로그아웃",
"search": "검색", "search": "검색",
"subscriptions_unseen_notifs_count_0": "{{count}} 읽지 않은 알림", "subscriptions_unseen_notifs_count_0": "읽지 않은 알림 {{count}}개",
"Subscriptions": "구독", "Subscriptions": "구독",
"revoke": "철회", "revoke": "철회",
"unsubscribe": "구독 취소", "unsubscribe": "구독 취소",
"Import/export": "가져오기/내보내기", "Import/export": "가져오기/내보내기",
"tokens_count_0": "{{count}} 토큰", "tokens_count_0": "토큰 {{count}}",
"Token": "토큰", "Token": "토큰",
"Token manager": "토큰 관리자", "Token manager": "토큰 관리자",
"Subscription manager": "구독 관리자", "Subscription manager": "구독 관리자",
@@ -161,7 +163,7 @@
"Clear watch history": "시청 기록 지우기", "Clear watch history": "시청 기록 지우기",
"preferences_category_data": "데이터 설정", "preferences_category_data": "데이터 설정",
"`x` is live": "`x` 이(가) 라이브 중입니다", "`x` is live": "`x` 이(가) 라이브 중입니다",
"`x` uploaded a video": "`x` 동영상 게시", "`x` uploaded a video": "`x` 이(가) 동영상 게시했습니다",
"Enable web notifications": "웹 알림 활성화", "Enable web notifications": "웹 알림 활성화",
"preferences_notifications_only_label": "알림만 표시 (있는 경우): ", "preferences_notifications_only_label": "알림만 표시 (있는 경우): ",
"preferences_unseen_only_label": "시청하지 않은 것만 표시: ", "preferences_unseen_only_label": "시청하지 않은 것만 표시: ",
@@ -239,7 +241,7 @@
"Could not create mix.": "믹스를 생성할 수 없습니다.", "Could not create mix.": "믹스를 생성할 수 없습니다.",
"`x` ago": "`x` 전", "`x` ago": "`x` 전",
"comments_view_x_replies_0": "답글 {{count}}개 보기", "comments_view_x_replies_0": "답글 {{count}}개 보기",
"View Reddit comments": "레딧 댓글 보기", "View Reddit comments": "Reddit 댓글 보기",
"Engagement: ": "약속: ", "Engagement: ": "약속: ",
"Wilson score: ": "Wilson Score: ", "Wilson score: ": "Wilson Score: ",
"Family friendly? ": "전연령 영상입니까? ", "Family friendly? ": "전연령 영상입니까? ",
@@ -265,8 +267,8 @@
"Bulgarian": "불가리아어", "Bulgarian": "불가리아어",
"Bosnian": "보스니아어", "Bosnian": "보스니아어",
"Belarusian": "벨라루스어", "Belarusian": "벨라루스어",
"View more comments on Reddit": "레딧에서 댓글 더 보기", "View more comments on Reddit": "Reddit에서 댓글 더 보기",
"View YouTube comments": "유튜브 댓글 보기", "View YouTube comments": "YouTube 댓글 보기",
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "자바스크립트가 꺼져 있는 것 같습니다! 댓글을 보려면 여기를 클릭하세요. 댓글을 로드하는 데 시간이 조금 더 걸릴 수 있습니다.", "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "자바스크립트가 꺼져 있는 것 같습니다! 댓글을 보려면 여기를 클릭하세요. 댓글을 로드하는 데 시간이 조금 더 걸릴 수 있습니다.",
"Shared `x`": "`x` 업로드", "Shared `x`": "`x` 업로드",
"Whitelisted regions: ": "차단되지 않은 지역: ", "Whitelisted regions: ": "차단되지 않은 지역: ",
@@ -287,7 +289,7 @@
"Empty playlist": "재생목록 비어 있음", "Empty playlist": "재생목록 비어 있음",
"Show annotations": "주석 보이기", "Show annotations": "주석 보이기",
"Hide annotations": "주석 숨기기", "Hide annotations": "주석 숨기기",
"Switch Invidious Instance": "인비디어스 인스턴스 변경", "Switch Invidious Instance": "Invidious 인스턴스 변경",
"Spanish": "스페인어", "Spanish": "스페인어",
"Southern Sotho": "소토어", "Southern Sotho": "소토어",
"Somali": "소말리어", "Somali": "소말리어",
@@ -327,7 +329,7 @@
"Swedish": "스웨덴어", "Swedish": "스웨덴어",
"Spanish (Latin America)": "스페인어 (라틴 아메리카)", "Spanish (Latin America)": "스페인어 (라틴 아메리카)",
"comments_points_count_0": "{{count}} 포인트", "comments_points_count_0": "{{count}} 포인트",
"Invidious Private Feed for `x`": "`x` 에 대한 인비디어스 비공개 피드", "Invidious Private Feed for `x`": "`x` 에 대한 Invidious 비공개 피드",
"Premieres `x`": "최초 공개 `x`", "Premieres `x`": "최초 공개 `x`",
"Premieres in `x`": "`x` 후 최초 공개", "Premieres in `x`": "`x` 후 최초 공개",
"next_steps_error_message": "다음 방법을 시도해 보세요: ", "next_steps_error_message": "다음 방법을 시도해 보세요: ",
@@ -406,7 +408,7 @@
"preferences_quality_dash_option_1080p": "1080p", "preferences_quality_dash_option_1080p": "1080p",
"preferences_quality_dash_option_worst": "최저", "preferences_quality_dash_option_worst": "최저",
"preferences_watch_history_label": "시청 기록 저장: ", "preferences_watch_history_label": "시청 기록 저장: ",
"invidious": "인비디어스", "invidious": "Invidious",
"preferences_quality_option_small": "낮음", "preferences_quality_option_small": "낮음",
"preferences_quality_dash_option_auto": "자동", "preferences_quality_dash_option_auto": "자동",
"preferences_quality_dash_option_480p": "480p", "preferences_quality_dash_option_480p": "480p",
@@ -417,7 +419,7 @@
"Portuguese (Brazil)": "포르투갈어 (브라질)", "Portuguese (Brazil)": "포르투갈어 (브라질)",
"search_message_no_results": "결과가 없습니다.", "search_message_no_results": "결과가 없습니다.",
"search_message_change_filters_or_query": "필터를 변경하시거나 검색어를 넓게 시도해보세요.", "search_message_change_filters_or_query": "필터를 변경하시거나 검색어를 넓게 시도해보세요.",
"search_message_use_another_instance": "<a href=\"`x`\">다른 인스턴스에서 검색</a>할 수도 있습니다.", "search_message_use_another_instance": " <a href=\"`x`\">다른 인스턴스에서 검색</a>할 수도 있습니다.",
"English (United States)": "영어 (미국)", "English (United States)": "영어 (미국)",
"Chinese": "중국어", "Chinese": "중국어",
"Chinese (China)": "중국어 (중국)", "Chinese (China)": "중국어 (중국)",
@@ -451,7 +453,7 @@
"channel_tab_streams_label": "실시간 스트리밍", "channel_tab_streams_label": "실시간 스트리밍",
"channel_tab_channels_label": "채널", "channel_tab_channels_label": "채널",
"channel_tab_playlists_label": "재생목록", "channel_tab_playlists_label": "재생목록",
"Standard YouTube license": "표준 유튜브 라이선스", "Standard YouTube license": "표준 YouTube 라이선스",
"Song: ": "제목: ", "Song: ": "제목: ",
"Channel Sponsor": "채널 스폰서", "Channel Sponsor": "채널 스폰서",
"Album: ": "앨범: ", "Album: ": "앨범: ",
@@ -477,10 +479,5 @@
"carousel_go_to": "`x` 슬라이드로 이동", "carousel_go_to": "`x` 슬라이드로 이동",
"Search for videos": "비디오 검색", "Search for videos": "비디오 검색",
"toggle_theme": "테마 전환", "toggle_theme": "테마 전환",
"carousel_slide": "{{total}}의 슬라이드 {{current}}", "carousel_slide": "{{total}}의 슬라이드 {{current}}"
"preferences_preload_label": "비디오 데이터 사전 로드: ",
"First page": "첫 페이지",
"Filipino (auto-generated)": "Filipino (auto-generated)",
"channel_tab_posts_label": "게시글",
"channel_tab_courses_label": "코스"
} }

View File

@@ -44,6 +44,8 @@
"JavaScript license information": "Informaziòn su la licensa JavaScript", "JavaScript license information": "Informaziòn su la licensa JavaScript",
"source": "font", "source": "font",
"Log in": "Và dent", "Log in": "Và dent",
"Text CAPTCHA": "Tèst del CAPTCHA",
"Image CAPTCHA": "Imàgen del CAPTCHA",
"Sign In": "Ven denter", "Sign In": "Ven denter",
"Register": "Registres", "Register": "Registres",
"E-mail": "E-mail", "E-mail": "E-mail",

View File

@@ -39,6 +39,8 @@
"User ID": "Naudotojo ID", "User ID": "Naudotojo ID",
"Password": "Slaptažodis", "Password": "Slaptažodis",
"Time (h:mm:ss):": "Laikas (h:mm:ss):", "Time (h:mm:ss):": "Laikas (h:mm:ss):",
"Text CAPTCHA": "CAPTCHA tekstas",
"Image CAPTCHA": "CAPTCHA paveikslėlis",
"Sign In": "Prisijungti", "Sign In": "Prisijungti",
"Register": "Registruotis", "Register": "Registruotis",
"E-mail": "El. paštas", "E-mail": "El. paštas",

View File

@@ -1,143 +0,0 @@
{
"generic_channels_count_0": "{{count}} kanāli",
"generic_channels_count_1": "{{count}} kanāls",
"generic_channels_count_2": "{{count}} kanāli",
"Add to playlist": "Pievienot atskaņošanas sarakstam",
"Answer": "Atbildēt",
"generic_subscribers_count_0": "{{count}} abonenti",
"generic_subscribers_count_1": "{{count}} abonents",
"generic_subscribers_count_2": "{{count}} abonenti",
"generic_button_delete": "Dzēst",
"generic_button_edit": "Rediģēt",
"generic_button_save": "Saglabāt",
"generic_button_cancel": "Atcelt",
"generic_button_rss": "RSS",
"Unsubscribe": "Pārtraukt abonementu",
"View playlist on YouTube": "Skatīt atskaņošanas sarakstu YouTube vietnē",
"New password": "Jaunā parole",
"Yes": "Jā",
"No": "Nē",
"Import and Export Data": "Ievietot un izgūt datus",
"Import": "Ievietot",
"Import Invidious data": "Ievietot Invidious JSON datus",
"Delete account?": "Vai dzēst kontu?",
"History": "Vēsture",
"User ID": "Lietotāja ID",
"Password": "Parole",
"Import YouTube subscriptions": "Ievietot YouTube CSV vai OPML abonementus",
"E-mail": "E-pasts",
"Preferences": "Iestatījumi",
"preferences_category_player": "Atskaņotāja iestatījumi",
"preferences_quality_option_hd720": "HD - 720p",
"preferences_quality_option_medium": "Vidēja",
"preferences_quality_dash_option_worst": "Vissliktākā",
"preferences_quality_dash_option_2160p": "2160p (4K)",
"preferences_quality_dash_option_1080p": "1080p (Full HD)",
"preferences_quality_dash_option_720p": "720p (HD)",
"preferences_quality_dash_option_1440p": "1440p (2.5K, QHD)",
"preferences_quality_dash_option_480p": "480p (SD)",
"preferences_quality_dash_option_360p": "360p",
"preferences_quality_dash_option_240p": "240p",
"preferences_quality_dash_option_144p": "144p",
"preferences_volume_label": "Atskaņošanas skaļums: ",
"reddit": "Reddit",
"invidious": "Invidious",
"Bangla": "Bengāļu",
"Basque": "Basku",
"Cebuano": "Sebuāņu",
"Chinese (Traditional)": "Ķīniešu (tradicionālā)",
"Corsican": "Korsikāņu",
"Croatian": "Horvātu",
"Galician": "Galisiešu",
"Georgian": "Gruzīnu",
"Gujarati": "Gudžaratu",
"German": "Vācu",
"Greek": "Grieķu",
"Haitian Creole": "Haitiešu",
"Hausa": "Hausu",
"Hawaiian": "Havajiešu",
"Export data as JSON": "Izgūt Invidious datus JSON formātā",
"preferences_quality_dash_option_4320p": "4320p (8K)",
"Time (h:mm:ss):": "Laiks (h:mm:ss):",
"Chinese (Simplified)": "Ķīniešu (vienkāršotā)",
"preferences_quality_dash_option_best": "Vislabākā",
"preferences_quality_option_small": "Zema",
"youtube": "YouTube",
"Add to playlist: ": "Pievienot atskaņošanas sarakstam: ",
"Subscribe": "Abonēt",
"View channel on YouTube": "Skatīt kanālu YouTube vietnē",
"LIVE": "TIEŠRAIDE",
"Export": "Izgūt",
"preferences_dark_mode_label": "Motīvs: ",
"published": "Publicēšanas datuma",
"preferences_sort_label": "Kārtot video pēc: ",
"search_filters_sort_label": "Kārtot pēc",
"search_filters_sort_option_date": "Augšupielādes datuma",
"search_filters_sort_option_views": "Skatījumu skaita",
"published - reverse": "Publicēšanas datuma apgrieztā secībā",
"generic_views_count_0": "{{count}} skatījumi",
"generic_views_count_1": "{{count}} skatījums",
"generic_views_count_2": "{{count}} skatījumi",
"generic_videos_count_0": "{{count}} video",
"generic_videos_count_1": "{{count}} video",
"generic_videos_count_2": "{{count}} video",
"generic_playlists_count_0": "{{count}} atskaņošanas saraksti",
"generic_playlists_count_1": "{{count}} atskaņošanas saraksts",
"generic_playlists_count_2": "{{count}} atskaņošanas saraksti",
"generic_subscriptions_count_0": "{{count}} abonementi",
"generic_subscriptions_count_1": "{{count}} abonements",
"generic_subscriptions_count_2": "{{count}} abonementi",
"subscriptions_unseen_notifs_count_0": "{{count}} jauni paziņojumi",
"subscriptions_unseen_notifs_count_1": "{{count}} jauns paziņojums",
"subscriptions_unseen_notifs_count_2": "{{count}} jauni paziņojumi",
"comments_view_x_replies_0": "Skatīt {{count}} atbildes",
"comments_view_x_replies_1": "Skatīt {{count}} atbildi",
"comments_view_x_replies_2": "Skatīt {{count}} atbildes",
"generic_count_years_0": "{{count}} gadi",
"generic_count_years_1": "{{count}} gads",
"generic_count_years_2": "{{count}} gadi",
"generic_count_months_0": "{{count}} mēneši",
"generic_count_months_1": "{{count}} mēnesis",
"generic_count_months_2": "{{count}} mēneši",
"generic_count_weeks_0": "{{count}} nedēļas",
"generic_count_weeks_1": "{{count}} nedēļa",
"generic_count_weeks_2": "{{count}} nedēļas",
"generic_count_days_0": "{{count}} dienas",
"generic_count_days_1": "{{count}} diena",
"generic_count_days_2": "{{count}} dienas",
"generic_count_hours_0": "{{count}} stundas",
"generic_count_hours_1": "{{count}} stunda",
"generic_count_hours_2": "{{count}} stundas",
"generic_count_minutes_0": "{{count}} minūtes",
"generic_count_minutes_1": "{{count}} minūte",
"generic_count_minutes_2": "{{count}} minūtes",
"generic_count_seconds_0": "{{count}} sekundes",
"generic_count_seconds_1": "{{count}} sekunde",
"generic_count_seconds_2": "{{count}} sekundes",
"Import YouTube playlist (.csv)": "Ievietot YouTube atskaņošanas sarakstu (.csv)",
"Import YouTube watch history (.json)": "Ievietot YouTube skatīto video vēsturi (.json)",
"Import FreeTube subscriptions (.db)": "Ievietot FreeTube abonementus (.db)",
"Import NewPipe subscriptions (.json)": "Ievietot NewPipe abonementus (.json)",
"Import NewPipe data (.zip)": "Ievietot NewPipe datus (.zip)",
"Export subscriptions as OPML": "Izgūt abonementus OPML formātā",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Izgūt abonementus OPML formātā (der NewPipe un FreeTube lietotnēm)",
"preferences_max_results_label": "Video skaits plūsmā: ",
"channel name": "kanāla nosaukuma",
"channel name - reverse": "kanāla nosaukuma apgrieztā secībā",
"preferences_unseen_only_label": "Rādīt tikai neskatītos video: ",
"Enable web notifications": "Iespējot paziņojumus pārlūkā",
"`x` uploaded a video": "`x` augšupielādēja video",
"Watch history": "Skatīto video vēsture",
"Delete account": "Dzēst kontu",
"Save preferences": "Saglabāt iestatījumus",
"Import/export": "Ievietot/Izgūt",
"Released under the AGPLv3 on Github.": "Izvietots GitHub saskaņā ar AGPLv3 licenci.",
"Source available here.": "Pirmkods pieejams šeit.",
"View JavaScript license information.": "Skatīt JavaScript licences informāciju.",
"Public": "Publisks",
"Private": "Privāts",
"View all playlists": "Skatīt visus atskaņošanas sarakstus",
"Delete playlist `x`?": "Vai tiešām dzēst `x` atskaņošanas sarakstu?",
"Delete playlist": "Dzēst atskaņošanas sarakstu",
"Create playlist": "Izveidot atskaņošanas sarakstu"
}

View File

@@ -39,6 +39,8 @@
"User ID": "Bruker-ID", "User ID": "Bruker-ID",
"Password": "Passord", "Password": "Passord",
"Time (h:mm:ss):": "Tid (h:mm:ss):", "Time (h:mm:ss):": "Tid (h:mm:ss):",
"Text CAPTCHA": "Tekst-CAPTCHA",
"Image CAPTCHA": "Bilde-CAPTCHA",
"Sign In": "Innlogging", "Sign In": "Innlogging",
"Register": "Registrer", "Register": "Registrer",
"E-mail": "E-post", "E-mail": "E-post",
@@ -320,13 +322,13 @@
"channel_tab_community_label": "Gemenskap", "channel_tab_community_label": "Gemenskap",
"search_filters_sort_option_relevance": "relevans", "search_filters_sort_option_relevance": "relevans",
"search_filters_sort_option_rating": "vurdering", "search_filters_sort_option_rating": "vurdering",
"search_filters_sort_option_date": "Opplastingsdato", "search_filters_sort_option_date": "dato",
"search_filters_sort_option_views": "visninger", "search_filters_sort_option_views": "visninger",
"search_filters_type_label": "innholdstype", "search_filters_type_label": "innholdstype",
"search_filters_duration_label": "varighet", "search_filters_duration_label": "varighet",
"search_filters_features_label": "funksjoner", "search_filters_features_label": "funksjoner",
"search_filters_sort_label": "sorter", "search_filters_sort_label": "sorter",
"search_filters_date_option_hour": "Siste time", "search_filters_date_option_hour": "time",
"search_filters_date_option_today": "i dag", "search_filters_date_option_today": "i dag",
"search_filters_date_option_week": "uke", "search_filters_date_option_week": "uke",
"search_filters_date_option_month": "måned", "search_filters_date_option_month": "måned",
@@ -457,7 +459,7 @@
"search_message_no_results": "Resultatløst.", "search_message_no_results": "Resultatløst.",
"search_filters_type_option_all": "Alle typer", "search_filters_type_option_all": "Alle typer",
"search_filters_duration_option_none": "Enhver varighet", "search_filters_duration_option_none": "Enhver varighet",
"search_message_use_another_instance": "Du kan også <a href=\"`x`\">søke på en annen instans</a>.", "search_message_use_another_instance": " Du kan også <a href=\"`x`\">søke på en annen instans</a>.",
"search_filters_date_label": "Opplastningsdato", "search_filters_date_label": "Opplastningsdato",
"search_filters_apply_button": "Bruk valgte filtre", "search_filters_apply_button": "Bruk valgte filtre",
"search_filters_date_option_none": "Siden begynnelsen", "search_filters_date_option_none": "Siden begynnelsen",
@@ -492,8 +494,5 @@
"carousel_slide": "Lysark {{current}} av {{total}}", "carousel_slide": "Lysark {{current}} av {{total}}",
"carousel_skip": "Hopp over karusellen", "carousel_skip": "Hopp over karusellen",
"Add to playlist": "Legg til i spilleliste", "Add to playlist": "Legg til i spilleliste",
"Add to playlist: ": "Legg til i spilleliste: ", "Add to playlist: ": "Legg til i spilleliste: "
"The Popular feed has been disabled by the administrator.": "Populært-kilden er koblet ut av administratoren.",
"toggle_theme": "Endre utseende",
"preferences_preload_label": "Last videodata på forhånd: "
} }

View File

@@ -39,6 +39,8 @@
"User ID": "Gebruikers-id", "User ID": "Gebruikers-id",
"Password": "Wachtwoord", "Password": "Wachtwoord",
"Time (h:mm:ss):": "Tijd (h:mm:ss):", "Time (h:mm:ss):": "Tijd (h:mm:ss):",
"Text CAPTCHA": "Tekst-CAPTCHA",
"Image CAPTCHA": "Afbeelding-CAPTCHA",
"Sign In": "Inloggen", "Sign In": "Inloggen",
"Register": "Registreren", "Register": "Registreren",
"E-mail": "E-mailadres", "E-mail": "E-mailadres",
@@ -315,13 +317,13 @@
"channel_tab_community_label": "Gemeenschap", "channel_tab_community_label": "Gemeenschap",
"search_filters_sort_option_relevance": "relevantie", "search_filters_sort_option_relevance": "relevantie",
"search_filters_sort_option_rating": "beoordeling", "search_filters_sort_option_rating": "beoordeling",
"search_filters_sort_option_date": "Upload datum", "search_filters_sort_option_date": "datum",
"search_filters_sort_option_views": "keren bekeken", "search_filters_sort_option_views": "keren bekeken",
"search_filters_type_label": "Type inhoud", "search_filters_type_label": "Type inhoud",
"search_filters_duration_label": "duur", "search_filters_duration_label": "duur",
"search_filters_features_label": "eigenschappen", "search_filters_features_label": "eigenschappen",
"search_filters_sort_label": "sorteren", "search_filters_sort_label": "sorteren",
"search_filters_date_option_hour": "Laatste uur", "search_filters_date_option_hour": "uur",
"search_filters_date_option_today": "vandaag", "search_filters_date_option_today": "vandaag",
"search_filters_date_option_week": "week", "search_filters_date_option_week": "week",
"search_filters_date_option_month": "maand", "search_filters_date_option_month": "maand",
@@ -355,7 +357,7 @@
"footer_original_source_code": "Originele bron-code", "footer_original_source_code": "Originele bron-code",
"footer_modfied_source_code": "Gewijzigde bron-code", "footer_modfied_source_code": "Gewijzigde bron-code",
"adminprefs_modified_source_code_url_label": "URL naar gewijzigde bron-code-opslagplaats", "adminprefs_modified_source_code_url_label": "URL naar gewijzigde bron-code-opslagplaats",
"next_steps_error_message": "Waarna u zou kunnen proberen om: ", "next_steps_error_message": "Daarna moet u proberen om: ",
"footer_source_code": "Bron-code", "footer_source_code": "Bron-code",
"search_filters_duration_option_long": "Lang (> 20 minuten)", "search_filters_duration_option_long": "Lang (> 20 minuten)",
"preferences_quality_option_dash": "DASH (adaptieve kwaliteit)", "preferences_quality_option_dash": "DASH (adaptieve kwaliteit)",
@@ -448,7 +450,7 @@
"Chinese (Hong Kong)": "Chinees (Hongkong)", "Chinese (Hong Kong)": "Chinees (Hongkong)",
"Korean (auto-generated)": "Koreaans (automatisch gegenereerd)", "Korean (auto-generated)": "Koreaans (automatisch gegenereerd)",
"search_filters_apply_button": "Geselecteerde filters toepassen", "search_filters_apply_button": "Geselecteerde filters toepassen",
"search_message_use_another_instance": "Je kan ook <a href=\"`x`\">zoeken op een andere instantie</a>.", "search_message_use_another_instance": " Je kan ook <a href=\"`x`\">zoeken op een andere instantie</a>.",
"Cantonese (Hong Kong)": "Kantonees (Hongkong)", "Cantonese (Hong Kong)": "Kantonees (Hongkong)",
"Chinese (China)": "Chinees (China)", "Chinese (China)": "Chinees (China)",
"crash_page_read_the_faq": "de <a href=\"`x`\">veelgestelde vragen (FAQ)</a> gelezen hebt", "crash_page_read_the_faq": "de <a href=\"`x`\">veelgestelde vragen (FAQ)</a> gelezen hebt",
@@ -475,7 +477,7 @@
"Song: ": "Lied: ", "Song: ": "Lied: ",
"generic_channels_count": "{{count}} kanaal", "generic_channels_count": "{{count}} kanaal",
"generic_channels_count_plural": "{{count}} kanalen", "generic_channels_count_plural": "{{count}} kanalen",
"Popular enabled: ": "Populair ingeschakeld: ", "Popular enabled: ": "Populair geactiveerd: ",
"channel_tab_playlists_label": "Afspeellijsten", "channel_tab_playlists_label": "Afspeellijsten",
"generic_button_edit": "Bewerken", "generic_button_edit": "Bewerken",
"Music in this video": "Muziek in deze video", "Music in this video": "Muziek in deze video",
@@ -494,13 +496,5 @@
"Answer": "Antwoorden", "Answer": "Antwoorden",
"Search for videos": "Naar video's zoeken", "Search for videos": "Naar video's zoeken",
"carousel_skip": "Carousel overslaan", "carousel_skip": "Carousel overslaan",
"toggle_theme": "Thema omschakelen", "toggle_theme": "Thema omschakelen"
"preferences_preload_label": "Videogegevens vooraf laden: ",
"Filipino (auto-generated)": "Filipijns (automatisch gegenereerd)",
"channel_tab_courses_label": "Cursussen",
"First page": "Eerste pagina",
"channel_tab_posts_label": "Gepost",
"timeline_parse_error_placeholder_heading": "Kan item niet parsen",
"timeline_parse_error_placeholder_message": "Invidious kwam een fout tegen bij het proberen te parsen van dit item. Voor meer informatie, kijk hieronder:",
"timeline_parse_error_show_technical_details": "Technische details weergeven"
} }

View File

@@ -39,6 +39,8 @@
"User ID": "ID użytkownika", "User ID": "ID użytkownika",
"Password": "Hasło", "Password": "Hasło",
"Time (h:mm:ss):": "Godzina (h:mm:ss):", "Time (h:mm:ss):": "Godzina (h:mm:ss):",
"Text CAPTCHA": "Tekst CAPTCHA",
"Image CAPTCHA": "Obraz CAPTCHA",
"Sign In": "Zaloguj się", "Sign In": "Zaloguj się",
"Register": "Zarejestruj się", "Register": "Zarejestruj się",
"E-mail": "E-mail", "E-mail": "E-mail",
@@ -76,7 +78,7 @@
"Redirect homepage to feed: ": "Przekieruj stronę główną do subskrybcji: ", "Redirect homepage to feed: ": "Przekieruj stronę główną do subskrybcji: ",
"preferences_max_results_label": "Liczba filmów widoczna na stronie subskrybcji: ", "preferences_max_results_label": "Liczba filmów widoczna na stronie subskrybcji: ",
"preferences_sort_label": "Sortuj filmy: ", "preferences_sort_label": "Sortuj filmy: ",
"published": "opublikowano", "published": "po czasie publikacji",
"published - reverse": "po czasie publikacji od najstarszych", "published - reverse": "po czasie publikacji od najstarszych",
"alphabetically": "alfabetycznie", "alphabetically": "alfabetycznie",
"alphabetically - reverse": "alfabetycznie od tyłu", "alphabetically - reverse": "alfabetycznie od tyłu",
@@ -476,7 +478,7 @@
"search_filters_date_label": "Data przesłania", "search_filters_date_label": "Data przesłania",
"search_filters_features_option_vr180": "VR180", "search_filters_features_option_vr180": "VR180",
"search_filters_date_option_none": "Dowolna data", "search_filters_date_option_none": "Dowolna data",
"search_message_use_another_instance": "Możesz także <a href=\"`x`\">wyszukać w innej instancji</a>.", "search_message_use_another_instance": " Możesz także <a href=\"`x`\">wyszukać w innej instancji</a>.",
"search_filters_type_option_all": "Dowolny typ", "search_filters_type_option_all": "Dowolny typ",
"search_filters_duration_option_none": "Dowolna długość", "search_filters_duration_option_none": "Dowolna długość",
"search_filters_duration_option_medium": "Średnia (4-20 minut)", "search_filters_duration_option_medium": "Średnia (4-20 minut)",
@@ -511,15 +513,5 @@
"Add to playlist: ": "Dodaj do playlisty: ", "Add to playlist: ": "Dodaj do playlisty: ",
"carousel_slide": "Slajd {{current}} z {{total}}", "carousel_slide": "Slajd {{current}} z {{total}}",
"carousel_skip": "Pomiń karuzelę", "carousel_skip": "Pomiń karuzelę",
"carousel_go_to": "Przejdź do slajdu `x`", "carousel_go_to": "Przejdź do slajdu `x`"
"preferences_preload_label": "Wstępne ładowanie danych wideo: ",
"Filipino (auto-generated)": "filipiński (wygenerowany automatycznie)",
"First page": "Pierwsza strona",
"channel_tab_posts_label": "Posty",
"channel_tab_courses_label": "Kursy",
"timeline_parse_error_placeholder_message": "Invidious napotkał błąd podczas próby parsowania tego elementu. Aby uzyskać więcej informacji, zobacz poniżej:",
"timeline_parse_error_placeholder_heading": "Nie można przeanalizować elementu",
"timeline_parse_error_show_technical_details": "Pokaż szczegóły techniczne",
"preferences_default_playlist_none": "Brak domyślnej playlisty",
"preferences_default_playlist": "Domyślna playlista: "
} }

View File

@@ -18,7 +18,7 @@
"Authorize token for `x`?": "Autorizar token para `x`?", "Authorize token for `x`?": "Autorizar token para `x`?",
"Yes": "Sim", "Yes": "Sim",
"No": "Não", "No": "Não",
"Import and Export Data": "Importar e exportar dados", "Import and Export Data": "Importar/exportar dados",
"Import": "Importar", "Import": "Importar",
"Import Invidious data": "Importar dados JSON do Invidious", "Import Invidious data": "Importar dados JSON do Invidious",
"Import YouTube subscriptions": "Importar inscrições no formato CSV ou OPML do YouTube", "Import YouTube subscriptions": "Importar inscrições no formato CSV ou OPML do YouTube",
@@ -39,6 +39,8 @@
"User ID": "Usuário", "User ID": "Usuário",
"Password": "Senha", "Password": "Senha",
"Time (h:mm:ss):": "Hora (h:mm:ss):", "Time (h:mm:ss):": "Hora (h:mm:ss):",
"Text CAPTCHA": "Mudar para um desafio de texto",
"Image CAPTCHA": "Mudar para um desafio visual",
"Sign In": "Fazer login", "Sign In": "Fazer login",
"Register": "Criar conta", "Register": "Criar conta",
"E-mail": "E-mail", "E-mail": "E-mail",
@@ -472,7 +474,7 @@
"Spanish (auto-generated)": "Espanhol (gerado automaticamente)", "Spanish (auto-generated)": "Espanhol (gerado automaticamente)",
"Spanish (Mexico)": "Espanhol (México)", "Spanish (Mexico)": "Espanhol (México)",
"search_filters_duration_option_none": "Qualquer duração", "search_filters_duration_option_none": "Qualquer duração",
"search_message_use_another_instance": "Você também pode <a href=\"`x`\">pesquisar em outra instância</a>.", "search_message_use_another_instance": " Você também pode <a href=\"`x`\">pesquisar em outra instância</a>.",
"Spanish (Spain)": "Espanhol (Espanha)", "Spanish (Spain)": "Espanhol (Espanha)",
"Turkish (auto-generated)": "Turco (gerado automaticamente)", "Turkish (auto-generated)": "Turco (gerado automaticamente)",
"search_filters_duration_option_medium": "Médio (4 - 20 minutos)", "search_filters_duration_option_medium": "Médio (4 - 20 minutos)",
@@ -482,7 +484,7 @@
"channel_tab_channels_label": "Canais", "channel_tab_channels_label": "Canais",
"channel_tab_playlists_label": "Playlists", "channel_tab_playlists_label": "Playlists",
"channel_tab_shorts_label": "Shorts", "channel_tab_shorts_label": "Shorts",
"channel_tab_streams_label": "Transmissões ao vivo", "channel_tab_streams_label": "Transmissão ao vivo",
"Music in this video": "Música neste vídeo", "Music in this video": "Música neste vídeo",
"Artist: ": "Artista: ", "Artist: ": "Artista: ",
"Album: ": "Álbum: ", "Album: ": "Álbum: ",
@@ -511,13 +513,5 @@
"Answer": "Resposta", "Answer": "Resposta",
"carousel_slide": "Slide {{current}} de {{total}}", "carousel_slide": "Slide {{current}} de {{total}}",
"carousel_skip": "Ignorar carrossel", "carousel_skip": "Ignorar carrossel",
"carousel_go_to": "Ir ao slide `x`", "carousel_go_to": "Ir ao slide `x`"
"preferences_preload_label": "Pré-carregar dados do vídeo: ",
"Filipino (auto-generated)": "Filipino (gerado automaticamente)",
"channel_tab_posts_label": "Postagens",
"First page": "Primeira página",
"channel_tab_courses_label": "Cursos",
"timeline_parse_error_show_technical_details": "Mostrar detalhes técnicos",
"timeline_parse_error_placeholder_message": "O Invidious encontrou um problema ao processar este item. Para mais informações, veja abaixo:",
"timeline_parse_error_placeholder_heading": "Incapaz de processar item"
} }

View File

@@ -1,27 +1,27 @@
{ {
"LIVE": "Direto", "LIVE": "Em direto",
"Shared `x` ago": "Partilhado `x` atrás", "Shared `x` ago": "Partilhado `x` atrás",
"Unsubscribe": "Anular subscrição", "Unsubscribe": "Anular subscrição",
"Subscribe": "Subscrever", "Subscribe": "Subscrever",
"View channel on YouTube": "Ver canal no YouTube", "View channel on YouTube": "Ver canal no YouTube",
"View playlist on YouTube": "Ver lista de reprodução no YouTube", "View playlist on YouTube": "Ver lista de reprodução no YouTube",
"newest": "recentes", "newest": "mais recentes",
"oldest": "antigos", "oldest": "mais antigos",
"popular": "populares", "popular": "popular",
"last": "últimos", "last": "últimos",
"Next page": "Página seguinte", "Next page": "Próxima página",
"Previous page": "Página anterior", "Previous page": "Página anterior",
"Clear watch history?": "Limpar histórico de reprodução?", "Clear watch history?": "Limpar histórico de reprodução?",
"New password": "Nova palavra-passe", "New password": "Nova palavra-chave",
"New passwords must match": "As novas palavras-passe devem ser iguais", "New passwords must match": "As novas palavra-chaves devem corresponder",
"Authorize token?": "Autorizar 'token'?", "Authorize token?": "Autorizar token?",
"Authorize token for `x`?": "Autorizar 'token' para `x`?", "Authorize token for `x`?": "Autorizar token para `x`?",
"Yes": "Sim", "Yes": "Sim",
"No": "Não", "No": "Não",
"Import and Export Data": "Importar e exportar dados", "Import and Export Data": "Importar e exportar dados",
"Import": "Importar", "Import": "Importar",
"Import Invidious data": "Importar dados JSON do Invidious", "Import Invidious data": "Importar dados JSON do Invidious",
"Import YouTube subscriptions": "Importar via YouTube csv ou subscrição OPML", "Import YouTube subscriptions": "Importar subscrições do YouTube/OPML",
"Import FreeTube subscriptions (.db)": "Importar subscrições do FreeTube (.db)", "Import FreeTube subscriptions (.db)": "Importar subscrições do FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importar subscrições do NewPipe (.json)", "Import NewPipe subscriptions (.json)": "Importar subscrições do NewPipe (.json)",
"Import NewPipe data (.zip)": "Importar dados do NewPipe (.zip)", "Import NewPipe data (.zip)": "Importar dados do NewPipe (.zip)",
@@ -32,36 +32,38 @@
"Delete account?": "Eliminar conta?", "Delete account?": "Eliminar conta?",
"History": "Histórico", "History": "Histórico",
"An alternative front-end to YouTube": "Uma interface alternativa ao YouTube", "An alternative front-end to YouTube": "Uma interface alternativa ao YouTube",
"JavaScript license information": "Informação da licença JavaScript", "JavaScript license information": "Informação de licença do JavaScript",
"source": "fonte", "source": "código-fonte",
"Log in": "Iniciar sessão", "Log in": "Iniciar sessão",
"Log in/register": "Iniciar sessão/registar", "Log in/register": "Iniciar sessão/registar",
"User ID": "Utilizador", "User ID": "Utilizador",
"Password": "Palavra-passe", "Password": "Palavra-chave",
"Time (h:mm:ss):": "Tempo (h:mm:ss):", "Time (h:mm:ss):": "Tempo (h:mm:ss):",
"Sign In": "Entrar", "Text CAPTCHA": "Texto CAPTCHA",
"Image CAPTCHA": "Imagem CAPTCHA",
"Sign In": "Iniciar sessão",
"Register": "Registar", "Register": "Registar",
"E-mail": "E-mail", "E-mail": "E-mail",
"Preferences": "Preferências", "Preferences": "Preferências",
"preferences_category_player": "Preferências do reprodutor", "preferences_category_player": "Preferências do reprodutor",
"preferences_video_loop_label": "Repetir sempre: ", "preferences_video_loop_label": "Repetir sempre: ",
"preferences_autoplay_label": "Reprodução automática: ", "preferences_autoplay_label": "Reprodução automática: ",
"preferences_continue_label": "Reproduzir sempre o seguinte: ", "preferences_continue_label": "Reproduzir sempre o próximo: ",
"preferences_continue_autoplay_label": "Reproduzir próximo vídeo automaticamente: ", "preferences_continue_autoplay_label": "Reproduzir próximo vídeo automaticamente: ",
"preferences_listen_label": "Apenas áudio: ", "preferences_listen_label": "Apenas áudio: ",
"preferences_local_label": "Usar proxy nos vídeos: ", "preferences_local_label": "Usar proxy nos vídeos: ",
"preferences_speed_label": "Velocidade preferida: ", "preferences_speed_label": "Velocidade preferida: ",
"preferences_quality_label": "Qualidade de vídeo preferida: ", "preferences_quality_label": "Qualidade de vídeo preferida: ",
"preferences_volume_label": "Volume de reprodução: ", "preferences_volume_label": "Volume da reprodução: ",
"preferences_comments_label": "Comentários padrão: ", "preferences_comments_label": "Preferência dos comentários: ",
"youtube": "YouTube", "youtube": "YouTube",
"reddit": "Reddit", "reddit": "Reddit",
"preferences_captions_label": "Legendas padrão: ", "preferences_captions_label": "Legendas predefinidas: ",
"Fallback captions: ": "Legendas alternativas: ", "Fallback captions: ": "Legendas alternativas: ",
"preferences_related_videos_label": "Mostrar vídeos relacionados: ", "preferences_related_videos_label": "Mostrar vídeos relacionados: ",
"preferences_annotations_label": "Mostrar anotações sempre: ", "preferences_annotations_label": "Mostrar anotações sempre: ",
"preferences_extend_desc_label": "Expandir automaticamente a descrição do vídeo: ", "preferences_extend_desc_label": "Estender automaticamente a descrição do vídeo: ",
"preferences_vr_mode_label": "Vídeos interativos de 360 graus (requer WebGL): ", "preferences_vr_mode_label": "Vídeos interativos de 360 graus (necessita de WebGL): ",
"preferences_category_visual": "Preferências visuais", "preferences_category_visual": "Preferências visuais",
"preferences_player_style_label": "Estilo do reprodutor: ", "preferences_player_style_label": "Estilo do reprodutor: ",
"Dark mode: ": "Modo escuro: ", "Dark mode: ": "Modo escuro: ",
@@ -72,9 +74,9 @@
"preferences_category_misc": "Preferências diversas", "preferences_category_misc": "Preferências diversas",
"preferences_automatic_instance_redirect_label": "Redirecionamento de instância automática (solução de último recurso para redirect.invidious.io): ", "preferences_automatic_instance_redirect_label": "Redirecionamento de instância automática (solução de último recurso para redirect.invidious.io): ",
"preferences_category_subscription": "Preferências de subscrições", "preferences_category_subscription": "Preferências de subscrições",
"preferences_annotations_subscribed_label": "Mostrar sempre anotações nos canais subscritos: ", "preferences_annotations_subscribed_label": "Mostrar sempre anotações aos canais subscritos: ",
"Redirect homepage to feed: ": "Redirecionar página inicial para subscrições: ", "Redirect homepage to feed: ": "Redirecionar página inicial para subscrições: ",
"preferences_max_results_label": "Número de vídeos nas subscrições: ", "preferences_max_results_label": "Quantidade de vídeos nas subscrições: ",
"preferences_sort_label": "Ordenar vídeos por: ", "preferences_sort_label": "Ordenar vídeos por: ",
"published": "publicado", "published": "publicado",
"published - reverse": "publicado - inverso", "published - reverse": "publicado - inverso",
@@ -86,19 +88,19 @@
"Only show latest unwatched video from channel: ": "Mostrar apenas vídeos mais recentes não visualizados do canal: ", "Only show latest unwatched video from channel: ": "Mostrar apenas vídeos mais recentes não visualizados do canal: ",
"preferences_unseen_only_label": "Mostrar apenas vídeos não visualizados: ", "preferences_unseen_only_label": "Mostrar apenas vídeos não visualizados: ",
"preferences_notifications_only_label": "Mostrar apenas notificações (se existirem): ", "preferences_notifications_only_label": "Mostrar apenas notificações (se existirem): ",
"Enable web notifications": "Ativar notificações web", "Enable web notifications": "Ativar notificações pela web",
"`x` uploaded a video": "`x` publicou um vídeo", "`x` uploaded a video": "`x` publicou um novo vídeo",
"`x` is live": "`x` está em direto", "`x` is live": "`x` está em direto",
"preferences_category_data": "Preferências de dados", "preferences_category_data": "Preferências de dados",
"Clear watch history": "Limpar histórico de reprodução", "Clear watch history": "Limpar histórico de reprodução",
"Import/export data": "Importar/exportar dados", "Import/export data": "Importar / exportar dados",
"Change password": "Alterar palavra-passe", "Change password": "Alterar palavra-chave",
"Manage subscriptions": "Gerir subscrições", "Manage subscriptions": "Gerir as subscrições",
"Manage tokens": "Gerir tokens", "Manage tokens": "Gerir tokens",
"Watch history": "Histórico de reprodução", "Watch history": "Histórico de reprodução",
"Delete account": "Eliminar conta", "Delete account": "Eliminar conta",
"preferences_category_admin": "Preferências de administrador", "preferences_category_admin": "Preferências de administrador",
"preferences_default_home_label": "Página inicial padrão: ", "preferences_default_home_label": "Página inicial predefinida: ",
"preferences_feed_menu_label": "Menu de subscrições: ", "preferences_feed_menu_label": "Menu de subscrições: ",
"preferences_show_nick_label": "Mostrar nome de utilizador em cima: ", "preferences_show_nick_label": "Mostrar nome de utilizador em cima: ",
"Top enabled: ": "Destaques ativados: ", "Top enabled: ": "Destaques ativados: ",
@@ -107,29 +109,28 @@
"Registration enabled: ": "Registar ativado: ", "Registration enabled: ": "Registar ativado: ",
"Report statistics: ": "Relatório de estatísticas: ", "Report statistics: ": "Relatório de estatísticas: ",
"Save preferences": "Guardar preferências", "Save preferences": "Guardar preferências",
"Subscription manager": "Gestor de subscrições", "Subscription manager": "Gerir subscrições",
"Token manager": "Gestor de tokens", "Token manager": "Gerir tokens",
"Token": "Token", "Token": "Token",
"tokens_count_0": "{{count}} token", "tokens_count": "{{count}} token",
"tokens_count_1": "{{count}} tokens", "tokens_count_plural": "{{count}} tokens",
"tokens_count_2": "{{count}} tokens", "Import/export": "Importar / exportar",
"Import/export": "Importar/exportar",
"unsubscribe": "anular subscrição", "unsubscribe": "anular subscrição",
"revoke": "revogar", "revoke": "revogar",
"Subscriptions": "Subscrições", "Subscriptions": "Subscrições",
"search": "pesquisar", "search": "pesquisar",
"Log out": "Terminar sessão", "Log out": "Terminar sessão",
"Released under the AGPLv3 on Github.": "Disponibilizada sob a AGPLv3 no GitHub.", "Released under the AGPLv3 on Github.": "Lançado sob a AGPLv3 no GitHub.",
"Source available here.": "Código-fonte disponível aqui.", "Source available here.": "Código-fonte disponível aqui.",
"View JavaScript license information.": "Ver informações da licença JavaScript.", "View JavaScript license information.": "Ver informações da licença do JavaScript.",
"View privacy policy.": "Ver política de privacidade.", "View privacy policy.": "Ver a política de privacidade.",
"Trending": "Tendências", "Trending": "Tendências",
"Public": "Público", "Public": "Público",
"Unlisted": "Não listado", "Unlisted": "Não listado",
"Private": "Privado", "Private": "Privado",
"View all playlists": "Ver todas as listas de reprodução", "View all playlists": "Ver todas as listas de reprodução",
"Updated `x` ago": "Atualizado `x`", "Updated `x` ago": "Atualizado `x` atrás",
"Delete playlist `x`?": "Eliminar lista de reprodução `x`?", "Delete playlist `x`?": "Eliminar a lista de reprodução `x`?",
"Delete playlist": "Eliminar lista de reprodução", "Delete playlist": "Eliminar lista de reprodução",
"Create playlist": "Criar lista de reprodução", "Create playlist": "Criar lista de reprodução",
"Title": "Título", "Title": "Título",
@@ -138,7 +139,7 @@
"Show more": "Mostrar mais", "Show more": "Mostrar mais",
"Show less": "Mostrar menos", "Show less": "Mostrar menos",
"Watch on YouTube": "Ver no YouTube", "Watch on YouTube": "Ver no YouTube",
"Switch Invidious Instance": "Alterar instância Invidious", "Switch Invidious Instance": "Mudar a instância do Invidious",
"Hide annotations": "Ocultar anotações", "Hide annotations": "Ocultar anotações",
"Show annotations": "Mostrar anotações", "Show annotations": "Mostrar anotações",
"Genre: ": "Género: ", "Genre: ": "Género: ",
@@ -149,27 +150,27 @@
"Whitelisted regions: ": "Regiões permitidas: ", "Whitelisted regions: ": "Regiões permitidas: ",
"Blacklisted regions: ": "Regiões bloqueadas: ", "Blacklisted regions: ": "Regiões bloqueadas: ",
"Shared `x`": "Partilhado `x`", "Shared `x`": "Partilhado `x`",
"Premieres in `x`": "Estreia a `x`", "Premieres in `x`": "Estreias em `x`",
"Premieres `x`": "Estreia `x`", "Premieres `x`": "Estreias `x`",
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Olá! Parece que o JavaScript está desativado. Clique aqui para ver os comentários, mas tenha e conta que podem levar mais tempo para carregar.", "Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Olá! Parece que o JavaScript está desativado. Clique aqui para ver os comentários, entretanto eles podem levar mais tempo para carregar.",
"View YouTube comments": "Ver comentários do YouTube", "View YouTube comments": "Ver comentários do YouTube",
"View more comments on Reddit": "Ver mais comentários no Reddit", "View more comments on Reddit": "Ver mais comentários no Reddit",
"View `x` comments": { "View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "Ver `x` comentário", "([^.,0-9]|^)1([^.,0-9]|$)": "Ver `x` comentários",
"": "Ver `x` comentários" "": "Ver `x` comentários"
}, },
"View Reddit comments": "Ver comentários do Reddit", "View Reddit comments": "Ver comentários do Reddit",
"Hide replies": "Ocultar respostas", "Hide replies": "Ocultar respostas",
"Show replies": "Mostrar respostas", "Show replies": "Mostrar respostas",
"Incorrect password": "Palavra-passe incorreta", "Incorrect password": "Palavra-chave incorreta",
"Wrong answer": "Resposta errada", "Wrong answer": "Resposta errada",
"Erroneous CAPTCHA": "CAPTCHA inválido", "Erroneous CAPTCHA": "CAPTCHA inválido",
"CAPTCHA is a required field": "CAPTCHA é um campo obrigatório", "CAPTCHA is a required field": "CAPTCHA é um campo obrigatório",
"User ID is a required field": "O nome de utilizador é um campo obrigatório", "User ID is a required field": "O nome de utilizador é um campo obrigatório",
"Password is a required field": "Palavra-passe é um campo obrigatório", "Password is a required field": "Palavra-chave é um campo obrigatório",
"Wrong username or password": "Nome de utilizador ou palavra-passe incorreta", "Wrong username or password": "Nome de utilizador ou palavra-chave incorreto",
"Password cannot be empty": "A palavra-passe não pode estar vazia", "Password cannot be empty": "A palavra-chave não pode estar vazia",
"Password cannot be longer than 55 characters": "A palavra-passe não pode ter mais do que 55 caracteres", "Password cannot be longer than 55 characters": "A palavra-chave não pode ser superior a 55 caracteres",
"Please log in": "Por favor, inicie sessão", "Please log in": "Por favor, inicie sessão",
"Invidious Private Feed for `x`": "Feed Privado do Invidious para `x`", "Invidious Private Feed for `x`": "Feed Privado do Invidious para `x`",
"channel:`x`": "canal:`x`", "channel:`x`": "canal:`x`",
@@ -179,20 +180,20 @@
"Could not fetch comments": "Não foi possível obter os comentários", "Could not fetch comments": "Não foi possível obter os comentários",
"`x` ago": "`x` atrás", "`x` ago": "`x` atrás",
"Load more": "Carregar mais", "Load more": "Carregar mais",
"Could not create mix.": "Não foi possível criar o mix.", "Could not create mix.": "Não foi possível criar a mistura.",
"Empty playlist": "Lista de reprodução vazia", "Empty playlist": "Lista de reprodução vazia",
"Not a playlist.": "Não é uma lista de reprodução.", "Not a playlist.": "Não é uma lista de reprodução.",
"Playlist does not exist.": "A lista de reprodução não existe.", "Playlist does not exist.": "A lista de reprodução não existe.",
"Could not pull trending pages.": "Não foi possível obter a página de tendências.", "Could not pull trending pages.": "Não foi possível obter as páginas de tendências.",
"Hidden field \"challenge\" is a required field": "O campo oculto \"desafio\" é obrigatório", "Hidden field \"challenge\" is a required field": "O campo oculto \"desafio\" é obrigatório",
"Hidden field \"token\" is a required field": "O campo oculto \"token\" é um campo obrigatório", "Hidden field \"token\" is a required field": "O campo oculto \"token\" é um campo obrigatório",
"Erroneous challenge": "Desafio inválido", "Erroneous challenge": "Desafio inválido",
"Erroneous token": "Token inválido", "Erroneous token": "Token inválido",
"No such user": "Utilizador inválido", "No such user": "Utilizador inválido",
"Token is expired, please try again": "Token caducado, tente novamente", "Token is expired, please try again": "Token expirou, tente novamente",
"English": "Inglês", "English": "Inglês",
"English (auto-generated)": "Inglês (auto-gerado)", "English (auto-generated)": "Inglês (auto-gerado)",
"Afrikaans": "Africânder", "Afrikaans": "Africano",
"Albanian": "Albanês", "Albanian": "Albanês",
"Amharic": "Amárico", "Amharic": "Amárico",
"Arabic": "Árabe", "Arabic": "Árabe",
@@ -208,7 +209,7 @@
"Cebuano": "Cebuano", "Cebuano": "Cebuano",
"Chinese (Simplified)": "Chinês (simplificado)", "Chinese (Simplified)": "Chinês (simplificado)",
"Chinese (Traditional)": "Chinês (tradicional)", "Chinese (Traditional)": "Chinês (tradicional)",
"Corsican": "Córsego", "Corsican": "Corso",
"Croatian": "Croata", "Croatian": "Croata",
"Czech": "Checo", "Czech": "Checo",
"Danish": "Dinamarquês", "Danish": "Dinamarquês",
@@ -251,7 +252,7 @@
"Macedonian": "Macedónio", "Macedonian": "Macedónio",
"Malagasy": "Malgaxe", "Malagasy": "Malgaxe",
"Malay": "Malaio", "Malay": "Malaio",
"Malayalam": "Malaialaio", "Malayalam": "Malaiala",
"Maltese": "Maltês", "Maltese": "Maltês",
"Maori": "Maori", "Maori": "Maori",
"Marathi": "Marathi", "Marathi": "Marathi",
@@ -296,37 +297,30 @@
"Yiddish": "Iídiche", "Yiddish": "Iídiche",
"Yoruba": "Ioruba", "Yoruba": "Ioruba",
"Zulu": "Zulu", "Zulu": "Zulu",
"generic_count_years_0": "{{count}} ano", "generic_count_years": "{{count}} ano",
"generic_count_years_1": "{{count}} anos", "generic_count_years_plural": "{{count}} anos",
"generic_count_years_2": "{{count}} anos", "generic_count_months": "{{count}} s",
"generic_count_months_0": "{{count}} mês", "generic_count_months_plural": "{{count}} meses",
"generic_count_months_1": "{{count}} meses", "generic_count_weeks": "{{count}} seman",
"generic_count_months_2": "{{count}} meses", "generic_count_weeks_plural": "{{count}} semanas",
"generic_count_weeks_0": "{{count}} semana", "generic_count_days": "{{count}} dia",
"generic_count_weeks_1": "{{count}} semanas", "generic_count_days_plural": "{{count}} dias",
"generic_count_weeks_2": "{{count}} semanas", "generic_count_hours": "{{count}} hora",
"generic_count_days_0": "{{count}} dia", "generic_count_hours_plural": "{{count}} horas",
"generic_count_days_1": "{{count}} dias", "generic_count_minutes": "{{count}} minuto",
"generic_count_days_2": "{{count}} dias", "generic_count_minutes_plural": "{{count}} minutos",
"generic_count_hours_0": "{{count}} hora", "generic_count_seconds": "{{count}} segundo",
"generic_count_hours_1": "{{count}} horas", "generic_count_seconds_plural": "{{count}} segundos",
"generic_count_hours_2": "{{count}} horas", "Fallback comments: ": "Comentários alternativos: ",
"generic_count_minutes_0": "{{count}} minuto",
"generic_count_minutes_1": "{{count}} minutos",
"generic_count_minutes_2": "{{count}} minutos",
"generic_count_seconds_0": "{{count}} segundo",
"generic_count_seconds_1": "{{count}} segundos",
"generic_count_seconds_2": "{{count}} segundos",
"Fallback comments: ": "Alternativa para comentários: ",
"Popular": "Popular", "Popular": "Popular",
"Search": "Pesquisar", "Search": "Pesquisar",
"Top": "Destaques", "Top": "Destaques",
"About": "Acerca", "About": "Sobre",
"Rating: ": "Avaliação: ", "Rating: ": "Avaliação: ",
"preferences_locale_label": "Idioma: ", "preferences_locale_label": "Idioma: ",
"View as playlist": "Ver como lista de reprodução", "View as playlist": "Ver como lista de reprodução",
"Default": "Padrão", "Default": "Predefinido",
"Music": "Músicas", "Music": "Música",
"Gaming": "Jogos", "Gaming": "Jogos",
"News": "Notícias", "News": "Notícias",
"Movies": "Filmes", "Movies": "Filmes",
@@ -334,9 +328,9 @@
"Download as: ": "Descarregar como: ", "Download as: ": "Descarregar como: ",
"%A %B %-d, %Y": "%A %B %-d, %Y", "%A %B %-d, %Y": "%A %B %-d, %Y",
"(edited)": "(editado)", "(edited)": "(editado)",
"YouTube comment permalink": "Ligação permanente do comentário no YouTube", "YouTube comment permalink": "Hiperligação permanente do comentário no YouTube",
"permalink": "ligação permanente", "permalink": "hiperligação permanente",
"`x` marked it with a ❤": "`x` foi marcado com um ❤", "`x` marked it with a ❤": "`x` foi marcado como ❤",
"Audio mode": "Modo de áudio", "Audio mode": "Modo de áudio",
"Video mode": "Modo de vídeo", "Video mode": "Modo de vídeo",
"channel_tab_videos_label": "Vídeos", "channel_tab_videos_label": "Vídeos",
@@ -344,7 +338,7 @@
"channel_tab_community_label": "Comunidade", "channel_tab_community_label": "Comunidade",
"search_filters_sort_option_relevance": "Relevância", "search_filters_sort_option_relevance": "Relevância",
"search_filters_sort_option_rating": "Avaliação", "search_filters_sort_option_rating": "Avaliação",
"search_filters_sort_option_date": "Data de carregamento", "search_filters_sort_option_date": "Data de envio",
"search_filters_sort_option_views": "Visualizações", "search_filters_sort_option_views": "Visualizações",
"search_filters_type_label": "Tipo", "search_filters_type_label": "Tipo",
"search_filters_duration_label": "Duração", "search_filters_duration_label": "Duração",
@@ -359,44 +353,38 @@
"search_filters_type_option_channel": "Canal", "search_filters_type_option_channel": "Canal",
"search_filters_type_option_playlist": "Lista de reprodução", "search_filters_type_option_playlist": "Lista de reprodução",
"search_filters_type_option_movie": "Filme", "search_filters_type_option_movie": "Filme",
"search_filters_type_option_show": "Séries", "search_filters_type_option_show": "Espetáculo",
"search_filters_features_option_hd": "HD", "search_filters_features_option_hd": "HD",
"search_filters_features_option_subtitles": "Legendas", "search_filters_features_option_subtitles": "Legendas",
"search_filters_features_option_c_commons": "Creative Commons", "search_filters_features_option_c_commons": "Creative Commons",
"search_filters_features_option_three_d": "3D", "search_filters_features_option_three_d": "3D",
"search_filters_features_option_live": "Direto", "search_filters_features_option_live": "Em direto",
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Localização", "search_filters_features_option_location": "Localização",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"Current version: ": "Versão atual: ", "Current version: ": "Versão atual: ",
"next_steps_error_message": "Pode tentar as seguintes opções: ", "next_steps_error_message": "Pode tentar as seguintes opções: ",
"next_steps_error_message_refresh": "Recarregar", "next_steps_error_message_refresh": "Atualizar",
"next_steps_error_message_go_to_youtube": "Ir para o YouTube", "next_steps_error_message_go_to_youtube": "Ir ao YouTube",
"search_filters_title": "Filtro", "search_filters_title": "Filtro",
"generic_videos_count_0": "{{count}} vídeo", "generic_videos_count": "{{count}} vídeo",
"generic_videos_count_1": "{{count}} vídeos", "generic_videos_count_plural": "{{count}} vídeos",
"generic_videos_count_2": "{{count}} vídeos", "generic_playlists_count": "{{count}} lista de reprodução",
"generic_playlists_count_0": "{{count}} lista de reprodução", "generic_playlists_count_plural": "{{count}} listas de reprodução",
"generic_playlists_count_1": "{{count}} listas de reprodução", "generic_subscriptions_count": "{{count}} inscrição",
"generic_playlists_count_2": "{{count}} listas de reprodução", "generic_subscriptions_count_plural": "{{count}} inscrições",
"generic_subscriptions_count_0": "{{count}} subscrição", "generic_views_count": "{{count}} visualização",
"generic_subscriptions_count_1": "{{count}} subscrições", "generic_views_count_plural": "{{count}} visualizações",
"generic_subscriptions_count_2": "{{count}} subscrições", "generic_subscribers_count": "{{count}} inscrito",
"generic_views_count_0": "{{count}} visualização", "generic_subscribers_count_plural": "{{count}} inscritos",
"generic_views_count_1": "{{count}} visualizações",
"generic_views_count_2": "{{count}} visualizações",
"generic_subscribers_count_0": "{{count}} subscritor",
"generic_subscribers_count_1": "{{count}} subscritores",
"generic_subscribers_count_2": "{{count}} subscritores",
"preferences_quality_dash_option_4320p": "4320p", "preferences_quality_dash_option_4320p": "4320p",
"preferences_quality_dash_label": "Qualidade de vídeo DASH preferida: ", "preferences_quality_dash_label": "Qualidade de vídeo DASH preferida: ",
"preferences_quality_dash_option_2160p": "2160p", "preferences_quality_dash_option_2160p": "2160p",
"subscriptions_unseen_notifs_count_0": "{{count}} notificação não vista", "subscriptions_unseen_notifs_count": "{{count}} notificação não vista",
"subscriptions_unseen_notifs_count_1": "{{count}} notificações não vistas", "subscriptions_unseen_notifs_count_plural": "{{count}} notificações não vistas",
"subscriptions_unseen_notifs_count_2": "{{count}} notificações não vistas",
"Popular enabled: ": "Página \"popular\" ativada: ", "Popular enabled: ": "Página \"popular\" ativada: ",
"search_message_no_results": "Nenhum resultado encontrado.", "search_message_no_results": "Nenhum resultado encontrado.",
"preferences_quality_dash_option_auto": "Automática", "preferences_quality_dash_option_auto": "Automático",
"preferences_region_label": "País do conteúdo: ", "preferences_region_label": "País do conteúdo: ",
"preferences_quality_dash_option_1440p": "1440p", "preferences_quality_dash_option_1440p": "1440p",
"preferences_quality_dash_option_720p": "720p", "preferences_quality_dash_option_720p": "720p",
@@ -415,12 +403,10 @@
"preferences_quality_dash_option_240p": "240p", "preferences_quality_dash_option_240p": "240p",
"Video unavailable": "Vídeo não disponível", "Video unavailable": "Vídeo não disponível",
"Russian (auto-generated)": "Russo (gerado automaticamente)", "Russian (auto-generated)": "Russo (gerado automaticamente)",
"comments_view_x_replies_0": "Ver {{count}} resposta", "comments_view_x_replies": "Ver {{count}} resposta",
"comments_view_x_replies_1": "Ver {{count}} respostas", "comments_view_x_replies_plural": "Ver {{count}} respostas",
"comments_view_x_replies_2": "Ver {{count}} respostas", "comments_points_count": "{{count}} ponto",
"comments_points_count_0": "{{count}} ponto", "comments_points_count_plural": "{{count}} pontos",
"comments_points_count_1": "{{count}} pontos",
"comments_points_count_2": "{{count}} pontos",
"English (United Kingdom)": "Inglês (Reino Unido)", "English (United Kingdom)": "Inglês (Reino Unido)",
"Chinese (Hong Kong)": "Chinês (Hong Kong)", "Chinese (Hong Kong)": "Chinês (Hong Kong)",
"Chinese (Taiwan)": "Chinês (Taiwan)", "Chinese (Taiwan)": "Chinês (Taiwan)",
@@ -446,13 +432,13 @@
"videoinfo_watch_on_youTube": "Ver no YouTube", "videoinfo_watch_on_youTube": "Ver no YouTube",
"videoinfo_youTube_embed_link": "Incorporar", "videoinfo_youTube_embed_link": "Incorporar",
"adminprefs_modified_source_code_url_label": "URL do repositório do código-fonte alterado", "adminprefs_modified_source_code_url_label": "URL do repositório do código-fonte alterado",
"videoinfo_invidious_embed_link": "Incorporar ligação", "videoinfo_invidious_embed_link": "Incorporar hiperligação",
"none": "nenhum", "none": "nenhum",
"videoinfo_started_streaming_x_ago": "Iniciou a transmissão há `x`", "videoinfo_started_streaming_x_ago": "Iniciou a transmissão há `x`",
"download_subtitles": "Legendas - `x` (.vtt)", "download_subtitles": "Legendas - `x` (.vtt)",
"user_created_playlists": "`x` listas de reprodução criadas", "user_created_playlists": "`x` listas de reprodução criadas",
"user_saved_playlists": "`x` listas de reprodução guardadas", "user_saved_playlists": "`x` listas de reprodução guardadas",
"preferences_save_player_pos_label": "Guardar posição de reprodução: ", "preferences_save_player_pos_label": "Guardar a posição de reprodução atual do vídeo: ",
"Turkish (auto-generated)": "Turco (gerado automaticamente)", "Turkish (auto-generated)": "Turco (gerado automaticamente)",
"Cantonese (Hong Kong)": "Cantonês (Hong Kong)", "Cantonese (Hong Kong)": "Cantonês (Hong Kong)",
"Chinese (China)": "Chinês (China)", "Chinese (China)": "Chinês (China)",
@@ -469,55 +455,21 @@
"search_filters_date_option_none": "Qualquer data", "search_filters_date_option_none": "Qualquer data",
"search_filters_features_option_three_sixty": "360°", "search_filters_features_option_three_sixty": "360°",
"search_filters_features_option_vr180": "VR180", "search_filters_features_option_vr180": "VR180",
"search_message_use_another_instance": "Também pode <a href=\"`x`\">pesquisar noutra instância</a>.", "search_message_use_another_instance": " Também pode <a href=\"`x`\">pesquisar noutra instância</a>.",
"crash_page_you_found_a_bug": "Parece que encontrou um erro no Invidious!", "crash_page_you_found_a_bug": "Parece que encontrou um erro no Invidious!",
"crash_page_before_reporting": "Antes de reportar um erro, verifique se:", "crash_page_before_reporting": "Antes de reportar um erro, verifique se:",
"crash_page_read_the_faq": "leu as <a href=\"`x`\">Perguntas frequentes (FAQ)</a>", "crash_page_read_the_faq": "leia as <a href=\"`x`\">Perguntas frequentes (FAQ)</a>",
"crash_page_search_issue": "procurou se <a href=\"`x`\">o erro já foi reportado no GitHub</a>", "crash_page_search_issue": "procurou se <a href=\"`x`\">o erro já foi reportado no GitHub</a>",
"crash_page_report_issue": "Se nenhuma opção acima ajudou, por favor <a href=\"`x`\">abra um novo problema no Github</a> (preferencialmente em inglês) e inclua o seguinte texto (NÃO o traduza):", "crash_page_report_issue": "Se nenhuma opção acima ajudou, por favor <a href=\"`x`\">abra um novo problema no Github</a> (preferencialmente em inglês) e inclua o seguinte texto tal qual (NÃO o traduza):",
"search_message_change_filters_or_query": "Tente alargar os termos genéricos da pesquisa e/ou alterar os filtros.", "search_message_change_filters_or_query": "Tente alargar os termos genéricos da pesquisa e/ou alterar os filtros.",
"crash_page_refresh": "tentou <a href=\"`x`\">recarregar a página</a>", "crash_page_refresh": "tentou <a href=\"`x`\">recarregar a página</a>",
"crash_page_switch_instance": "tentou <a href=\"`x`\">usar outra instância</a>", "crash_page_switch_instance": "tentou <a href=\"`x`\">usar outra instância</a>",
"error_video_not_in_playlist": "O vídeo pedido não existe nesta lista de reprodução. <a href=\"`x`\">Clique aqui para voltar à página inicial da lista de reprodução.</a>", "error_video_not_in_playlist": "O vídeo pedido não existe nesta lista de reprodução. <a href=\"`x`\">Clique aqui para a página inicial da lista de reprodução.</a>",
"Artist: ": "Artista: ", "Artist: ": "Artista: ",
"Album: ": "Álbum: ", "Album: ": "Álbum: ",
"channel_tab_streams_label": "Emissões em direto", "channel_tab_streams_label": "Diretos",
"channel_tab_playlists_label": "Listas de reprodução", "channel_tab_playlists_label": "Listas de reprodução",
"channel_tab_channels_label": "Canais", "channel_tab_channels_label": "Canais",
"Music in this video": "Música neste vídeo", "Music in this video": "Música neste vídeo",
"channel_tab_shorts_label": "Curtos", "channel_tab_shorts_label": "Curtos"
"generic_button_delete": "Eliminar",
"generic_button_edit": "Editar",
"generic_button_save": "Guardar",
"generic_button_cancel": "Cancelar",
"Import YouTube playlist (.csv)": "Importar lista de reprodução do YouTube (.csv)",
"Song: ": "Canção: ",
"Answer": "Responder",
"The Popular feed has been disabled by the administrator.": "O feed Popular foi desativado por um administrador.",
"Channel Sponsor": "Patrocinador do canal",
"Download is disabled": "A descarga está desativada",
"Add to playlist": "Adicionar à lista de reprodução",
"Add to playlist: ": "Adicionar à lista de reprodução: ",
"Search for videos": "Procurar vídeos",
"generic_channels_count_0": "{{count}} canal",
"generic_channels_count_1": "{{count}} canais",
"generic_channels_count_2": "{{count}} canais",
"generic_button_rss": "RSS",
"Import YouTube watch history (.json)": "Importar histórico de reprodução do YouTube (.json)",
"preferences_preload_label": "Pré-carregamento dos dados: ",
"playlist_button_add_items": "Adicionar vídeos",
"channel_tab_podcasts_label": "Podcasts",
"channel_tab_releases_label": "Lançamentos",
"carousel_slide": "Diapositivo {{current}} de{{total}}",
"carousel_skip": "Ignorar carrossel",
"carousel_go_to": "Ir para o diapositivo`x`",
"First page": "Primeira página",
"Standard YouTube license": "Licença padrão do YouTube",
"Filipino (auto-generated)": "Filipino (gerado automaticamente)",
"channel_tab_courses_label": "Cursos",
"channel_tab_posts_label": "Publicações",
"toggle_theme": "Trocar tema",
"timeline_parse_error_placeholder_heading": "Incapaz de processar o elemento",
"timeline_parse_error_placeholder_message": "O Invidious encontrou um problema ao processar este elemento. Para mais informações, veja abaixo:",
"timeline_parse_error_show_technical_details": "Mostrar detalhes técnicos"
} }

View File

@@ -236,6 +236,8 @@
"Preferences": "Preferências", "Preferences": "Preferências",
"E-mail": "E-mail", "E-mail": "E-mail",
"Register": "Registar", "Register": "Registar",
"Image CAPTCHA": "Imagem CAPTCHA",
"Text CAPTCHA": "Texto CAPTCHA",
"Time (h:mm:ss):": "Tempo (h:mm:ss):", "Time (h:mm:ss):": "Tempo (h:mm:ss):",
"Password": "Palavra-passe", "Password": "Palavra-passe",
"User ID": "Utilizador", "User ID": "Utilizador",
@@ -446,7 +448,7 @@
"Chinese (Taiwan)": "Chinês (Taiwan)", "Chinese (Taiwan)": "Chinês (Taiwan)",
"search_message_no_results": "Nenhum resultado encontrado.", "search_message_no_results": "Nenhum resultado encontrado.",
"search_message_change_filters_or_query": "Tente alargar os termos genéricos da pesquisa e/ou alterar os filtros.", "search_message_change_filters_or_query": "Tente alargar os termos genéricos da pesquisa e/ou alterar os filtros.",
"search_message_use_another_instance": "Também pode <a href=\"`x`\">pesquisar noutra instância</a>.", "search_message_use_another_instance": " Também pode <a href=\"`x`\">pesquisar noutra instância</a>.",
"English (United Kingdom)": "Inglês (Reino Unido)", "English (United Kingdom)": "Inglês (Reino Unido)",
"English (United States)": "Inglês (Estados Unidos)", "English (United States)": "Inglês (Estados Unidos)",
"Cantonese (Hong Kong)": "Cantonês (Hong Kong)", "Cantonese (Hong Kong)": "Cantonês (Hong Kong)",
@@ -506,15 +508,10 @@
"toggle_theme": "Trocar tema", "toggle_theme": "Trocar tema",
"Add to playlist": "Adicionar à lista de reprodução", "Add to playlist": "Adicionar à lista de reprodução",
"Add to playlist: ": "Adicionar à lista de reprodução: ", "Add to playlist: ": "Adicionar à lista de reprodução: ",
"Answer": "Responder", "Answer": "Resposta",
"Search for videos": "Procurar vídeos", "Search for videos": "Procurar vídeos",
"carousel_slide": "Diapositivo {{current}} de{{total}}", "carousel_slide": "Diapositivo {{current}} de{{total}}",
"carousel_skip": "Ignorar carrossel", "carousel_skip": "Ignorar carrossel",
"carousel_go_to": "Ir para o diapositivo`x`", "carousel_go_to": "Ir para o diapositivo`x`",
"The Popular feed has been disabled by the administrator.": "O feed Popular foi desativado por um administrador.", "The Popular feed has been disabled by the administrator.": "O feed Popular foi desativado por um administrador."
"preferences_preload_label": "Pré-carregamento dos dados: ",
"Filipino (auto-generated)": "Filipino (gerado automaticamente)",
"First page": "Primeira página",
"channel_tab_courses_label": "Cursos",
"channel_tab_posts_label": "Publicações"
} }

View File

@@ -39,6 +39,8 @@
"User ID": "ID Utilizator", "User ID": "ID Utilizator",
"Password": "Parolă", "Password": "Parolă",
"Time (h:mm:ss):": "Ora (h:mm:ss) :", "Time (h:mm:ss):": "Ora (h:mm:ss) :",
"Text CAPTCHA": "Text CAPTCHA",
"Image CAPTCHA": "Imagine CAPTCHA",
"Sign In": "Conectați-vă", "Sign In": "Conectați-vă",
"Register": "Înregistrați-vă", "Register": "Înregistrați-vă",
"E-mail": "E-mail", "E-mail": "E-mail",

View File

@@ -11,7 +11,6 @@
"last": "последние", "last": "последние",
"Next page": "Следующая страница", "Next page": "Следующая страница",
"Previous page": "Предыдущая страница", "Previous page": "Предыдущая страница",
"First page": "Первая страница",
"Clear watch history?": "Очистить историю просмотров?", "Clear watch history?": "Очистить историю просмотров?",
"New password": "Новый пароль", "New password": "Новый пароль",
"New passwords must match": "Новые пароли не совпадают", "New passwords must match": "Новые пароли не совпадают",
@@ -22,7 +21,7 @@
"Import and Export Data": "Импорт и экспорт данных", "Import and Export Data": "Импорт и экспорт данных",
"Import": "Импорт", "Import": "Импорт",
"Import Invidious data": "Импортировать JSON с данными Invidious", "Import Invidious data": "Импортировать JSON с данными Invidious",
"Import YouTube subscriptions": "Импортировать подписки из YouTube через файлы CSV или OPML", "Import YouTube subscriptions": "Импортировать подписки из CSV или OPML",
"Import FreeTube subscriptions (.db)": "Импортировать подписки из FreeTube (.db)", "Import FreeTube subscriptions (.db)": "Импортировать подписки из FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Импортировать подписки из NewPipe (.json)", "Import NewPipe subscriptions (.json)": "Импортировать подписки из NewPipe (.json)",
"Import NewPipe data (.zip)": "Импортировать данные из NewPipe (.zip)", "Import NewPipe data (.zip)": "Импортировать данные из NewPipe (.zip)",
@@ -40,6 +39,8 @@
"User ID": "ИД пользователя", "User ID": "ИД пользователя",
"Password": "Пароль", "Password": "Пароль",
"Time (h:mm:ss):": "Время (ч:мм:сс):", "Time (h:mm:ss):": "Время (ч:мм:сс):",
"Text CAPTCHA": "Текстовая капча (англ.)",
"Image CAPTCHA": "Капча-картинка",
"Sign In": "Войти", "Sign In": "Войти",
"Register": "Регистрация", "Register": "Регистрация",
"E-mail": "Эл. почта", "E-mail": "Эл. почта",
@@ -47,8 +48,8 @@
"preferences_category_player": "Настройки проигрывателя", "preferences_category_player": "Настройки проигрывателя",
"preferences_video_loop_label": "Всегда повторять: ", "preferences_video_loop_label": "Всегда повторять: ",
"preferences_autoplay_label": "Автовоспроизведение: ", "preferences_autoplay_label": "Автовоспроизведение: ",
"preferences_continue_label": "Воспроизводить следующее видео: ", "preferences_continue_label": "Переходить к следующему видео? ",
"preferences_continue_autoplay_label": "Автовоспроизведение следующего видео: ", "preferences_continue_autoplay_label": "Автопроигрывание следующего видео: ",
"preferences_listen_label": "Режим «только аудио» по умолчанию: ", "preferences_listen_label": "Режим «только аудио» по умолчанию: ",
"preferences_local_label": "Проигрывать видео через прокси? ", "preferences_local_label": "Проигрывать видео через прокси? ",
"preferences_speed_label": "Скорость видео по умолчанию: ", "preferences_speed_label": "Скорость видео по умолчанию: ",
@@ -473,7 +474,7 @@
"search_filters_date_option_none": "Любая дата", "search_filters_date_option_none": "Любая дата",
"search_filters_date_label": "Дата загрузки", "search_filters_date_label": "Дата загрузки",
"search_message_no_results": "Ничего не найдено.", "search_message_no_results": "Ничего не найдено.",
"search_message_use_another_instance": "Дополнительно вы можете <a href=\"`x`\">поискать на других зеркалах</a>.", "search_message_use_another_instance": " Дополнительно вы можете <a href=\"`x`\">поискать на других зеркалах</a>.",
"search_filters_features_option_vr180": "VR180", "search_filters_features_option_vr180": "VR180",
"search_message_change_filters_or_query": "Попробуйте расширить поисковый запрос и/или изменить фильтры.", "search_message_change_filters_or_query": "Попробуйте расширить поисковый запрос и/или изменить фильтры.",
"search_filters_duration_option_medium": "Средние (4 - 20 минут)", "search_filters_duration_option_medium": "Средние (4 - 20 минут)",
@@ -508,18 +509,6 @@
"Add to playlist: ": "Добавить в плейлист: ", "Add to playlist: ": "Добавить в плейлист: ",
"Answer": "Ответить", "Answer": "Ответить",
"Search for videos": "Поиск видео", "Search for videos": "Поиск видео",
"The Popular feed has been disabled by the administrator.": "Лента популярного была отключена администратором.", "The Popular feed has been disabled by the administrator.": "Популярная лента была отключена администратором.",
"toggle_theme": "Переключить тему оформления", "toggle_theme": "Переключатель тем"
"carousel_slide": "Слайд {{current}} из {{total}}",
"carousel_skip": "Пропустить всё",
"carousel_go_to": "Перейти на слайд `x`",
"preferences_preload_label": "Предзагрузка видеоданных: ",
"channel_tab_courses_label": "Курсы",
"channel_tab_posts_label": "Записи",
"timeline_parse_error_placeholder_message": "Invidious столкнулся с ошибкой, пытаясь разобрать с этот элемент. Подробнее смотрите ниже:",
"timeline_parse_error_placeholder_heading": "Невозможно разобрать элемент",
"timeline_parse_error_show_technical_details": "Показать технические подробности",
"Filipino (auto-generated)": "Филиппинский (автоматически сгенерировано)",
"preferences_default_playlist": "Плейлист по умолчанию: ",
"preferences_default_playlist_none": "Плейлист по умолчанию не указан"
} }

View File

@@ -82,6 +82,8 @@
"Export subscriptions as OPML": "දායකත්වයන් OPML ලෙස අපනයනය කරන්න", "Export subscriptions as OPML": "දායකත්වයන් OPML ලෙස අපනයනය කරන්න",
"JavaScript license information": "JavaScript බලපත්‍ර තොරතුරු", "JavaScript license information": "JavaScript බලපත්‍ර තොරතුරු",
"User ID": "පරිශීලක කේතය", "User ID": "පරිශීලක කේතය",
"Text CAPTCHA": "CAPTCHA පෙල",
"Image CAPTCHA": "CAPTCHA රූපය",
"E-mail": "විද්‍යුත් තැපෑල", "E-mail": "විද්‍යුත් තැපෑල",
"preferences_quality_label": "කැමති වීඩියෝ ගුණත්වය: ", "preferences_quality_label": "කැමති වීඩියෝ ගුණත්වය: ",
"preferences_quality_option_hd720": "HD720", "preferences_quality_option_hd720": "HD720",

View File

@@ -36,6 +36,8 @@
"User ID": "ID používateľa", "User ID": "ID používateľa",
"Password": "Heslo", "Password": "Heslo",
"Time (h:mm:ss):": "Čas (h:mm:ss):", "Time (h:mm:ss):": "Čas (h:mm:ss):",
"Text CAPTCHA": "Textové CAPTCHA",
"Image CAPTCHA": "Obrázkové CAPTCHA",
"Sign In": "Prihlásiť sa", "Sign In": "Prihlásiť sa",
"Register": "Registrovať", "Register": "Registrovať",
"E-mail": "E-mail", "E-mail": "E-mail",

View File

@@ -13,7 +13,7 @@
"Import and Export Data": "Uvoz in izvoz podatkov", "Import and Export Data": "Uvoz in izvoz podatkov",
"Import": "Uvozi", "Import": "Uvozi",
"Import Invidious data": "Uvozi Invidious JSON podatke", "Import Invidious data": "Uvozi Invidious JSON podatke",
"Import YouTube subscriptions": "Uvozi YouTube CSV ali OPML naročnine", "Import YouTube subscriptions": "Uvozi YouTube/OPML naročnine",
"Import FreeTube subscriptions (.db)": "Uvozi FreeTube (.db) naročnine", "Import FreeTube subscriptions (.db)": "Uvozi FreeTube (.db) naročnine",
"Import NewPipe data (.zip)": "Uvozi NewPipe (.zip) podatke", "Import NewPipe data (.zip)": "Uvozi NewPipe (.zip) podatke",
"Export": "Izvozi", "Export": "Izvozi",
@@ -24,7 +24,9 @@
"User ID": "ID uporabnika", "User ID": "ID uporabnika",
"Password": "Geslo", "Password": "Geslo",
"Time (h:mm:ss):": "Čas (h:mm:ss):", "Time (h:mm:ss):": "Čas (h:mm:ss):",
"Text CAPTCHA": "Besedilo CAPTCHA",
"source": "izvorna koda", "source": "izvorna koda",
"Image CAPTCHA": "Slika CAPTCHA",
"Sign In": "Prijavi se", "Sign In": "Prijavi se",
"Register": "Registriraj se", "Register": "Registriraj se",
"E-mail": "E-pošta", "E-mail": "E-pošta",
@@ -103,7 +105,7 @@
"Show more": "Pokaži več", "Show more": "Pokaži več",
"Switch Invidious Instance": "Preklopi Invidious instanco", "Switch Invidious Instance": "Preklopi Invidious instanco",
"search_message_change_filters_or_query": "Poskusi razširiti iskalno poizvedbo in/ali spremeniti filtre.", "search_message_change_filters_or_query": "Poskusi razširiti iskalno poizvedbo in/ali spremeniti filtre.",
"search_message_use_another_instance": "Lahko tudi <a href=\"`x`\">iščeš v drugi istanci</a>.", "search_message_use_another_instance": " Lahko tudi <a href=\"`x`\">iščeš v drugi istanci</a>.",
"Wilson score: ": "Wilsonov rezultat: ", "Wilson score: ": "Wilsonov rezultat: ",
"Engagement: ": "Sodelovanje: ", "Engagement: ": "Sodelovanje: ",
"Blacklisted regions: ": "Regije na seznamu nedovoljenih: ", "Blacklisted regions: ": "Regije na seznamu nedovoljenih: ",
@@ -460,7 +462,7 @@
"search_filters_features_option_four_k": "4K", "search_filters_features_option_four_k": "4K",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"next_steps_error_message_refresh": "Osveži", "next_steps_error_message_refresh": "Osveži",
"search_filters_date_option_hour": "V zadnji uri", "search_filters_date_option_hour": "Zadnja ura",
"search_filters_features_option_purchased": "Kupljeno", "search_filters_features_option_purchased": "Kupljeno",
"search_filters_sort_label": "Razvrsti po", "search_filters_sort_label": "Razvrsti po",
"search_filters_sort_option_views": "številu ogledov", "search_filters_sort_option_views": "številu ogledov",
@@ -519,22 +521,5 @@
"generic_channels_count_1": "{{count}} kanala", "generic_channels_count_1": "{{count}} kanala",
"generic_channels_count_2": "{{count}} kanali", "generic_channels_count_2": "{{count}} kanali",
"generic_channels_count_3": "{{count}} kanalov", "generic_channels_count_3": "{{count}} kanalov",
"Import YouTube watch history (.json)": "Uvozi zgodovino gledanja YouTube (.json)", "Import YouTube watch history (.json)": "Uvozi zgodovino gledanja YouTube (.json)"
"Add to playlist": "Dodaj na seznam predvajanja",
"Add to playlist: ": "Dodaj na seznam predvajanja: ",
"Search for videos": "Iskanje videoposnetkov",
"The Popular feed has been disabled by the administrator.": "Administrator je onemogočil priljubljeni vir.",
"Answer": "Odgovor",
"Filipino (auto-generated)": "filipinščina (samodejno ustvarjeno)",
"toggle_theme": "Preklopi temo",
"carousel_slide": "Diapozitiv {{current}} od {{total}}",
"carousel_skip": "Preskoči galerijo",
"carousel_go_to": "Pojdi na diapozitiv `x`",
"preferences_preload_label": "Predhodno naloži video podatke: ",
"First page": "Prva stran",
"channel_tab_courses_label": "Tečaji",
"channel_tab_posts_label": "Objave",
"timeline_parse_error_placeholder_heading": "Elementa ni mogoče razčleniti",
"timeline_parse_error_placeholder_message": "Invidious je naletel na napako pri poskusu razčlenitve tega elementa. Za več informacij glej spodaj:",
"timeline_parse_error_show_technical_details": "Pokaži tehnične podrobnosti"
} }

View File

@@ -42,6 +42,8 @@
"User ID": "ID Përdoruesi", "User ID": "ID Përdoruesi",
"Password": "Fjalëkalim", "Password": "Fjalëkalim",
"Time (h:mm:ss):": "Kohë (h:mm:ss):", "Time (h:mm:ss):": "Kohë (h:mm:ss):",
"Text CAPTCHA": "CAPTCHA Tekst",
"Image CAPTCHA": "CAPTCHA Figurë",
"Sign In": "Hyni", "Sign In": "Hyni",
"Register": "Regjistrohuni", "Register": "Regjistrohuni",
"E-mail": "Email", "E-mail": "Email",
@@ -255,13 +257,13 @@
"Video mode": "Mënyrë video", "Video mode": "Mënyrë video",
"channel_tab_videos_label": "Video", "channel_tab_videos_label": "Video",
"search_filters_sort_option_rating": "Vlerësim", "search_filters_sort_option_rating": "Vlerësim",
"search_filters_sort_option_date": "Datë ngarkimi", "search_filters_sort_option_date": "Datë Ngarkimi",
"search_filters_sort_option_views": "Numër parjesh", "search_filters_sort_option_views": "Numër parjesh",
"search_filters_type_label": "Lloj", "search_filters_type_label": "Lloj",
"search_filters_duration_label": "Kohëzgjatje", "search_filters_duration_label": "Kohëzgjatje",
"search_filters_features_label": "Veçori", "search_filters_features_label": "Veçori",
"search_filters_sort_label": "Renditi Sipas", "search_filters_sort_label": "Renditi Sipas",
"search_filters_date_option_hour": "Orën e fundit", "search_filters_date_option_hour": "Orën e Fundit",
"search_filters_date_option_today": "Sot", "search_filters_date_option_today": "Sot",
"search_filters_duration_option_long": "E gjatë (> 20 minuta)", "search_filters_duration_option_long": "E gjatë (> 20 minuta)",
"search_filters_features_option_hd": "HD", "search_filters_features_option_hd": "HD",
@@ -433,14 +435,14 @@
"tokens_count_plural": "{{count}} tokenë", "tokens_count_plural": "{{count}} tokenë",
"preferences_save_player_pos_label": "Mba mend pozicionin e luajtjes: ", "preferences_save_player_pos_label": "Mba mend pozicionin e luajtjes: ",
"Import Invidious data": "Importoni të dhëna JSON Invidious", "Import Invidious data": "Importoni të dhëna JSON Invidious",
"Import YouTube subscriptions": "Importoni pajtime YouTube CSV ose OPML", "Import YouTube subscriptions": "Importoni pajtime YouTube/OPML",
"Export data as JSON": "Eksportoji të dhënat Invidious si JSON", "Export data as JSON": "Eksportoji të dhënat Invidious si JSON",
"preferences_vr_mode_label": "Video me ndërveprim 360 gradë (lyp WebGL): ", "preferences_vr_mode_label": "Video me ndërveprim 360 gradë (lyp WebGL): ",
"Shared `x`": "Ndarë me të tjerë më `x`", "Shared `x`": "Ndarë me të tjerë më `x`",
"search_filters_title": "Filtra", "search_filters_title": "Filtra",
"Popular enabled: ": "Me populloret të aktivizuara: ", "Popular enabled: ": "Me populloret të aktivizuara: ",
"error_video_not_in_playlist": "Videoja e kërkuar sekziston në këtë luajlistë. <a href=\"`x`\">Klikoni këtu për faqen hyrëse të luajlistës.</a>", "error_video_not_in_playlist": "Videoja e kërkuar sekziston në këtë luajlistë. <a href=\"`x`\">Klikoni këtu për faqen hyrëse të luajlistës.</a>",
"search_message_use_another_instance": "Mundeni edhe të <a href=\"`x`\">kërkoni në një instancë tjetër</a>.", "search_message_use_another_instance": " Mundeni edhe të <a href=\"`x`\">kërkoni në një instancë tjetër</a>.",
"search_filters_date_label": "Datë ngarkimi", "search_filters_date_label": "Datë ngarkimi",
"preferences_watch_history_label": "Aktivizo historik parjesh: ", "preferences_watch_history_label": "Aktivizo historik parjesh: ",
"Top enabled: ": "Me kryesueset të aktivizuara: ", "Top enabled: ": "Me kryesueset të aktivizuara: ",
@@ -482,19 +484,5 @@
"Import YouTube watch history (.json)": "Importo historik parjesh YouTube (.json)", "Import YouTube watch history (.json)": "Importo historik parjesh YouTube (.json)",
"preferences_local_label": "Video përmes ndërmjetësi: ", "preferences_local_label": "Video përmes ndërmjetësi: ",
"Fallback captions: ": "Titra nga halli: ", "Fallback captions: ": "Titra nga halli: ",
"Erroneous challenge": "Zgjidhje e gabuar", "Erroneous challenge": "Zgjidhje e gabuar"
"Add to playlist: ": "Shtoje te luajlistë: ",
"Add to playlist": "Shtoje te luajlistë",
"Answer": "Përgjigje",
"Search for videos": "Kërko për video",
"The Popular feed has been disabled by the administrator.": "Prurja Popullore është çaktivizuar nga përgjegjësi.",
"carousel_skip": "Anashkaloje Rrotullamen",
"carousel_slide": "Diapozitiv {{current}} nga {{total}}",
"carousel_go_to": "Kalo te diapozitivi `x`",
"Filipino (auto-generated)": "Filipineze (të prodhuara automatikisht)",
"preferences_preload_label": "Parangarko të dhëna videoje: ",
"toggle_theme": "Ndërroni Temë",
"channel_tab_courses_label": "Kurse",
"channel_tab_posts_label": "Postime",
"First page": "Faqja e parë"
} }

View File

@@ -39,6 +39,8 @@
"User ID": "ID korisnika", "User ID": "ID korisnika",
"Password": "Lozinka", "Password": "Lozinka",
"Time (h:mm:ss):": "Vreme (č:mm:ss):", "Time (h:mm:ss):": "Vreme (č:mm:ss):",
"Text CAPTCHA": "Tekst CAPTCHA",
"Image CAPTCHA": "Slika CAPTCHA",
"Sign In": "Prijava", "Sign In": "Prijava",
"Register": "Registracija", "Register": "Registracija",
"E-mail": "Imejl", "E-mail": "Imejl",
@@ -402,7 +404,7 @@
"generic_count_months_0": "{{count}} mesec", "generic_count_months_0": "{{count}} mesec",
"generic_count_months_1": "{{count}} meseca", "generic_count_months_1": "{{count}} meseca",
"generic_count_months_2": "{{count}} meseci", "generic_count_months_2": "{{count}} meseci",
"search_message_use_another_instance": "Takođe, možete <a href=\"`x`\">pretraživati na drugoj instanci</a>.", "search_message_use_another_instance": " Takođe, možete <a href=\"`x`\">pretraživati na drugoj instanci</a>.",
"generic_subscribers_count_0": "{{count}} pratilac", "generic_subscribers_count_0": "{{count}} pratilac",
"generic_subscribers_count_1": "{{count}} pratioca", "generic_subscribers_count_1": "{{count}} pratioca",
"generic_subscribers_count_2": "{{count}} pratilaca", "generic_subscribers_count_2": "{{count}} pratilaca",
@@ -511,13 +513,5 @@
"Answer": "Odgovor", "Answer": "Odgovor",
"Search for videos": "Pretražite video snimke", "Search for videos": "Pretražite video snimke",
"carousel_skip": "Preskoči karusel", "carousel_skip": "Preskoči karusel",
"toggle_theme": "Podesi temu", "toggle_theme": "Подеси тему"
"preferences_preload_label": "Unapred učitaj podatke o video snimku: ",
"Filipino (auto-generated)": "Filipinski (automatski generisano)",
"channel_tab_posts_label": "Objave",
"First page": "Prva stranica",
"channel_tab_courses_label": "Kursevi",
"timeline_parse_error_placeholder_heading": "Nije moguće raščlaniti predmet",
"timeline_parse_error_show_technical_details": "Prikaži tehničke detalje",
"timeline_parse_error_placeholder_message": "Invidious je naišao na grešku prilikom pokušaja raščlanjivanja ovog predmeta. Za više informacija pogledajte ispod:"
} }

View File

@@ -39,6 +39,8 @@
"User ID": "ID корисника", "User ID": "ID корисника",
"Password": "Лозинка", "Password": "Лозинка",
"Time (h:mm:ss):": "Време (ч:мм:сс):", "Time (h:mm:ss):": "Време (ч:мм:сс):",
"Text CAPTCHA": "Текст CAPTCHA",
"Image CAPTCHA": "Слика CAPTCHA",
"Sign In": "Пријава", "Sign In": "Пријава",
"Register": "Регистрација", "Register": "Регистрација",
"E-mail": "Имејл", "E-mail": "Имејл",
@@ -402,7 +404,7 @@
"generic_count_months_0": "{{count}} месец", "generic_count_months_0": "{{count}} месец",
"generic_count_months_1": "{{count}} месеца", "generic_count_months_1": "{{count}} месеца",
"generic_count_months_2": "{{count}} месеци", "generic_count_months_2": "{{count}} месеци",
"search_message_use_another_instance": "Такође, можете <a href=\"`x`\">претраживати на другој инстанци</a>.", "search_message_use_another_instance": " Такође, можете <a href=\"`x`\">претраживати на другој инстанци</a>.",
"generic_subscribers_count_0": "{{count}} пратилац", "generic_subscribers_count_0": "{{count}} пратилац",
"generic_subscribers_count_1": "{{count}} пратиоца", "generic_subscribers_count_1": "{{count}} пратиоца",
"generic_subscribers_count_2": "{{count}} пратилаца", "generic_subscribers_count_2": "{{count}} пратилаца",
@@ -511,13 +513,5 @@
"Add to playlist: ": "Додајте на плејлисту: ", "Add to playlist: ": "Додајте на плејлисту: ",
"carousel_skip": "Прескочи карусел", "carousel_skip": "Прескочи карусел",
"The Popular feed has been disabled by the administrator.": "Администратор је онемогућио фид „Популарно“.", "The Popular feed has been disabled by the administrator.": "Администратор је онемогућио фид „Популарно“.",
"carousel_slide": "Слајд {{current}} од {{total}}", "carousel_slide": "Слајд {{current}} од {{total}}"
"preferences_preload_label": "Унапред учитај податке о видео снимку: ",
"Filipino (auto-generated)": "Филипински (аутоматски генерисано)",
"channel_tab_courses_label": "Курсеви",
"First page": "Прва страница",
"channel_tab_posts_label": "Објаве",
"timeline_parse_error_show_technical_details": "Прикажи техничке детаље",
"timeline_parse_error_placeholder_heading": "Није могуће рашчланити предмет",
"timeline_parse_error_placeholder_message": "Invidious је наишао на грешку приликом покушаја рашчлањивања овог предмета. За више информација погледајте испод:"
} }

View File

@@ -39,6 +39,8 @@
"User ID": "Användar-ID", "User ID": "Användar-ID",
"Password": "Lösenord", "Password": "Lösenord",
"Time (h:mm:ss):": "Tid (h:mm:ss):", "Time (h:mm:ss):": "Tid (h:mm:ss):",
"Text CAPTCHA": "Text-CAPTCHA",
"Image CAPTCHA": "Bild-CAPTCHA",
"Sign In": "Inloggning", "Sign In": "Inloggning",
"Register": "Registrera", "Register": "Registrera",
"E-mail": "E-post", "E-mail": "E-post",
@@ -318,13 +320,13 @@
"channel_tab_community_label": "Gemenskap", "channel_tab_community_label": "Gemenskap",
"search_filters_sort_option_relevance": "Relevans", "search_filters_sort_option_relevance": "Relevans",
"search_filters_sort_option_rating": "Rankning", "search_filters_sort_option_rating": "Rankning",
"search_filters_sort_option_date": "Uppladdnings datum", "search_filters_sort_option_date": "Uppladdnings Datum",
"search_filters_sort_option_views": "Visningar", "search_filters_sort_option_views": "Visningar",
"search_filters_type_label": "Typ", "search_filters_type_label": "Typ",
"search_filters_duration_label": "Varaktighet", "search_filters_duration_label": "Varaktighet",
"search_filters_features_label": "Funktioner", "search_filters_features_label": "Funktioner",
"search_filters_sort_label": "Sortera efter", "search_filters_sort_label": "Sortera efter",
"search_filters_date_option_hour": "Senaste timmen", "search_filters_date_option_hour": "Senaste Timmen",
"search_filters_date_option_today": "Idag", "search_filters_date_option_today": "Idag",
"search_filters_date_option_week": "Denna vecka", "search_filters_date_option_week": "Denna vecka",
"search_filters_date_option_month": "Denna månad", "search_filters_date_option_month": "Denna månad",
@@ -391,7 +393,7 @@
"Artist: ": "Artist: ", "Artist: ": "Artist: ",
"generic_count_months": "{{count}}månad", "generic_count_months": "{{count}}månad",
"generic_count_months_plural": "{{count}}månader", "generic_count_months_plural": "{{count}}månader",
"search_message_use_another_instance": "Du kan också <a href=\"`x`\">söka på en annan instans</a>.", "search_message_use_another_instance": " Du kan också <a href=\"`x`\">söka på en annan instans</a>.",
"generic_subscribers_count": "{{count}} prenumerant", "generic_subscribers_count": "{{count}} prenumerant",
"generic_subscribers_count_plural": "{{count}} prenumeranter", "generic_subscribers_count_plural": "{{count}} prenumeranter",
"download_subtitles": "Undertexter - `x` (.vtt)", "download_subtitles": "Undertexter - `x` (.vtt)",
@@ -494,10 +496,5 @@
"The Popular feed has been disabled by the administrator.": "Det populära flödet har inaktiverats av administratören.", "The Popular feed has been disabled by the administrator.": "Det populära flödet har inaktiverats av administratören.",
"carousel_slide": "Bildspel {{current}} av {{total}}", "carousel_slide": "Bildspel {{current}} av {{total}}",
"carousel_skip": "Hoppa över karusellen", "carousel_skip": "Hoppa över karusellen",
"carousel_go_to": "Gå till bildspel `x`", "carousel_go_to": "Gå till bildspel `x`"
"preferences_preload_label": "Förladda video data: ",
"Filipino (auto-generated)": "Filippinska (auto-genererad)",
"First page": "Första sidan",
"channel_tab_courses_label": "Kurser",
"channel_tab_posts_label": "Inlägg"
} }

View File

@@ -1,506 +0,0 @@
{
"Add to playlist": "பிளேலிச்ட்டில் சேர்க்கவும்",
"generic_channels_count": "{{count}} சேனல்",
"generic_channels_count_plural": "{{count}} சேனல்கள்",
"generic_views_count": "{{count}} பார்வை",
"generic_views_count_plural": "{{count}} காட்சிகள்",
"generic_videos_count": "{{count}} வீடியோ",
"generic_videos_count_plural": "{{count}} வீடியோக்கள்",
"generic_playlists_count": "{{count}} பிளேலிச்ட்",
"generic_playlists_count_plural": "{{count}} பிளேலிச்ட்கள்",
"generic_subscribers_count": "{{count}} சந்தாதாரர்",
"generic_subscribers_count_plural": "{{count}} சந்தாதாரர்கள்",
"generic_button_delete": "நீக்கு",
"generic_button_rss": "ஆர்.எச்.எச்",
"LIVE": "வாழ",
"Shared `x` ago": "`X` முன்பு பகிரப்பட்டது",
"Unsubscribe": "குழுவிலகவும்",
"View playlist on YouTube": "யூடியூப்பில் பிளேலிச்ட்டைக் காண்க",
"newest": "புதியது",
"oldest": "பழமையானது",
"popular": "மக்கள்",
"last": "கடைசி",
"Next page": "அடுத்த பக்கம்",
"Previous page": "முந்தைய பக்கம்",
"Clear watch history?": "தெளிவான கண்காணிப்பு வரலாறு?",
"New password": "புதிய கடவுச்சொல்",
"New passwords must match": "புதிய கடவுச்சொற்கள் பொருந்த வேண்டும்",
"Authorize token?": "கிள்ளாக்கை அங்கீகரிக்கவா?",
"Yes": "ஆம்",
"Import YouTube playlist (.csv)": "யூடியூப் பிளேலிச்ட்டை இறக்குமதி செய்க (.csv)",
"Import YouTube watch history (.json)": "YouTube வாட்ச் வரலாற்றை இறக்குமதி செய்க (.json)",
"Import Invidious data": "வன்கவர்வு சாதொபொகு தரவை இறக்குமதி செய்க",
"Import YouTube subscriptions": "YouTube காபிம அல்லது OPML சந்தாக்களை இறக்குமதி செய்க",
"Import FreeTube subscriptions (.db)": "ஃப்ரீட்யூப் சந்தாக்களை இறக்குமதி செய்க (.db)",
"Import NewPipe data (.zip)": "நியூபைப் தரவை இறக்குமதி செய்க (.zip)",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "OPML ஆக சந்தாக்களை ஏற்றுமதி செய்யுங்கள் (நியூபைப் & ஃப்ரீட்யூப்பிற்கு)",
"Export subscriptions as OPML": "OPML ஆக சந்தாக்களை ஏற்றுமதி செய்யுங்கள்",
"Export data as JSON": "சாதொபொகு ஆக வன்கவர்வு தரவை ஏற்றுமதி செய்யுங்கள்",
"Delete account?": "கணக்கை நீக்கவா?",
"History": "வரலாறு",
"JavaScript license information": "சாவாச்கிரிப்ட் உரிம செய்தி",
"source": "மூலம்",
"An alternative front-end to YouTube": "YouTube க்கு ஒரு மாற்று முன் இறுதியில்",
"Log in": "புகுபதிகை",
"Log in/register": "உள்நுழைக/பதிவு செய்யுங்கள்",
"User ID": "பயனர் ஐடி",
"Password": "கடவுச்சொல்",
"Time (h:mm:ss):": "நேரம் (h: மிமீ: எச்எச்):",
"Sign In": "விடுபதிகை",
"Register": "பதிவு செய்யுங்கள்",
"E-mail": "மின்னஞ்சல்",
"Preferences": "விருப்பத்தேர்வுகள்",
"preferences_preload_label": "வீடியோ தரவை முன்பே ஏற்றவும்: ",
"preferences_autoplay_label": "தன்னியக்க: ",
"preferences_continue_label": "இயல்பாக அடுத்து விளையாடுங்கள்: ",
"preferences_local_label": "பதிலாள் வீடியோக்கள்: ",
"preferences_watch_history_label": "கண்காணிப்பு வரலாற்றை இயக்கு: ",
"preferences_speed_label": "இயல்புநிலை வேகம்: ",
"preferences_quality_label": "விருப்பமான வீடியோ தரம்: ",
"preferences_quality_dash_label": "விருப்பமான கோடு வீடியோ தரம்: ",
"preferences_quality_dash_option_auto": "தானி",
"preferences_quality_dash_option_best": "சிறந்த",
"preferences_quality_dash_option_worst": "மோசமான",
"preferences_quality_dash_option_4320p": "4320 ப",
"preferences_quality_dash_option_1080p": "1080 ப",
"preferences_quality_dash_option_720p": "720 ஆ",
"preferences_quality_dash_option_480p": "480 ப",
"preferences_quality_dash_option_360p": "360 ப",
"preferences_quality_dash_option_144p": "144 ப",
"preferences_volume_label": "பிளேயர் தொகுதி: ",
"preferences_comments_label": "இயல்புநிலை கருத்துகள்: ",
"Fallback captions: ": "குறைவடையும் தலைப்புகள்: ",
"preferences_captions_label": "இயல்புநிலை தலைப்புகள்: ",
"preferences_related_videos_label": "தொடர்புடைய வீடியோக்களைக் காட்டு: ",
"preferences_annotations_label": "முன்னிருப்பாக சிறுகுறிப்புகளைக் காட்டு: ",
"preferences_vr_mode_label": "ஊடாடும் 360 டிகிரி வீடியோக்கள் (வெப்சிஎல் தேவை): ",
"preferences_category_visual": "காட்சி விருப்பத்தேர்வுகள்",
"light": "ஒளி",
"preferences_thin_mode_label": "மெல்லிய பயன்முறை: ",
"preferences_category_misc": "இதர விருப்பத்தேர்வுகள்",
"preferences_category_subscription": "சந்தா விருப்பத்தேர்வுகள்",
"preferences_annotations_subscribed_label": "சந்தா சேனல்களுக்கு முன்னிருப்பாக சிறுகுறிப்புகளைக் காட்டவா? ",
"Redirect homepage to feed: ": "உணவளிக்க முகப்புப்பக்கத்தை திருப்பி விடுங்கள்: ",
"preferences_sort_label": "வீடியோக்களை வரிசைப்படுத்துங்கள்: ",
"published": "வெளியிடப்பட்டது",
"published - reverse": "வெளியிடப்பட்டது - தலைகீழ்",
"alphabetically": "அகரவரிசை",
"preferences_unseen_only_label": "கவனக்குறைவாக மட்டுமே காட்டுங்கள்: ",
"preferences_notifications_only_label": "அறிவிப்புகளைக் காட்டுங்கள் (ஏதேனும் இருந்தால்): ",
"Enable web notifications": "வலை அறிவிப்புகளை இயக்கவும்",
"`x` is live": "`x` நேரலையில்",
"preferences_category_data": "தரவு விருப்பத்தேர்வுகள்",
"Manage subscriptions": "சந்தாக்களை நிர்வகிக்கவும்",
"Watch history": "வரலாற்றைப் பாருங்கள்",
"Delete account": "கணக்கை நீக்கு",
"preferences_category_admin": "நிர்வாகி விருப்பத்தேர்வுகள்",
"preferences_default_home_label": "இயல்புநிலை முகப்புப்பக்கம்: ",
"preferences_feed_menu_label": "ஊட்ட மெனு: ",
"preferences_show_nick_label": "மேலே புனைப்பெயரைக் காட்டு: ",
"Top enabled: ": "மேலே இயக்கப்பட்டது: ",
"CAPTCHA enabled: ": "கேப்ட்சா இயக்கப்பட்டது: ",
"Login enabled: ": "உள்நுழைவு இயக்கப்பட்டது: ",
"Registration enabled: ": "பதிவு இயக்கப்பட்டது: ",
"Report statistics: ": "அறிக்கை புள்ளிவிவரங்கள்: ",
"Save preferences": "விருப்பங்களை சேமிக்கவும்",
"Subscription manager": "சந்தா மேலாளர்",
"Token manager": "கிள்ளாக்கு மேலாளர்",
"Token": "கிள்ளாக்கு",
"search": "தேடல்",
"Released under the AGPLv3 on Github.": "கிட்அப்பில் AgPlv3 இன் கீழ் வெளியிடப்பட்டது.",
"View JavaScript license information.": "சாவாச்கிரிப்ட் உரிமத் தகவலைக் காண்க.",
"View privacy policy.": "தனியுரிமைக் கொள்கையைக் காண்க.",
"Trending": "டிரெண்டிங்",
"Public": "பொது",
"Unlisted": "பட்டியலிடப்படாதது",
"Private": "தனிப்பட்ட",
"View all playlists": "அனைத்து பிளேலிச்ட்களையும் காண்க",
"Updated `x` ago": "`X` முன்பு புதுப்பிக்கப்பட்டது",
"Delete playlist `x`?": "பிளேலிச்ட்டை நீக்கவா?",
"Playlist privacy": "பிளேலிச்ட் தனியுரிமை",
"Watch on YouTube": "YouTube இல் பாருங்கள்",
"Hide annotations": "சிறுகுறிப்புகளை மறைக்கவும்",
"Show replies": "பதில்களைக் காட்டு",
"Incorrect password": "தவறான கடவுச்சொல்",
"Wrong answer": "தவறான பதில்",
"Erroneous CAPTCHA": "தவறான கேப்ட்சா",
"CAPTCHA is a required field": "கேப்ட்சா ஒரு தேவையான புலம்",
"User ID is a required field": "பயனர் ஐடி தேவையான புலம்",
"Password is a required field": "கடவுச்சொல் தேவையான புலம்",
"Password cannot be empty": "கடவுச்சொல் காலியாக இருக்க முடியாது",
"Please log in": "தயவுசெய்து உள்நுழைக",
"This channel does not exist.": "இந்த சேனல் இல்லை.",
"Could not get channel info.": "சேனல் தகவலைப் பெற முடியவில்லை.",
"Could not fetch comments": "கருத்துகளைப் பெற முடியவில்லை",
"comments_points_count": "{{count}} புள்ளி",
"comments_points_count_plural": "{{count}} புள்ளிகள்",
"Could not create mix.": "கலவையை உருவாக்க முடியவில்லை.",
"Empty playlist": "வெற்று பிளேலிச்ட்",
"Not a playlist.": "ஒரு பிளேலிச்ட் அல்ல.",
"Playlist does not exist.": "பிளேலிச்ட் இல்லை.",
"Could not pull trending pages.": "பிரபலமான பக்கங்களை இழுக்க முடியவில்லை.",
"Erroneous challenge": "தவறான அறைகூவல்",
"Erroneous token": "தவறான கிள்ளாக்கு",
"No such user": "அத்தகைய பயனர் இல்லை",
"Token is expired, please try again": "கிள்ளாக்கு காலாவதியானது, தயவுசெய்து மீண்டும் முயற்சிக்கவும்",
"English": "ஆங்கிலம்",
"English (United States)": "ஆங்கிலம் (ஐக்கிய அமெரிக்க)",
"English (United Kingdom)": "ஆங்கிலம் (ஐக்கிய முடியரசு)",
"English (auto-generated)": "ஆங்கிலம் (தானாக உருவாக்கப்பட்ட)",
"Afrikaans": "ஆப்பிரிக்கா",
"Albanian": "அல்பேனிய",
"Amharic": "அம்ஆரிக்",
"Arabic": "அரபு",
"Armenian": "ஆர்மீனியன்",
"Azerbaijani": "அசர்பைசானி",
"Bangla": "பாங்லா",
"Basque": "பாச்க்",
"Belarusian": "பெலாருசியன்",
"Bosnian": "போச்னிய",
"Bulgarian": "பல்கேரியன்",
"Burmese": "பர்மீச்",
"Cantonese (Hong Kong)": "கான்டோனீச் (ஆங்காங்)",
"Catalan": "கற்றலான்",
"Cebuano": "செபுவானோ",
"Chinese": "சீன",
"Chinese (China)": "சீன (சீனா)",
"Chinese (Hong Kong)": "சீன (ஆங்காங்)",
"Chinese (Simplified)": "சீன (எளிமைப்படுத்தப்பட்ட)",
"Chinese (Taiwan)": "சீன (தைவான்)",
"Chinese (Traditional)": "சீன (பாரம்பரிய)",
"Dutch": "டச்சு",
"Finnish": "பின்னிச்",
"French": "பிரஞ்சு",
"German (auto-generated)": "செர்மன் (தானாக உருவாக்கப்பட்ட)",
"Greek": "கிரேக்கம்",
"Gujarati": "குசராத்தி",
"Haitian Creole": "ஐட்டிய கிரியோல்",
"Hungarian": "அங்கேரியன்",
"Icelandic": "ஐச்லாந்திய",
"Igbo": "இக்போ",
"Korean (auto-generated)": "கொரிய (தானாக உருவாக்கப்பட்ட)",
"Macedonian": "மாசிடோனியன்",
"Malagasy": "மலகாசி",
"Maltese": "மால்டிச்",
"Maori": "மௌரி",
"Malayalam": "மலையாளம்",
"Marathi": "மராத்தி",
"Mongolian": "மங்கோலியன்",
"Nepali": "நேபாளி",
"Norwegian Bokmål": "நார்வேசியன் பொக்மால்",
"Nyanja": "நயன்சா",
"Russian": "ரச்ய",
"Russian (auto-generated)": "ரச்ய (தானாக உருவாக்கப்பட்ட)",
"Samoan": "சமோவான்",
"Scottish Gaelic": "ச்கோட்டிச் கயாலிக்",
"Serbian": "செர்பிய",
"Shona": "சோனா",
"Sindhi": "சிந்தி",
"Somali": "சோமாலி",
"Southern Sotho": "தெற்கத்திய சோதோ",
"Spanish": "ச்பானிச்",
"Spanish (auto-generated)": "ச்பானிச் (தானாக உருவாக்கப்பட்ட)",
"Sundanese": "சுந்தானியர்கள்",
"Swahili": "ச்வாஇலி",
"Swedish": "ச்வீடிச்",
"Tajik": "தசிக்",
"Tamil": "தமிழ்",
"Thai": "தாய்",
"Turkish": "துருக்கிய",
"Vietnamese": "வியட்நாமிய",
"Welsh": "வேல்ச்",
"Xhosa": "ஓசா",
"Yiddish": "யெட்டிச்",
"Yoruba": "யோருபா",
"Top": "மேலே",
"About": "பற்றி",
"View as playlist": "பிளேலிச்ட்டாக காண்க",
"Gaming": "கேமிங்",
"News": "செய்தி",
"Movies": "திரைப்படங்கள்",
"Download as: ": "என பதிவிறக்கவும்: ",
"Download is disabled": "பதிவிறக்கம் முடக்கப்பட்டுள்ளது",
"(edited)": "(திருத்தப்பட்டது)",
"YouTube comment permalink": "YouTube கருத்து பெர்மாலின்க்",
"`x` marked it with a ❤": "`x` அதை a உடன் குறித்தது",
"Video mode": "வீடியோ பயன்முறை",
"Playlists": "பிளேலிச்ட்கள்",
"search_filters_date_option_today": "இன்று",
"search_filters_date_option_week": "இந்த வாரம்",
"search_filters_date_option_month": "இந்த மாதம்",
"search_filters_type_option_channel": "வாய்க்கால்",
"search_filters_type_option_playlist": "பிளேலிச்ட்",
"search_filters_duration_label": "காலம்",
"search_filters_duration_option_none": "எந்த காலமும்",
"search_filters_duration_option_medium": "நடுத்தர (4 - 20 நிமிடங்கள்)",
"search_filters_duration_option_long": "நீண்ட (> 20 நிமிடங்கள்)",
"search_filters_features_label": "நற்பொருத்தங்கள்",
"search_filters_features_option_four_k": "எச்.சி.",
"search_filters_features_option_live": "நேரடி",
"search_filters_features_option_hd": "எச்டி",
"search_filters_features_option_subtitles": "வசன வரிகள்/சிசி",
"search_filters_features_option_c_commons": "கிரியேட்டிவ் காமன்ச்",
"search_filters_features_option_three_sixty": "360 °",
"search_filters_features_option_three_d": "ZD",
"search_filters_features_option_hdr": "எச்.டி.ஆர்",
"search_filters_features_option_location": "இடம்",
"search_filters_sort_option_relevance": "பொருத்தமானது",
"search_filters_sort_option_rating": "செயல்வரம்பு",
"Current version: ": "தற்போதைய பதிப்பு: ",
"next_steps_error_message": "அதன் பிறகு நீங்கள் முயற்சி செய்ய வேண்டும்: ",
"next_steps_error_message_refresh": "புதுப்பிப்பு",
"next_steps_error_message_go_to_youtube": "YouTube க்குச் செல்லுங்கள்",
"footer_donate_page": "நன்கொடை",
"footer_modfied_source_code": "மாற்றியமைக்கப்பட்ட மூலக் குறியீடு",
"adminprefs_modified_source_code_url_label": "மாற்றியமைக்கப்பட்ட மூலக் குறியீடு களஞ்சியத்திற்கு முகவரி",
"videoinfo_started_streaming_x_ago": "`X` முன்பு ச்ட்ரீமிங் செய்யத் தொடங்கியது",
"videoinfo_watch_on_youTube": "YouTube இல் பாருங்கள்",
"download_subtitles": "வசன வரிகள் - `x` (.vtt)",
"user_created_playlists": "`x` உருவாக்கியது பிளேலிச்ட்கள்",
"user_saved_playlists": "`x` சேமித்த பிளேலிச்ட்கள்",
"crash_page_before_reporting": "ஒரு பிழையைப் புகாரளிப்பதற்கு முன், உங்களிடம் இருப்பதை உறுதிப்படுத்திக் கொள்ளுங்கள்:",
"crash_page_switch_instance": "<a href = \"` x` \"> மற்றொரு நிகழ்வைப் பயன்படுத்த முயற்சித்தேன் </a>",
"crash_page_search_issue": "அறிவிலிமையத்தில் உள்ள <a href=\"`x`\"> தற்போதைய சிக்கல்களைத் தேடியது</a>",
"channel_tab_shorts_label": "குறுக்குகள்",
"channel_tab_streams_label": "லைவ்ச்ட்ரீம்கள்",
"carousel_go_to": "`X` ச்லைடு செல்லவும்",
"Popular": "புகழ்பெற்ற",
"Subscribe": "குழுசேர்",
"View channel on YouTube": "YouTube இல் சேனலைக் காண்க",
"Authorize token for `x`?": "`X` க்கு கிள்ளாக்கை அங்கீகரிக்கவா?",
"No": "இல்லை",
"Add to playlist: ": "பிளேலிச்ட்டில் சேர்க்கவும்: ",
"Answer": "பதில்",
"Search for videos": "வீடியோக்களைத் தேடுங்கள்",
"The Popular feed has been disabled by the administrator.": "பிரபலமான ஊட்டத்தை நிர்வாகியால் முடக்கப்பட்டுள்ளது.",
"generic_subscriptions_count": "{{count}} சந்தா",
"generic_subscriptions_count_plural": "{{count}} சந்தாக்கள்",
"generic_button_edit": "தொகு",
"generic_button_save": "சேமி",
"generic_button_cancel": "ரத்துசெய்",
"Import and Export Data": "தரவை இறக்குமதி செய்து ஏற்றுமதி செய்யுங்கள்",
"Import": "இறக்குமதி",
"Import NewPipe subscriptions (.json)": "நியூபிப்பிப் சந்தாக்களை இறக்குமதி செய்யுங்கள் (.json)",
"Export": "ஏற்றுமதி",
"preferences_category_player": "பிளேயர் விருப்பத்தேர்வுகள்",
"preferences_video_loop_label": "எப்போதும் லூப்: ",
"preferences_continue_autoplay_label": "தன்னியக்க அடுத்த வீடியோ: ",
"preferences_listen_label": "இயல்பாக கேளுங்கள்: ",
"preferences_quality_option_dash": "கோடு (தகவமைப்பு தரம்)",
"preferences_quality_option_hd720": "HD720",
"preferences_quality_option_medium": "சராசரி",
"preferences_quality_option_small": "சிறிய",
"preferences_quality_dash_option_2160p": "2160 ப",
"preferences_quality_dash_option_1440p": "1440 ப",
"preferences_quality_dash_option_240p": "240 ப",
"youtube": "YouTube",
"reddit": "ரெடிட்",
"invidious": "வெகுவாக",
"preferences_extend_desc_label": "வீடியோ விளக்கத்தை தானாக நீட்டிக்கவும்: ",
"preferences_region_label": "உள்ளடக்க நாடு: ",
"preferences_player_style_label": "பிளேயர் ச்டைல்: ",
"Dark mode: ": "இருண்ட முறை: ",
"preferences_dark_mode_label": "தீம்: ",
"dark": "இருண்ட",
"preferences_automatic_instance_redirect_label": "தானியங்கி நிகழ்வு திசைதிருப்பல் (redirect.invidious.io க்கு குறைவடையும்): ",
"preferences_max_results_label": "ஊட்டத்தில் காட்டப்பட்டுள்ள வீடியோக்களின் எண்ணிக்கை: ",
"alphabetically - reverse": "அகரவரிசை - தலைகீழ்",
"channel name": "சேனல் பெயர்",
"channel name - reverse": "சேனல் பெயர் - தலைகீழ்",
"Only show latest video from channel: ": "சேனலில் இருந்து அண்மைக் கால வீடியோவைக் காட்டுங்கள்: ",
"Only show latest unwatched video from channel: ": "சேனலில் இருந்து அண்மைக் கால கவனிக்கப்படாத வீடியோவைக் காட்டுங்கள்: ",
"`x` uploaded a video": "`x` ஒரு வீடியோவைப் பதிவேற்றியது",
"Clear watch history": "தெளிவான கண்காணிப்பு வரலாறு",
"Log out": "விடுபதிகை",
"Source available here.": "சான்று இங்கே கிடைக்கிறது.",
"Delete playlist": "பிளேலிச்ட்டை நீக்கு",
"Create playlist": "பிளேலிச்ட்டை உருவாக்கவும்",
"Title": "தலைப்பு",
"Import/export data": "தரவு இறக்குமதி/ஏற்றுமதி",
"Change password": "கடவுச்சொல்லை மாற்றவும்",
"Manage tokens": "டோக்கன்களை நிர்வகிக்கவும்",
"Popular enabled: ": "பிரபலமான இயக்கப்பட்டது: ",
"tokens_count": "{{count}} கிள்ளாக்கு",
"tokens_count_plural": "{{count}} டோக்கன்கள்",
"Import/export": "இறக்குமதி/ஏற்றுமதி",
"unsubscribe": "குழுவிலகவும்",
"revoke": "ரத்து செய்யுங்கள்",
"Subscriptions": "சந்தாக்கள்",
"subscriptions_unseen_notifs_count": "{{count}} காணப்படாத அறிவிப்பு",
"subscriptions_unseen_notifs_count_plural": "{{count}} காணப்படாத அறிவிப்புகள்",
"Editing playlist `x`": "பிளேலிச்ட்டைத் திருத்துதல் `x`",
"playlist_button_add_items": "வீடியோக்களைச் சேர்க்கவும்",
"Show more": "மேலும் காட்டு",
"Show less": "குறைவாகக் காட்டு",
"Switch Invidious Instance": "அக்யோர்ட் உதாரணத்தை மாற்றவும்",
"search_message_no_results": "முடிவுகள் எதுவும் கிடைக்கவில்லை.",
"search_message_change_filters_or_query": "உங்கள் தேடல் வினவலை அகலப்படுத்த முயற்சிக்கவும்/அல்லது வடிப்பான்களை மாற்றவும்.",
"search_message_use_another_instance": "நீங்கள் <a href = \"` x` \"> மற்றொரு நிகழ்வில் தேடலாம் </a>.",
"Show annotations": "சிறுகுறிப்புகளைக் காட்டு",
"Genre: ": "வகை: ",
"License: ": "உரிமம்: ",
"Standard YouTube license": "நிலையான YouTube உரிமம்",
"Family friendly? ": "குடும்ப நட்பு? ",
"Wilson score: ": "வில்சன் மதிப்பெண்: ",
"Engagement: ": "நிச்சயதார்த்தம்: ",
"Whitelisted regions: ": "அனுமதிப்பட்டிய பகுதிகள்: ",
"Blacklisted regions: ": "தடுப்புப்பட்டியாக்கப்பட்ட பகுதிகள்: ",
"Music in this video": "இந்த வீடியோவில் இசை",
"Artist: ": "கலைஞர்: ",
"Song: ": "பாடல்: ",
"Album: ": "ஆல்பம்: ",
"Shared `x`": "பகிரப்பட்டது `x`",
"Premieres in `x`": "`X` இல் பிரீமியர்ச்",
"Premieres `x`": "பிரீமியர்ச் `x`",
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "ஆய்! நீங்கள் சாவாச்கிரிப்ட் முடக்கப்பட்டிருப்பது போல் தெரிகிறது. கருத்துகளைக் காண இங்கே சொடுக்கு செய்க, அவர்கள் ஏற்றுவதற்கு சிறிது நேரம் ஆகலாம் என்பதை நினைவில் கொள்ளுங்கள்.",
"View YouTube comments": "YouTube கருத்துகளைக் காண்க",
"View more comments on Reddit": "ரெடிட் குறித்த கூடுதல் கருத்துகளைக் காண்க",
"View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "`X` கருத்தைக் காண்க",
"": "`X` கருத்துகளைக் காண்க"
},
"View Reddit comments": "ரெடிட் கருத்துகளைக் காண்க",
"Hide replies": "பதில்களை மறைக்கவும்",
"Wrong username or password": "தவறான பயனர்பெயர் அல்லது கடவுச்சொல்",
"Password cannot be longer than 55 characters": "கடவுச்சொல் 55 எழுத்துகளை விட நீளமாக இருக்க முடியாது",
"Invidious Private Feed for `x`": "`X` க்கான மோசமான தனியார் ஊட்டம்",
"channel:`x`": "சேனல்: `x`",
"Deleted or invalid channel": "நீக்கப்பட்ட அல்லது தவறான சேனல்",
"comments_view_x_replies": "{{count}} பதிலைக் காண்க",
"comments_view_x_replies_plural": "{{count}} பதில்களைக் காண்க",
"`x` ago": "`x` முன்பு",
"Load more": "மேலும் ஏற்றவும்",
"Hidden field \"challenge\" is a required field": "மறைக்கப்பட்ட புலம் \"அறைகூவல்\" என்பது தேவையான புலம்",
"Hidden field \"token\" is a required field": "மறைக்கப்பட்ட புலம் \"கிள்ளாக்கு\" என்பது தேவையான புலம்",
"Corsican": "கார்சிகன்",
"Croatian": "குரோசியன்",
"Czech": "செக்",
"Danish": "டேனிச்",
"Dutch (auto-generated)": "டச்சு (தானாக உருவாக்கப்பட்ட)",
"Esperanto": "எச்பெராண்டோ",
"Estonian": "எச்டோனிய",
"Filipino": "ஃபிலிபினோ",
"Filipino (auto-generated)": "பிலிப்பைன்ச் (தானாக உருவாக்கிய)",
"French (auto-generated)": "பிரஞ்சு (தானாக உருவாக்கப்பட்ட)",
"Galician": "காலிசியன்",
"Georgian": "சார்சியன்",
"German": "செர்மன்",
"Hausa": "ஔசா",
"Lao": "லாவோ",
"Latin": "லத்தீன்",
"Latvian": "லாட்வியன்",
"Hawaiian": "அவாயியன்",
"Hebrew": "எபிரேய",
"Lithuanian": "லிதுவேனியன்",
"Hindi": "இந்தி",
"Hmong": "அமோங்",
"Indonesian": "இந்தோனேசிய",
"Indonesian (auto-generated)": "இந்தோனேசிய (தானாக உருவாக்கப்பட்ட)",
"Interlingue": "இன்டர்லின்குய்",
"Irish": "ஐரிச்",
"Italian": "இத்தாலிய",
"Italian (auto-generated)": "இத்தாலியன் (தானாக உருவாக்கப்பட்ட)",
"Japanese": "சப்பானியர்கள்",
"Japanese (auto-generated)": "சப்பானிய (தானாக உருவாக்கப்பட்ட)",
"Javanese": "சாவானீச்",
"Kannada": "கன்னடா",
"Kazakh": "கசாக்",
"Khmer": "கெமர்",
"Korean": "கொரிய",
"Kurdish": "குர்திச்",
"Kyrgyz": "கிர்கிச்",
"Luxembourgish": "லக்சம்போர்கிச்",
"Malay": "மலாய்",
"Pashto": "பச்தோ",
"Persian": "பெர்சியன்",
"Polish": "போலீச்",
"Portuguese": "போர்த்துகீசியம்",
"Portuguese (auto-generated)": "போர்த்துகீசியம் (தானாக உருவாக்கிய)",
"generic_count_minutes": "{{count}} மணித்துளி",
"generic_count_minutes_plural": "{{count}} நிமிடங்கள்",
"generic_count_seconds": "{{count}} இரண்டாவது",
"generic_count_seconds_plural": "{{count}} வினாடிகள்",
"Fallback comments: ": "குறைவடையும் கருத்துரைகள்: ",
"Portuguese (Brazil)": "போர்த்துகீசியம் (பிரேசில்)",
"Punjabi": "பஞ்சாபி",
"Romanian": "ருமேனிய",
"Sinhala": "சிங்களம்",
"Slovak": "ச்லோவாக்",
"Slovenian": "ச்லோவேனியன்",
"Spanish (Latin America)": "ச்பானிச் (லத்தீன் அமெரிக்கா)",
"Spanish (Mexico)": "ச்பானிச் (மெக்சிகோ)",
"Spanish (Spain)": "ச்பானிச் (ச்பெயின்)",
"Telugu": "தெலுங்கு",
"Turkish (auto-generated)": "துருக்கிய (தானாக உருவாக்கிய)",
"Ukrainian": "உக்ரேனிய",
"Urdu": "உருது",
"Uzbek": "உச்பெக்",
"Vietnamese (auto-generated)": "வியட்நாமிய (தானாக உருவாக்கப்பட்ட)",
"Western Frisian": "மேற்கு ஃபிரிசியன்",
"Zulu": "சுலு",
"generic_count_years": "{{count}}} ஆண்டு",
"generic_count_years_plural": "{{count}} ஆண்டுகள்",
"generic_count_months": "{{count}} மாதம்",
"generic_count_months_plural": "{{count}} மாதங்கள்",
"generic_count_weeks": "{{count}}} வாரம்",
"generic_count_weeks_plural": "{{count}} வாரங்கள்",
"generic_count_days": "{{count}}} நாள்",
"generic_count_days_plural": "{{count}} நாட்கள்",
"generic_count_hours": "{{count}} மணிநேரம்",
"generic_count_hours_plural": "{{count}} மணிநேரம்",
"Search": "தேடல்",
"Rating: ": "மதிப்பீடு: ",
"preferences_locale_label": "மொழி: ",
"Default": "இயல்புநிலை",
"Music": "இசை",
"Download": "பதிவிறக்கம்",
"%A %B %-d, %Y": "%A %b %-d, %y",
"permalink": "பெர்மாலின்க்",
"Channel Sponsor": "சேனல் ஒப்புரவாளர்",
"Audio mode": "ஆடியோ பயன்முறை",
"search_filters_duration_option_short": "குறுகிய (<4 நிமிடங்கள்)",
"search_filters_title": "வடிப்பான்கள்",
"search_filters_date_label": "தேதி பதிவேற்றும் தேதி",
"search_filters_date_option_none": "எந்த தேதி",
"search_filters_date_option_hour": "கடைசி மணி",
"search_filters_date_option_year": "இந்த ஆண்டு",
"search_filters_type_label": "வகை",
"search_filters_type_option_all": "எந்த வகை",
"search_filters_type_option_video": "ஒளிதோற்றம்",
"search_filters_type_option_movie": "படம்",
"search_filters_type_option_show": "காட்டு",
"search_filters_features_option_vr180": "VR180",
"search_filters_features_option_purchased": "வாங்கப்பட்டது",
"search_filters_sort_label": "வரிசைப்படுத்தவும்",
"search_filters_sort_option_date": "பதிவேற்ற தேதி",
"search_filters_sort_option_views": "எண்ணிக்கை காண்க",
"search_filters_apply_button": "தேர்ந்தெடுக்கப்பட்ட வடிப்பான்களைப் பயன்படுத்துங்கள்",
"footer_documentation": "ஆவணப்படுத்துதல்",
"footer_source_code": "மூலக் குறியீடு",
"footer_original_source_code": "அசல் மூலக் குறியீடு",
"none": "எதுவுமில்லை",
"videoinfo_youTube_embed_link": "உட்பொதிக்கப்பட்டது",
"videoinfo_invidious_embed_link": "உட்பொதிப்பு இணைப்பு",
"Video unavailable": "வீடியோ கிடைக்கவில்லை",
"preferences_save_player_pos_label": "பிளேபேக் நிலையை சேமிக்கவும்: ",
"crash_page_you_found_a_bug": "நீங்கள் ஒரு பிழையை கண்டுபிடித்ததாகத் தெரிகிறது!",
"crash_page_refresh": "<a href = \"` x` \"> பக்கத்தை புதுப்பிக்க முயற்சித்தேன் </a>",
"crash_page_read_the_faq": "<a href = \"` x` \"> அடிக்கடி கேட்கப்படும் கேள்விகள் (கேள்விகள்) </a> ஐப் படியுங்கள்",
"crash_page_report_issue": "மேலே எதுவும் உதவவில்லை என்றால், தயவுசெய்து <a href = \"` x` \"> அறிவிலிமையம் </a> (முன்னுரிமை ஆங்கிலத்தில்) ஒரு புதிய சிக்கலைத் திறந்து உங்கள் செய்தியில் பின்வரும் உரையைச் சேர்க்கவும் (அந்த உரையை மொழிபெயர்க்க வேண்டாம்):",
"error_video_not_in_playlist": "கோரப்பட்ட வீடியோ இந்த பிளேலிச்ட்டில் இல்லை. <a href = \"` x` \"> பிளேலிச்ட் முகப்பு பக்கத்திற்கு இங்கே சொடுக்கு செய்க. </a>",
"channel_tab_videos_label": "வீடியோக்கள்",
"channel_tab_podcasts_label": "பாட்காச்ட்கள்",
"channel_tab_releases_label": "வெளியீடுகள்",
"channel_tab_playlists_label": "பிளேலிச்ட்கள்",
"channel_tab_community_label": "சமூகம்",
"channel_tab_channels_label": "சேனல்கள்",
"toggle_theme": "கருப்பொருளை மாற்றவும்",
"carousel_slide": "{{total}} இன் ச்லைடு {{current}}",
"carousel_skip": "கொணர்வி தவிர்க்கவும்",
"First page": "முதல் பக்கம்",
"channel_tab_courses_label": "படிப்புகள்",
"channel_tab_posts_label": "இடுகைகள்",
"timeline_parse_error_placeholder_heading": "உருப்படியை அலச முடியவில்லை",
"timeline_parse_error_placeholder_message": "இந்த உருப்படியை அலச முயற்சிக்கும் போது ஒரு பிழையை அடக்கமடைந்தது. மேலும் தகவலுக்கு கீழே காண்க:",
"timeline_parse_error_show_technical_details": "தொழில்நுட்ப விவரங்களைக் காட்டு"
}

View File

@@ -1,26 +1,7 @@
{ {
"Add to playlist": "Pleýer Sanawa goş", "Add to playlist": "Aýdym sanawyna goş",
"Add to playlist: ": "Pleýliste goş: ", "Add to playlist: ": "Pleýliste goş: ",
"Answer": "Jogap", "Answer": "Jogap",
"Search for videos": "Wideo gözläň", "Search for videos": "Wideo gözläň",
"The Popular feed has been disabled by the administrator.": "Trende bolan administrator tarapyndan ýapyldy.", "The Popular feed has been disabled by the administrator.": "Trende bolan administrator tarapyndan ýapyldy."
"generic_views_count": "{{count}} gezek görülen",
"generic_views_count_plural": "{{count}} görülen",
"generic_button_delete": "Öçür",
"generic_button_save": "Ýatda sakla",
"generic_button_cancel": "Goýbolsun",
"generic_button_rss": "RSS",
"LIVE": "Efif",
"generic_playlists_count": "{{count}} Oýnaw sanawy",
"generic_playlists_count_plural": "{{count}} Oýnaw sanawlary",
"generic_subscribers_count": "{{count}} abuna",
"generic_subscribers_count_plural": "{{count}} abunaçalar",
"generic_subscriptions_count": "{{count}} abuna",
"generic_subscriptions_count_plural": "{{count}} abunalar",
"generic_button_edit": "Üýtget",
"generic_videos_count": "{{count}} widýo",
"generic_videos_count_plural": "{{count}} widýolar",
"Shared `x` ago": "`x` öň paýlaşyldy",
"generic_channels_count": "{{count}} kanal",
"generic_channels_count_plural": "{{count}} kanallar"
} }

View File

@@ -1 +0,0 @@
{}

View File

@@ -39,6 +39,8 @@
"User ID": "Kullanıcı Kimliği", "User ID": "Kullanıcı Kimliği",
"Password": "Parola", "Password": "Parola",
"Time (h:mm:ss):": "Zaman (h:mm:ss):", "Time (h:mm:ss):": "Zaman (h:mm:ss):",
"Text CAPTCHA": "Metin CAPTCHA",
"Image CAPTCHA": "Resim CAPTCHA",
"Sign In": "Oturum Aç", "Sign In": "Oturum Aç",
"Register": "Kayıt Ol", "Register": "Kayıt Ol",
"E-mail": "E-Posta", "E-mail": "E-Posta",
@@ -320,13 +322,13 @@
"channel_tab_community_label": "Topluluk", "channel_tab_community_label": "Topluluk",
"search_filters_sort_option_relevance": "İlgi", "search_filters_sort_option_relevance": "İlgi",
"search_filters_sort_option_rating": "Değerlendirme", "search_filters_sort_option_rating": "Değerlendirme",
"search_filters_sort_option_date": "Yükleme tarihi", "search_filters_sort_option_date": "Yükleme Tarihi",
"search_filters_sort_option_views": "Görüntüleme Sayısı", "search_filters_sort_option_views": "Görüntüleme Sayısı",
"search_filters_type_label": "Tür", "search_filters_type_label": "Tür",
"search_filters_duration_label": "Süre", "search_filters_duration_label": "Süre",
"search_filters_features_label": "Özellikler", "search_filters_features_label": "Özellikler",
"search_filters_sort_label": "Sıralama Ölçütü", "search_filters_sort_label": "Sıralama Ölçütü",
"search_filters_date_option_hour": "Son saat", "search_filters_date_option_hour": "Son Saat",
"search_filters_date_option_today": "Bugün", "search_filters_date_option_today": "Bugün",
"search_filters_date_option_week": "Bu Hafta", "search_filters_date_option_week": "Bu Hafta",
"search_filters_date_option_month": "Bu Ay", "search_filters_date_option_month": "Bu Ay",
@@ -450,7 +452,7 @@
"Spanish (Spain)": "İspanyolca (İspanya)", "Spanish (Spain)": "İspanyolca (İspanya)",
"Vietnamese (auto-generated)": "Vietnamca (Otomatik Oluşturuldu)", "Vietnamese (auto-generated)": "Vietnamca (Otomatik Oluşturuldu)",
"preferences_watch_history_label": "İzleme Geçmişini Etkinleştir: ", "preferences_watch_history_label": "İzleme Geçmişini Etkinleştir: ",
"search_message_use_another_instance": "Ayrıca <a href=\"`x`\">başka bir örnekte arayabilirsiniz</a>.", "search_message_use_another_instance": " Ayrıca <a href=\"`x`\">başka bir örnekte arayabilirsiniz</a>.",
"search_filters_type_option_all": "Herhangi Bir Tür", "search_filters_type_option_all": "Herhangi Bir Tür",
"search_filters_duration_option_none": "Herhangi Bir Süre", "search_filters_duration_option_none": "Herhangi Bir Süre",
"search_message_no_results": "Sonuç bulunamadı.", "search_message_no_results": "Sonuç bulunamadı.",
@@ -494,13 +496,5 @@
"carousel_slide": "Sunum {{current}} / {{total}}", "carousel_slide": "Sunum {{current}} / {{total}}",
"carousel_skip": "Kayar menüyü atla", "carousel_skip": "Kayar menüyü atla",
"carousel_go_to": "`x` sunumuna git", "carousel_go_to": "`x` sunumuna git",
"The Popular feed has been disabled by the administrator.": "Popüler akışı yönetici tarafından devre dışı bırakıldı.", "The Popular feed has been disabled by the administrator.": "Popüler akışı yönetici tarafından devre dışı bırakıldı."
"preferences_preload_label": "Video verilerini önceden yükle: ",
"First page": "İlk sayfa",
"Filipino (auto-generated)": "Filipince (oto-oluşturuldu)",
"channel_tab_courses_label": "Kurslar",
"channel_tab_posts_label": "Yazılar",
"timeline_parse_error_placeholder_heading": "Öge ayrıştıramıyor",
"timeline_parse_error_placeholder_message": "Invidious, bu ögeyi ayrıştırmaya çalışırken bir hatayla karşılaştı. Daha fazla bilgi için aşağıya bakın:",
"timeline_parse_error_show_technical_details": "Teknik ayrıntıları göster"
} }

View File

@@ -39,6 +39,8 @@
"User ID": "ID користувача", "User ID": "ID користувача",
"Password": "Пароль", "Password": "Пароль",
"Time (h:mm:ss):": "Час (г:хх:сс):", "Time (h:mm:ss):": "Час (г:хх:сс):",
"Text CAPTCHA": "Текст CAPTCHA",
"Image CAPTCHA": "Зображення CAPTCHA",
"Sign In": "Увійти", "Sign In": "Увійти",
"Register": "Зареєструватися", "Register": "Зареєструватися",
"E-mail": "Електронна пошта", "E-mail": "Електронна пошта",
@@ -453,7 +455,7 @@
"search_filters_date_option_week": "Цей тиждень", "search_filters_date_option_week": "Цей тиждень",
"search_filters_type_label": "Тип", "search_filters_type_label": "Тип",
"search_filters_type_option_channel": "Канал", "search_filters_type_option_channel": "Канал",
"search_message_use_another_instance": "Можете також <a href=\"`x`\">пошукати на іншому сервері</a>.", "search_message_use_another_instance": " Можете також <a href=\"`x`\">пошукати іншим сервером</a>.",
"search_filters_title": "Фільтри", "search_filters_title": "Фільтри",
"search_filters_date_option_hour": "Остання година", "search_filters_date_option_hour": "Остання година",
"search_filters_date_option_month": "Цей місяць", "search_filters_date_option_month": "Цей місяць",
@@ -470,7 +472,7 @@
"search_filters_features_option_three_sixty": "360°", "search_filters_features_option_three_sixty": "360°",
"search_filters_features_option_hdr": "HDR", "search_filters_features_option_hdr": "HDR",
"search_filters_sort_label": "Спершу", "search_filters_sort_label": "Спершу",
"search_filters_sort_option_date": "Дата вивантаження", "search_filters_sort_option_date": "Нещодавні",
"search_filters_apply_button": "Застосувати фільтри", "search_filters_apply_button": "Застосувати фільтри",
"search_filters_features_option_vr180": "VR180", "search_filters_features_option_vr180": "VR180",
"search_filters_features_option_purchased": "Придбано", "search_filters_features_option_purchased": "Придбано",
@@ -511,13 +513,5 @@
"The Popular feed has been disabled by the administrator.": "Стрічка Популярні вимкнена адміністратором.", "The Popular feed has been disabled by the administrator.": "Стрічка Популярні вимкнена адміністратором.",
"carousel_slide": "Слайд {{current}} з {{total}}", "carousel_slide": "Слайд {{current}} з {{total}}",
"carousel_skip": "Пропустити карусель", "carousel_skip": "Пропустити карусель",
"carousel_go_to": "Перейти до слайда `x`", "carousel_go_to": "Перейти до слайда `x`"
"preferences_preload_label": "Попереднє завантаження відеоданих: ",
"Filipino (auto-generated)": "Філіппінська (згенеровано автоматично)",
"First page": "Перша сторінка",
"channel_tab_courses_label": "Курси",
"channel_tab_posts_label": "Дописи",
"timeline_parse_error_placeholder_heading": "Неможливо розібрати елемент",
"timeline_parse_error_show_technical_details": "Показати технічні подробиці",
"timeline_parse_error_placeholder_message": "Invidious зіткнувся з помилкою під час спроби розібрати цей елемент. Докладнішу інформацію читайте нижче:"
} }

View File

@@ -41,6 +41,8 @@
"User ID": "Mã nhận dạng người dùng", "User ID": "Mã nhận dạng người dùng",
"Password": "Mật khẩu", "Password": "Mật khẩu",
"Time (h:mm:ss):": "Thời gian (h:mm:ss):", "Time (h:mm:ss):": "Thời gian (h:mm:ss):",
"Text CAPTCHA": "CAPTCHA dạng chữ",
"Image CAPTCHA": "CAPTCHA dạng ảnh",
"Sign In": "Đăng nhập", "Sign In": "Đăng nhập",
"Register": "Đăng ký", "Register": "Đăng ký",
"E-mail": "E-mail", "E-mail": "E-mail",
@@ -312,11 +314,11 @@
"search_filters_duration_label": "Thời lượng", "search_filters_duration_label": "Thời lượng",
"search_filters_features_label": "Đặc điểm", "search_filters_features_label": "Đặc điểm",
"search_filters_sort_label": "Sắp xếp theo", "search_filters_sort_label": "Sắp xếp theo",
"search_filters_date_option_hour": "Một giờ trước", "search_filters_date_option_hour": "Một giờ qua",
"search_filters_date_option_today": "Hôm nay", "search_filters_date_option_today": "Hôm nay",
"search_filters_date_option_week": "Tuần này", "search_filters_date_option_week": "Tuần này",
"search_filters_date_option_month": "Tháng này", "search_filters_date_option_month": "Tháng này",
"search_filters_date_option_year": "Năm nay", "search_filters_date_option_year": "Năm này",
"search_filters_type_option_video": "video", "search_filters_type_option_video": "video",
"search_filters_type_option_channel": "Kênh", "search_filters_type_option_channel": "Kênh",
"search_filters_type_option_playlist": "Danh sách phát", "search_filters_type_option_playlist": "Danh sách phát",
@@ -477,8 +479,5 @@
"carousel_skip": "Bỏ qua Carousel", "carousel_skip": "Bỏ qua Carousel",
"carousel_go_to": "Đi tới trang `x`", "carousel_go_to": "Đi tới trang `x`",
"Search for videos": "Tìm kiếm video", "Search for videos": "Tìm kiếm video",
"The Popular feed has been disabled by the administrator.": "Bảng tin phổ biến đã bị tắt bởi ban quản lý.", "The Popular feed has been disabled by the administrator.": "Bảng tin phổ biến đã bị tắt bởi ban quản lý."
"preferences_preload_label": "Tải trước dữ liệu video: ",
"Filipino (auto-generated)": "Tiếng Philippines (tự động tạo)",
"First page": "Trang đầu"
} }

View File

@@ -44,6 +44,8 @@
"User ID": "用户 ID", "User ID": "用户 ID",
"Password": "密码", "Password": "密码",
"Time (h:mm:ss):": "时间 (h:mm:ss):", "Time (h:mm:ss):": "时间 (h:mm:ss):",
"Text CAPTCHA": "文本验证码",
"Image CAPTCHA": "图片验证码",
"Sign In": "登录", "Sign In": "登录",
"Register": "注册", "Register": "注册",
"E-mail": "E-mail", "E-mail": "E-mail",
@@ -418,7 +420,7 @@
"Chinese": "中文", "Chinese": "中文",
"Chinese (China)": "中文 (中国)", "Chinese (China)": "中文 (中国)",
"Chinese (Hong Kong)": "中文 (中国香港)", "Chinese (Hong Kong)": "中文 (中国香港)",
"Chinese (Taiwan)": "中文 (台湾)", "Chinese (Taiwan)": "中文 (中国台湾)",
"German (auto-generated)": "德语 (自动生成)", "German (auto-generated)": "德语 (自动生成)",
"Indonesian (auto-generated)": "印尼语 (自动生成)", "Indonesian (auto-generated)": "印尼语 (自动生成)",
"Interlingue": "国际语", "Interlingue": "国际语",
@@ -434,7 +436,7 @@
"Turkish (auto-generated)": "土耳其语 (自动生成)", "Turkish (auto-generated)": "土耳其语 (自动生成)",
"Spanish (Spain)": "西班牙语 (西班牙)", "Spanish (Spain)": "西班牙语 (西班牙)",
"preferences_watch_history_label": "启用观看历史: ", "preferences_watch_history_label": "启用观看历史: ",
"search_message_use_another_instance": "你也可以 <a href=\"`x`\">在另一实例上搜索</a>。", "search_message_use_another_instance": " 你也可以 <a href=\"`x`\">在另一实例上搜索</a>。",
"search_filters_title": "过滤器", "search_filters_title": "过滤器",
"search_filters_date_label": "上传日期", "search_filters_date_label": "上传日期",
"search_filters_apply_button": "应用所选过滤器", "search_filters_apply_button": "应用所选过滤器",
@@ -477,15 +479,5 @@
"The Popular feed has been disabled by the administrator.": "“流行”源已被管理员禁用。", "The Popular feed has been disabled by the administrator.": "“流行”源已被管理员禁用。",
"carousel_slide": "当前为第 {{current}} 张图,共 {{total}} 张图", "carousel_slide": "当前为第 {{current}} 张图,共 {{total}} 张图",
"carousel_skip": "跳过图集", "carousel_skip": "跳过图集",
"carousel_go_to": "转到图 `x`", "carousel_go_to": "转到图 `x`"
"preferences_preload_label": "预加载视频数据: ",
"Filipino (auto-generated)": "菲律宾语 (自动生成)",
"channel_tab_posts_label": "帖子",
"First page": "第一页",
"channel_tab_courses_label": "课程",
"timeline_parse_error_show_technical_details": "显示技术细节",
"timeline_parse_error_placeholder_heading": "无法解析项目",
"timeline_parse_error_placeholder_message": "Invidious 在尝试解析此项目时遇到一个错误。更多信息请见下方:",
"preferences_default_playlist": "默认播放列表: ",
"preferences_default_playlist_none": "尚无默认播放列表"
} }

View File

@@ -44,6 +44,8 @@
"User ID": "使用者 ID", "User ID": "使用者 ID",
"Password": "密碼", "Password": "密碼",
"Time (h:mm:ss):": "時間 (h:mm:ss):", "Time (h:mm:ss):": "時間 (h:mm:ss):",
"Text CAPTCHA": "文字 CAPTCHA",
"Image CAPTCHA": "圖片 CAPTCHA",
"Sign In": "登入", "Sign In": "登入",
"Register": "註冊", "Register": "註冊",
"E-mail": "電子郵件", "E-mail": "電子郵件",
@@ -336,13 +338,13 @@
"channel_tab_community_label": "社群", "channel_tab_community_label": "社群",
"search_filters_sort_option_relevance": "關聯", "search_filters_sort_option_relevance": "關聯",
"search_filters_sort_option_rating": "評分", "search_filters_sort_option_rating": "評分",
"search_filters_sort_option_date": "上傳日期", "search_filters_sort_option_date": "日期",
"search_filters_sort_option_views": "檢視", "search_filters_sort_option_views": "檢視",
"search_filters_type_label": "內容類型", "search_filters_type_label": "內容類型",
"search_filters_duration_label": "時長", "search_filters_duration_label": "時長",
"search_filters_features_label": "特色", "search_filters_features_label": "特色",
"search_filters_sort_label": "排序", "search_filters_sort_label": "排序",
"search_filters_date_option_hour": "最後一小時", "search_filters_date_option_hour": "小時",
"search_filters_date_option_today": "今天", "search_filters_date_option_today": "今天",
"search_filters_date_option_week": "週", "search_filters_date_option_week": "週",
"search_filters_date_option_month": "月", "search_filters_date_option_month": "月",
@@ -440,7 +442,7 @@
"search_filters_duration_option_none": "任何時長", "search_filters_duration_option_none": "任何時長",
"search_filters_duration_option_medium": "中等4到20分鐘", "search_filters_duration_option_medium": "中等4到20分鐘",
"search_filters_features_option_vr180": "VR180", "search_filters_features_option_vr180": "VR180",
"search_message_use_another_instance": "您也可以<a href=\"`x`\">在其他站台上搜尋</a>。", "search_message_use_another_instance": " 您也可以<a href=\"`x`\">在其他站台上搜尋</a>。",
"search_filters_title": "過濾條件", "search_filters_title": "過濾條件",
"search_filters_date_label": "上傳日期", "search_filters_date_label": "上傳日期",
"search_filters_type_option_all": "任何類型", "search_filters_type_option_all": "任何類型",
@@ -477,15 +479,5 @@
"carousel_slide": "第 {{current}} 張投影片,共 {{total}} 張", "carousel_slide": "第 {{current}} 張投影片,共 {{total}} 張",
"carousel_skip": "略過輪播", "carousel_skip": "略過輪播",
"carousel_go_to": "跳到投影片 `x`", "carousel_go_to": "跳到投影片 `x`",
"The Popular feed has been disabled by the administrator.": "熱門 feed 已被管理員停用。", "The Popular feed has been disabled by the administrator.": "熱門 feed 已被管理員停用。"
"preferences_preload_label": "預先載入影片資訊 ",
"Filipino (auto-generated)": "菲律賓語(自動產生)",
"channel_tab_courses_label": "課程",
"First page": "第一頁",
"channel_tab_posts_label": "貼文",
"timeline_parse_error_show_technical_details": "顯示技術細節",
"timeline_parse_error_placeholder_heading": "無法解析項目",
"timeline_parse_error_placeholder_message": "Invidious 在嘗試解析此項目時遇到錯誤。要取得更多資訊,請見下方:",
"preferences_default_playlist": "預設播放清單: ",
"preferences_default_playlist_none": "未設定預設播放清單"
} }

2
mocks

Submodule mocks updated: b55d58dea9...11ec372f72

View File

@@ -1,56 +0,0 @@
# This file automatically generates Crystal strings of rows within an HTML Javascript licenses table
#
# These strings will then be placed within a `<%= %>` statement in licenses.ecr at compile time which
# will be interpolated at run-time. This interpolation is only for the translation of the "source" string
# so maybe we can just switch to a non-translated string to simplify the logic here.
#
# The Javascript Web Labels table defined at https://www.gnu.org/software/librejs/free-your-javascript.html#step3
# for example just reiterates the name of the source file rather than use a "source" string.
all_javascript_files = Dir.glob("assets/**/*.js")
videojs_js = [] of String
invidious_js = [] of String
all_javascript_files.each do |js_path|
if js_path.starts_with?("assets/videojs/")
videojs_js << js_path[7..]
else
invidious_js << js_path[7..]
end
end
def create_licence_tr(path, file_name, licence_name, licence_link, source_location)
tr = <<-HTML
"<tr>
<td><a href=\\"/#{path}\\">#{file_name}</a></td>
<td><a href=\\"#{licence_link}\\">#{licence_name}</a></td>
<td><a href=\\"#{source_location}\\">\#{translate(locale, "source")}</a></td>
</tr>"
HTML
# New lines are removed as to allow for using String.join and StringLiteral.split
# to get a clean list of each table row.
tr.gsub('\n', "")
end
# TODO Use videojs-dependencies.yml to generate license info for videojs javascript
jslicence_table_rows = [] of String
invidious_js.each do |path|
file_name = path.split('/')[-1]
# A couple non Invidious JS files are also shipped alongside Invidious due to various reasons
next if {
"sse.js", "silvermine-videojs-quality-selector.min.js", "videojs-youtube-annotations.min.js",
}.includes?(file_name)
jslicence_table_rows << create_licence_tr(
path: path,
file_name: file_name,
licence_name: "AGPL-3.0",
licence_link: "https://www.gnu.org/licenses/agpl-3.0.html",
source_location: path
)
end
puts jslicence_table_rows.join("\n")

View File

@@ -10,27 +10,27 @@ shards:
backtracer: backtracer:
git: https://github.com/sija/backtracer.cr.git git: https://github.com/sija/backtracer.cr.git
version: 1.2.2 version: 1.2.1
db: db:
git: https://github.com/crystal-lang/crystal-db.git git: https://github.com/crystal-lang/crystal-db.git
version: 0.13.1 version: 0.10.1
exception_page: exception_page:
git: https://github.com/crystal-loot/exception_page.git git: https://github.com/crystal-loot/exception_page.git
version: 0.4.1 version: 0.2.2
http_proxy:
git: https://github.com/mamantoha/http_proxy.git
version: 0.10.3
kemal: kemal:
git: https://github.com/kemalcr/kemal.git git: https://github.com/kemalcr/kemal.git
version: 1.6.0 version: 1.1.2
kilt:
git: https://github.com/jeromegn/kilt.git
version: 0.6.1
pg: pg:
git: https://github.com/will/crystal-pg.git git: https://github.com/will/crystal-pg.git
version: 0.28.0 version: 0.24.0
protodec: protodec:
git: https://github.com/iv-org/protodec.git git: https://github.com/iv-org/protodec.git
@@ -42,9 +42,9 @@ shards:
spectator: spectator:
git: https://github.com/icy-arctic-fox/spectator.git git: https://github.com/icy-arctic-fox/spectator.git
version: 0.10.6 version: 0.10.4
sqlite3: sqlite3:
git: https://github.com/crystal-lang/crystal-sqlite3.git git: https://github.com/crystal-lang/crystal-sqlite3.git
version: 0.21.0 version: 0.18.0

View File

@@ -1,36 +1,33 @@
name: invidious name: invidious
version: 2.20260207.0 version: 0.20.1
authors: authors:
- Invidious team <contact@invidious.io> - Omar Roth <omarroth@protonmail.com>
- Contributors! - Invidious team
targets: targets:
invidious: invidious:
main: src/invidious.cr main: src/invidious.cr
description: |
Invidious is an alternative front-end to YouTube
dependencies: dependencies:
pg: pg:
github: will/crystal-pg github: will/crystal-pg
version: ~> 0.28.0 version: ~> 0.24.0
sqlite3: sqlite3:
github: crystal-lang/crystal-sqlite3 github: crystal-lang/crystal-sqlite3
version: ~> 0.21.0 version: ~> 0.18.0
kemal: kemal:
github: kemalcr/kemal github: kemalcr/kemal
version: ~> 1.6.0 version: ~> 1.1.2
kilt:
github: jeromegn/kilt
version: ~> 0.6.1
protodec: protodec:
github: iv-org/protodec github: iv-org/protodec
version: ~> 0.1.5 version: ~> 0.1.5
athena-negotiation: athena-negotiation:
github: athena-framework/negotiation github: athena-framework/negotiation
version: ~> 0.1.1 version: ~> 0.1.1
http_proxy:
github: mamantoha/http_proxy
version: ~> 0.10.3
development_dependencies: development_dependencies:
spectator: spectator:
@@ -40,10 +37,6 @@ development_dependencies:
github: crystal-ameba/ameba github: crystal-ameba/ameba
version: ~> 1.6.1 version: ~> 1.6.1
crystal: ">= 1.10.0, < 2.0.0" crystal: ">= 1.0.0, < 2.0.0"
license: AGPL-3.0-only license: AGPLv3
repository: https://github.com/iv-org/invidious
homepage: https://invidious.io
documentation: https://docs.invidious.io

View File

@@ -1 +0,0 @@
Hello world

View File

@@ -1,233 +0,0 @@
# Due to the way that specs are handled this file cannot be run together with
# everything else without causing a compile time error that'll be incredibly
# annoying to resolve.
#
# TODO: Create different spec categories that can then be ran through make.
# An implementation of this can be seen with the tests for the Crystal compiler itself.
#
# For now run this with `crystal spec spec/http_server/handlers/static_assets_handler_spec.cr -Drunning_by_self`
{% skip_file if compare_versions(Crystal::VERSION, "1.17.0-dev") < 0 || !flag?(:running_by_self) %}
require "http"
require "spectator"
require "../../../src/invidious/http_server/static_assets_handler.cr"
private def get_static_assets_handler
return Invidious::HttpServer::StaticAssetsHandler.new "spec/http_server/handlers/static_assets_handler", directory_listing: false
end
# Slightly modified version of `handle` function from
#
# https://github.com/crystal-lang/crystal/blob/3f369d2c721e9462d9f6126cb0bcd4c6992f0225/spec/std/http/server/handlers/static_file_handler_spec.cr#L5
private def handle(request, handler : HTTP::Handler? = nil, decompress : Bool = false)
io = IO::Memory.new
response = HTTP::Server::Response.new(io)
context = HTTP::Server::Context.new(request, response)
if !handler
handler = get_static_assets_handler
get_static_assets_handler.call context
else
handler.call(context)
end
response.close
io.rewind
HTTP::Client::Response.from_io(io, decompress: decompress)
end
# Makes and yields a temporary file with the given prefix
private def make_temporary_file(prefix, contents = nil, &)
tempfile = File.tempfile(prefix, "static_assets_handler_spec", dir: "spec/http_server/handlers/static_assets_handler")
file_link = "/#{File.basename(tempfile.path)}"
yield tempfile, file_link
ensure
tempfile.try &.delete
end
# Changes the contents of the temporary file after yield
private def cycle_temporary_file_contents(temporary_file, initial, &)
temporary_file.rewind << initial
temporary_file.rewind.flush
yield
temporary_file.rewind << "something else"
temporary_file.rewind.flush
end
# Get relative file path to a file within the static_assets_handler folder
macro get_file_path(basename)
"spec/http_server/handlers/static_assets_handler/#{ {{basename}} }"
end
Spectator.describe StaticAssetsHandler do
it "Can serve a file" do
response = handle HTTP::Request.new("GET", "/test.txt")
expect(response.status_code).to eq(200)
expect(response.body).to eq(File.read(get_file_path("test.txt")))
end
it "Can serve cached file" do
make_temporary_file("cache_test") do |temporary_file, file_link|
cycle_temporary_file_contents(temporary_file, "foo") do
expect(temporary_file.rewind.gets_to_end).to eq("foo")
# Should get cached by the first run
response = handle HTTP::Request.new("GET", file_link)
expect(response.status_code).to eq(200)
expect(response.body).to eq("foo")
end
# Temporary file is updated after `cycle_temporary_file_contents` is called
# but if the file is successfully cached then we'll only get the original
# contents.
response = handle HTTP::Request.new("GET", file_link)
expect(response.status_code).to eq(200)
expect(response.body).to eq("foo")
end
end
it "Adds cache headers" do
response = handle HTTP::Request.new("GET", "/test.txt")
expect(response.headers["cache_control"]).to eq("max-age=2629800")
end
context "Can handle range requests" do
it "Can serve range request" do
headers = HTTP::Headers{"Range" => "bytes=0-2"}
response = handle HTTP::Request.new("GET", "/test.txt", headers)
expect(response.status_code).to eq(206)
expect(response.headers["Content-Range"]?).to eq "bytes 0-2/11"
expect(response.body).to eq "Hel"
end
it "Will cache entire file even if doing partial requests" do
make_temporary_file("range_cache") do |temporary_file, file_link|
cycle_temporary_file_contents(temporary_file, "Hello world") do
handle HTTP::Request.new("GET", file_link, HTTP::Headers{"Range" => "bytes=0-2"})
end
# Second request shouldn't have changed
headers = HTTP::Headers{"Range" => "bytes=3-8"}
response = handle HTTP::Request.new("GET", file_link, headers)
expect(response.status_code).to eq(206)
expect(response.body).to eq "lo wor"
end
end
end
context "Is able to support compression" do
def decompressed(string : String)
decompressed = Compress::Gzip::Reader.open(IO::Memory.new(string)) do |gzip|
gzip.gets_to_end
end
return expect(decompressed)
end
it "For full file requests" do
handler = HTTP::CompressHandler.new
handler.next = get_static_assets_handler()
make_temporary_file("check decompression handler") do |temporary_file, file_link|
cycle_temporary_file_contents(temporary_file, "Hello world") do
response = handle HTTP::Request.new("GET", file_link, headers: HTTP::Headers{"Accept-Encoding" => "gzip"}), handler: handler
expect(response.headers["Content-Encoding"]).to eq("gzip")
decompressed(response.body).to eq("Hello world")
end
# Are cached requests working?
response = handle HTTP::Request.new("GET", file_link, headers: HTTP::Headers{"Accept-Encoding" => "gzip"}), handler: handler
expect(response.headers["Content-Encoding"]).to eq("gzip")
decompressed(response.body).to eq("Hello world")
# Able to retrieve non gzipped file?
response = handle HTTP::Request.new("GET", file_link), handler: handler
expect(response.body).to eq("Hello world")
expect(response.headers).to_not have_key("Content-Encoding")
end
end
# Inspired by the equivalent tests from upstream
it "For partial file requests" do
handler = HTTP::CompressHandler.new
handler.next = get_static_assets_handler()
make_temporary_file("check_decompression_handler_on_partial_requests") do |temporary_file, file_link|
cycle_temporary_file_contents(temporary_file, "Hello world this is a very long string") do
range_response_results = {
"10-20/38" => "d this is a",
"0-0/38" => "H",
"5-9/38" => " worl",
}
range_request_header_value = {"10-20", "5-9", "0-0"}.join(',')
range_response_header_value = range_response_results.keys
response = handle HTTP::Request.new("GET", file_link, headers: HTTP::Headers{"Range" => "bytes=#{range_request_header_value}", "Accept-Encoding" => "gzip"}), handler: handler
expect(response.headers["Content-Encoding"]).to eq("gzip")
# Decompress response
response = HTTP::Client::Response.new(
status: response.status,
headers: response.headers,
body_io: Compress::Gzip::Reader.new(IO::Memory.new(response.body)),
)
count = 0
MIME::Multipart.parse(response) do |headers, part|
part_range = headers["Content-Range"][6..]
expect(part_range).to be_within(range_response_header_value)
expect(part.gets_to_end).to eq(range_response_results[part_range])
count += 1
end
expect(count).to eq(3)
end
# Is the file cached?
temporary_file << "Something else"
temporary_file.flush.rewind
response = handle HTTP::Request.new("GET", file_link, headers: HTTP::Headers{"Accept-Encoding" => "gzip"}), handler: handler
decompressed(response.body).to eq("Hello world this is a very long string")
end
end
end
it "Will not cache additional files if the cache limit is reached" do
5.times do |times|
data = "a" * 1_000_000
make_temporary_file("test cache size limit #{times}") do |temporary_file, file_link|
cycle_temporary_file_contents(temporary_file, data) do
response = handle HTTP::Request.new("GET", file_link)
expect(response.status_code).to eq(200)
expect(response.body).to eq(data)
end
response = handle HTTP::Request.new("GET", file_link)
expect(response.status_code).to eq(200)
expect(response.body).to eq(data)
end
end
# Cache should be 5 mb so no more files will be cached.
make_temporary_file("test cache size limit uncached") do |temporary_file, file_link|
cycle_temporary_file_contents(temporary_file, "a") do
response = handle HTTP::Request.new("GET", file_link)
expect(response.status_code).to eq(200)
expect(response.body).to eq("a")
end
response = handle HTTP::Request.new("GET", file_link)
expect(response.status_code).to eq(200)
expect(response.body).to_not eq("a")
end
end
after_each { Invidious::HttpServer::StaticAssetsHandler.clear_cache }
end

View File

@@ -27,8 +27,8 @@ Spectator.describe Invidious::Hashtag do
expect(video_11.length_seconds).to eq((56.minutes + 41.seconds).total_seconds.to_i32) expect(video_11.length_seconds).to eq((56.minutes + 41.seconds).total_seconds.to_i32)
expect(video_11.views).to eq(40_504_893) expect(video_11.views).to eq(40_504_893)
expect(video_11.badges.live_now?).to be_false expect(video_11.live_now).to be_false
expect(video_11.badges.premium?).to be_false expect(video_11.premium).to be_false
expect(video_11.premiere_timestamp).to be_nil expect(video_11.premiere_timestamp).to be_nil
# #
@@ -49,8 +49,8 @@ Spectator.describe Invidious::Hashtag do
expect(video_35.length_seconds).to eq((3.minutes + 14.seconds).total_seconds.to_i32) expect(video_35.length_seconds).to eq((3.minutes + 14.seconds).total_seconds.to_i32)
expect(video_35.views).to eq(30_790_049) expect(video_35.views).to eq(30_790_049)
expect(video_35.badges.live_now?).to be_false expect(video_35.live_now).to be_false
expect(video_35.badges.premium?).to be_false expect(video_35.premium).to be_false
expect(video_35.premiere_timestamp).to be_nil expect(video_35.premiere_timestamp).to be_nil
end end
@@ -80,8 +80,8 @@ Spectator.describe Invidious::Hashtag do
expect(video_41.length_seconds).to eq((1.hour).total_seconds.to_i32) expect(video_41.length_seconds).to eq((1.hour).total_seconds.to_i32)
expect(video_41.views).to eq(63_240) expect(video_41.views).to eq(63_240)
expect(video_41.badges.live_now?).to be_false expect(video_41.live_now).to be_false
expect(video_41.badges.premium?).to be_false expect(video_41.premium).to be_false
expect(video_41.premiere_timestamp).to be_nil expect(video_41.premiere_timestamp).to be_nil
# #
@@ -102,8 +102,8 @@ Spectator.describe Invidious::Hashtag do
expect(video_48.length_seconds).to eq((35.minutes + 46.seconds).total_seconds.to_i32) expect(video_48.length_seconds).to eq((35.minutes + 46.seconds).total_seconds.to_i32)
expect(video_48.views).to eq(68_704) expect(video_48.views).to eq(68_704)
expect(video_48.badges.live_now?).to be_false expect(video_48.live_now).to be_false
expect(video_48.badges.premium?).to be_false expect(video_48.premium).to be_false
expect(video_48.premiere_timestamp).to be_nil expect(video_48.premiere_timestamp).to be_nil
end end
end end

View File

@@ -17,8 +17,8 @@ Spectator.describe "parse_video_info" do
# Basic video infos # Basic video infos
expect(info["title"].as_s).to eq("I Gave My 100,000,000th Subscriber An Island") expect(info["title"].as_s).to eq("I Gave My 100,000,000th Subscriber An Island")
expect(info["views"].as_i).to eq(220_226_287) expect(info["views"].as_i).to eq(126_573_823)
expect(info["likes"].as_i).to eq(6_870_691) expect(info["likes"].as_i).to eq(5_157_654)
# For some reason the video length from VideoDetails and the # For some reason the video length from VideoDetails and the
# one from microformat differs by 1s... # one from microformat differs by 1s...
@@ -48,11 +48,12 @@ Spectator.describe "parse_video_info" do
expect(info["relatedVideos"].as_a.size).to eq(20) expect(info["relatedVideos"].as_a.size).to eq(20)
expect(info["relatedVideos"][0]["id"]).to eq("krsBRQbOPQ4") expect(info["relatedVideos"][0]["id"]).to eq("Hwybp38GnZw")
expect(info["relatedVideos"][0]["title"]).to eq("$1 vs $250,000,000 Private Island!") expect(info["relatedVideos"][0]["title"]).to eq("I Built Willy Wonka's Chocolate Factory!")
expect(info["relatedVideos"][0]["author"]).to eq("MrBeast") expect(info["relatedVideos"][0]["author"]).to eq("MrBeast")
expect(info["relatedVideos"][0]["ucid"]).to eq("UCX6OQ3DkcsbYNE6H8uQQuVA") expect(info["relatedVideos"][0]["ucid"]).to eq("UCX6OQ3DkcsbYNE6H8uQQuVA")
expect(info["relatedVideos"][0]["short_view_count"]).to eq("230M") expect(info["relatedVideos"][0]["view_count"]).to eq("179877630")
expect(info["relatedVideos"][0]["short_view_count"]).to eq("179M")
expect(info["relatedVideos"][0]["author_verified"]).to eq("true") expect(info["relatedVideos"][0]["author_verified"]).to eq("true")
# Description # Description
@@ -75,11 +76,11 @@ Spectator.describe "parse_video_info" do
expect(info["ucid"].as_s).to eq("UCX6OQ3DkcsbYNE6H8uQQuVA") expect(info["ucid"].as_s).to eq("UCX6OQ3DkcsbYNE6H8uQQuVA")
expect(info["authorThumbnail"].as_s).to eq( expect(info["authorThumbnail"].as_s).to eq(
"https://yt3.ggpht.com/fxGKYucJAVme-Yz4fsdCroCFCrANWqw0ql4GYuvx8Uq4l_euNJHgE-w9MTkLQA805vWCi-kE0g=s48-c-k-c0x00ffffff-no-rj" "https://yt3.ggpht.com/ytc/AL5GRJVuqw82ERvHzsmBxL7avr1dpBtsVIXcEzBPZaloFg=s48-c-k-c0x00ffffff-no-rj"
) )
expect(info["authorVerified"].as_bool).to be_true expect(info["authorVerified"].as_bool).to be_true
expect(info["subCountText"].as_s).to eq("320M") expect(info["subCountText"].as_s).to eq("143M")
end end
it "parses a regular video with no descrition/comments" do it "parses a regular video with no descrition/comments" do
@@ -98,8 +99,8 @@ Spectator.describe "parse_video_info" do
# Basic video infos # Basic video infos
expect(info["title"].as_s).to eq("Chris Rea - Auberge") expect(info["title"].as_s).to eq("Chris Rea - Auberge")
expect(info["views"].as_i).to eq(14_324_584) expect(info["views"].as_i).to eq(10_943_126)
expect(info["likes"].as_i).to eq(35_870) expect(info["likes"].as_i).to eq(0)
expect(info["lengthSeconds"].as_i).to eq(283_i64) expect(info["lengthSeconds"].as_i).to eq(283_i64)
expect(info["published"].as_s).to eq("2012-05-21T00:00:00Z") expect(info["published"].as_s).to eq("2012-05-21T00:00:00Z")
@@ -131,13 +132,14 @@ Spectator.describe "parse_video_info" do
# Related videos # Related videos
expect(info["relatedVideos"].as_a.size).to eq(20) expect(info["relatedVideos"].as_a.size).to eq(19)
expect(info["relatedVideos"][0]["id"]).to eq("gUUdQfnshJ4") expect(info["relatedVideos"][0]["id"]).to eq("Ww3KeZ2_Yv4")
expect(info["relatedVideos"][0]["title"]).to eq("Chris Rea - The Road To Hell 1989 Full Version") expect(info["relatedVideos"][0]["title"]).to eq("Chris Rea")
expect(info["relatedVideos"][0]["author"]).to eq("NEA ZIXNH") expect(info["relatedVideos"][0]["author"]).to eq("PanMusic")
expect(info["relatedVideos"][0]["ucid"]).to eq("UCYMEOGcvav3gCgImK2J07CQ") expect(info["relatedVideos"][0]["ucid"]).to eq("UCsKAPSuh1iNbLWUga_igPyA")
expect(info["relatedVideos"][0]["short_view_count"]).to eq("53M") expect(info["relatedVideos"][0]["view_count"]).to eq("31581")
expect(info["relatedVideos"][0]["short_view_count"]).to eq("31K")
expect(info["relatedVideos"][0]["author_verified"]).to eq("false") expect(info["relatedVideos"][0]["author_verified"]).to eq("false")
# Description # Description
@@ -154,13 +156,11 @@ Spectator.describe "parse_video_info" do
# Author infos # Author infos
expect(info["author"].as_s).to eq("ChrisReaVideos") expect(info["author"].as_s).to eq("ChrisReaOfficial")
expect(info["ucid"].as_s).to eq("UC_5q6nWPbD30-y6oiWF_oNA") expect(info["ucid"].as_s).to eq("UC_5q6nWPbD30-y6oiWF_oNA")
expect(info["authorThumbnail"].as_s).to eq( expect(info["authorThumbnail"].as_s).to be_empty
"https://yt3.ggpht.com/ytc/AIdro_n71nsegpKfjeRKwn1JJmK5IVMh_7j5m_h3_1KnUUg=s48-c-k-c0x00ffffff-no-rj"
)
expect(info["authorVerified"].as_bool).to be_false expect(info["authorVerified"].as_bool).to be_false
expect(info["subCountText"].as_s).to eq("3.11K") expect(info["subCountText"].as_s).to eq("-")
end end
end end

View File

@@ -75,6 +75,7 @@ Spectator.describe "parse_video_info" do
expect(info["relatedVideos"][0]["id"]).to eq("j7jPzzjbVuk") expect(info["relatedVideos"][0]["id"]).to eq("j7jPzzjbVuk")
expect(info["relatedVideos"][0]["author"]).to eq("Democracy Now!") expect(info["relatedVideos"][0]["author"]).to eq("Democracy Now!")
expect(info["relatedVideos"][0]["ucid"]).to eq("UCzuqE7-t13O4NIDYJfakrhw") expect(info["relatedVideos"][0]["ucid"]).to eq("UCzuqE7-t13O4NIDYJfakrhw")
expect(info["relatedVideos"][0]["view_count"]).to eq("7576")
expect(info["relatedVideos"][0]["short_view_count"]).to eq("7.5K") expect(info["relatedVideos"][0]["short_view_count"]).to eq("7.5K")
expect(info["relatedVideos"][0]["author_verified"]).to eq("true") expect(info["relatedVideos"][0]["author_verified"]).to eq("true")

View File

@@ -0,0 +1,16 @@
# Overrides for Kemal's `content_for` macro in order to keep using
# kilt as it was before Kemal v1.1.1 (Kemal PR #618).
require "kemal"
require "kilt"
macro content_for(key, file = __FILE__)
%proc = ->() {
__kilt_io__ = IO::Memory.new
{{ yield }}
__kilt_io__.to_s
}
CONTENT_FOR_BLOCKS[{{key}}] = Tuple.new {{file}}, %proc
nil
end

View File

@@ -1,24 +1,3 @@
{% if compare_versions(Crystal::VERSION, "1.17.0-dev") >= 0 %}
# Strip StaticFileHandler from the binary
#
# This allows us to compile on 1.17.0 as the compiler won't try to
# semantically check the outdated upstream code.
class Kemal::Config
private def setup_static_file_handler
end
end
# Nullify `Kemal::StaticFileHandler`
#
# Needed until the next release of Kemal after 1.7
class Kemal::StaticFileHandler < HTTP::StaticFileHandler
def call(context : HTTP::Server::Context)
end
end
{% skip_file %}
{% end %}
# Since systems have a limit on number of open files (`ulimit -a`), # Since systems have a limit on number of open files (`ulimit -a`),
# we serve them from memory to avoid 'Too many open files' without needing # we serve them from memory to avoid 'Too many open files' without needing
# to modify ulimit. # to modify ulimit.
@@ -92,7 +71,7 @@ def send_file(env : HTTP::Server::Context, file_path : String, data : Slice(UInt
filesize = data.bytesize filesize = data.bytesize
attachment(env, filename, disposition) attachment(env, filename, disposition)
Kemal.config.static_headers.try(&.call(env, file_path, filestat)) Kemal.config.static_headers.try(&.call(env.response, file_path, filestat))
file = IO::Memory.new(data) file = IO::Memory.new(data)
if env.request.method == "GET" && env.request.headers.has_key?("Range") if env.request.method == "GET" && env.request.headers.has_key?("Range")

View File

@@ -17,11 +17,12 @@
require "digest/md5" require "digest/md5"
require "file_utils" require "file_utils"
# Require kemal, then our own overrides # Require kemal, kilt, then our own overrides
require "kemal" require "kemal"
require "kilt"
require "./ext/kemal_content_for.cr"
require "./ext/kemal_static_file_handler.cr" require "./ext/kemal_static_file_handler.cr"
require "http_proxy"
require "athena-negotiation" require "athena-negotiation"
require "openssl/hmac" require "openssl/hmac"
require "option_parser" require "option_parser"
@@ -47,8 +48,7 @@ require "./invidious/channels/*"
require "./invidious/user/*" require "./invidious/user/*"
require "./invidious/search/*" require "./invidious/search/*"
require "./invidious/routes/**" require "./invidious/routes/**"
require "./invidious/jobs/base_job" require "./invidious/jobs/**"
require "./invidious/jobs/*"
# Declare the base namespace for invidious # Declare the base namespace for invidious
module Invidious module Invidious
@@ -60,20 +60,24 @@ alias IV = Invidious
CONFIG = Config.load CONFIG = Config.load
HMAC_KEY = CONFIG.hmac_key HMAC_KEY = CONFIG.hmac_key
PG_DB = begin PG_DB = DB.open CONFIG.database_url
DB.open CONFIG.database_url ARCHIVE_URL = URI.parse("https://archive.org")
rescue ex PUBSUB_URL = URI.parse("https://pubsubhubbub.appspot.com")
puts "Failed to connect to PostgreSQL database: #{ex.cause.try &.message}" REDDIT_URL = URI.parse("https://www.reddit.com")
puts "Check your 'config.yml' database settings or PostgreSQL settings." YT_URL = URI.parse("https://www.youtube.com")
exit(1) HOST_URL = make_host_url(Kemal.config)
end
HOST_URL = make_host_url(Kemal.config) CHARS_SAFE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"
TEST_IDS = {"AgbeGFYluEA", "BaW_jenozKc", "a9LDPn-MO4I", "ddFvjfvPnqk", "iqKdEhx-dD4"}
MAX_ITEMS_PER_PAGE = 1500 MAX_ITEMS_PER_PAGE = 1500
REQUEST_HEADERS_WHITELIST = {"accept", "accept-encoding", "cache-control", "content-length", "if-none-match", "range"}
RESPONSE_HEADERS_BLACKLIST = {"access-control-allow-origin", "alt-svc", "server"}
HTTP_CHUNK_SIZE = 10485760 # ~10MB
CURRENT_BRANCH = {{ "#{`git branch | sed -n '/* /s///p'`.strip}" }} CURRENT_BRANCH = {{ "#{`git branch | sed -n '/* /s///p'`.strip}" }}
CURRENT_COMMIT = {{ "#{`git rev-list HEAD --max-count=1 --abbrev-commit`.strip}" }} CURRENT_COMMIT = {{ "#{`git rev-list HEAD --max-count=1 --abbrev-commit`.strip}" }}
CURRENT_VERSION = {{ "#{`git log -1 --format=%ci | awk '{print $1}' | sed s/-/./g`.strip}" }} CURRENT_VERSION = {{ "#{`git log -1 --format=%ci | awk '{print $1}' | sed s/-/./g`.strip}" }}
CURRENT_TAG = {{ "#{`git tag --points-at HEAD`.strip}" }}
# This is used to determine the `?v=` on the end of file URLs (for cache busting). We # This is used to determine the `?v=` on the end of file URLs (for cache busting). We
# only need to expire modified assets, so we can use this to find the last commit that changes # only need to expire modified assets, so we can use this to find the last commit that changes
@@ -86,15 +90,7 @@ SOFTWARE = {
"branch" => "#{CURRENT_BRANCH}", "branch" => "#{CURRENT_BRANCH}",
} }
YT_POOL = YoutubeConnectionPool.new(URI.parse("https://www.youtube.com"), capacity: CONFIG.pool_size) YT_POOL = YoutubeConnectionPool.new(YT_URL, capacity: CONFIG.pool_size)
# Image request pool
GGPHT_POOL = YoutubeConnectionPool.new(URI.parse("https://yt3.ggpht.com"), capacity: CONFIG.pool_size)
COMPANION_POOL = CompanionConnectionPool.new(
capacity: CONFIG.pool_size
)
# CLI # CLI
Kemal.config.extra_options do |parser| Kemal.config.extra_options do |parser|
@@ -107,23 +103,12 @@ Kemal.config.extra_options do |parser|
exit exit
end end
end end
parser.on("-f THREADS", "--feed-threads=THREADS", "Number of threads for refreshing feeds (default: #{CONFIG.feed_threads})") do |number|
begin
CONFIG.feed_threads = number.to_i
rescue ex
puts "THREADS must be integer"
exit
end
end
parser.on("-o OUTPUT", "--output=OUTPUT", "Redirect output (default: #{CONFIG.output})") do |output| parser.on("-o OUTPUT", "--output=OUTPUT", "Redirect output (default: #{CONFIG.output})") do |output|
CONFIG.output = output CONFIG.output = output
end end
parser.on("-l LEVEL", "--log-level=LEVEL", "Log level, one of #{LogLevel.values} (default: #{CONFIG.log_level})") do |log_level| parser.on("-l LEVEL", "--log-level=LEVEL", "Log level, one of #{LogLevel.values} (default: #{CONFIG.log_level})") do |log_level|
CONFIG.log_level = LogLevel.parse(log_level) CONFIG.log_level = LogLevel.parse(log_level)
end end
parser.on("-k", "--colorize", "Colorize logs") do
CONFIG.colorize_logs = true
end
parser.on("-v", "--version", "Print version") do parser.on("-v", "--version", "Print version") do
puts SOFTWARE.to_pretty_json puts SOFTWARE.to_pretty_json
exit exit
@@ -140,7 +125,7 @@ if CONFIG.output.upcase != "STDOUT"
FileUtils.mkdir_p(File.dirname(CONFIG.output)) FileUtils.mkdir_p(File.dirname(CONFIG.output))
end end
OUTPUT = CONFIG.output.upcase == "STDOUT" ? STDOUT : File.open(CONFIG.output, mode: "a") OUTPUT = CONFIG.output.upcase == "STDOUT" ? STDOUT : File.open(CONFIG.output, mode: "a")
LOGGER = Invidious::LogHandler.new(OUTPUT, CONFIG.log_level, CONFIG.colorize_logs) LOGGER = Invidious::LogHandler.new(OUTPUT, CONFIG.log_level)
# Check table integrity # Check table integrity
Invidious::Database.check_integrity(CONFIG) Invidious::Database.check_integrity(CONFIG)
@@ -160,16 +145,21 @@ Invidious::Database.check_integrity(CONFIG)
{% puts "\nDone checking player dependencies, now compiling Invidious...\n" %} {% puts "\nDone checking player dependencies, now compiling Invidious...\n" %}
{% end %} {% end %}
# Misc
DECRYPT_FUNCTION =
if sig_helper_address = CONFIG.signature_server.presence
IV::DecryptFunction.new(sig_helper_address)
else
nil
end
# Start jobs # Start jobs
if CONFIG.channel_threads > 0 if CONFIG.channel_threads > 0
Invidious::Jobs.register Invidious::Jobs::RefreshChannelsJob.new(PG_DB) Invidious::Jobs.register Invidious::Jobs::RefreshChannelsJob.new(PG_DB)
end end
if CONFIG.feed_threads > 0
Invidious::Jobs.register Invidious::Jobs::RefreshFeedsJob.new(PG_DB)
end
if CONFIG.statistics_enabled if CONFIG.statistics_enabled
Invidious::Jobs.register Invidious::Jobs::StatisticsRefreshJob.new(PG_DB, SOFTWARE) Invidious::Jobs.register Invidious::Jobs::StatisticsRefreshJob.new(PG_DB, SOFTWARE)
end end
@@ -182,14 +172,11 @@ if CONFIG.popular_enabled
Invidious::Jobs.register Invidious::Jobs::PullPopularVideosJob.new(PG_DB) Invidious::Jobs.register Invidious::Jobs::PullPopularVideosJob.new(PG_DB)
end end
NOTIFICATION_CHANNEL = ::Channel(VideoNotification).new(32) CONNECTION_CHANNEL = ::Channel({Bool, ::Channel(PQ::Notification)}).new(32)
CONNECTION_CHANNEL = ::Channel({Bool, ::Channel(PQ::Notification)}).new(32) Invidious::Jobs.register Invidious::Jobs::NotificationJob.new(CONNECTION_CHANNEL, CONFIG.database_url)
Invidious::Jobs.register Invidious::Jobs::NotificationJob.new(NOTIFICATION_CHANNEL, CONNECTION_CHANNEL, CONFIG.database_url)
Invidious::Jobs.register Invidious::Jobs::ClearExpiredItemsJob.new Invidious::Jobs.register Invidious::Jobs::ClearExpiredItemsJob.new
Invidious::Jobs.register Invidious::Jobs::InstanceListRefreshJob.new
Invidious::Jobs.start_all Invidious::Jobs.start_all
def popular_videos def popular_videos
@@ -208,34 +195,30 @@ error 404 do |env|
Invidious::Routes::ErrorRoutes.error_404(env) Invidious::Routes::ErrorRoutes.error_404(env)
end end
error 500 do |env, exception| error 500 do |env, ex|
error_template(500, exception) error_template(500, ex)
end
static_headers do |response|
response.headers.add("Cache-Control", "max-age=2629800")
end end
# Init Kemal # Init Kemal
public_folder "assets"
Kemal.config.powered_by_header = false Kemal.config.powered_by_header = false
add_handler FilteredCompressHandler.new add_handler FilteredCompressHandler.new
add_handler APIHandler.new add_handler APIHandler.new
add_handler AuthHandler.new add_handler AuthHandler.new
add_handler DenyFrame.new add_handler DenyFrame.new
{% if compare_versions(Crystal::VERSION, "1.17.0-dev") >= 0 %}
Kemal.config.serve_static = false
add_handler Invidious::HttpServer::StaticAssetsHandler.new("assets", directory_listing: false)
{% else %}
public_folder "assets"
static_headers do |env|
env.response.headers.add("Cache-Control", "max-age=2629800")
end
{% end %}
add_context_storage_type(Array(String)) add_context_storage_type(Array(String))
add_context_storage_type(Preferences) add_context_storage_type(Preferences)
add_context_storage_type(Invidious::User) add_context_storage_type(Invidious::User)
Kemal.config.logger = LOGGER Kemal.config.logger = LOGGER
Kemal.config.host_binding = Kemal.config.host_binding != "0.0.0.0" ? Kemal.config.host_binding : CONFIG.host_binding
Kemal.config.port = Kemal.config.port != 3000 ? Kemal.config.port : CONFIG.port
Kemal.config.app_name = "Invidious" Kemal.config.app_name = "Invidious"
# Use in kemal's production mode. # Use in kemal's production mode.
@@ -244,18 +227,4 @@ Kemal.config.app_name = "Invidious"
Kemal.config.env = "production" if !ENV.has_key?("KEMAL_ENV") Kemal.config.env = "production" if !ENV.has_key?("KEMAL_ENV")
{% end %} {% end %}
Kemal.run do |config| Kemal.run
config.server.not_nil!.max_request_line_size = 16384
if socket_binding = CONFIG.socket_binding
File.delete?(socket_binding.path)
# Create a socket and set its desired permissions
server = UNIXServer.new(socket_binding.path)
perms = socket_binding.permissions.to_i(base: 8)
File.chmod(socket_binding.path, perms)
config.server.not_nil!.bind server
else
Kemal.config.host_binding = Kemal.config.host_binding != "0.0.0.0" ? Kemal.config.host_binding : CONFIG.host_binding
Kemal.config.port = Kemal.config.port != 3000 ? Kemal.config.port : CONFIG.port
end
end

View File

@@ -12,12 +12,10 @@ record AboutChannel,
sub_count : Int32, sub_count : Int32,
joined : Time, joined : Time,
is_family_friendly : Bool, is_family_friendly : Bool,
pronouns : String?,
allowed_regions : Array(String), allowed_regions : Array(String),
tabs : Array(String), tabs : Array(String),
tags : Array(String), tags : Array(String),
verified : Bool, verified : Bool
is_age_gated : Bool
def get_about_info(ucid, locale) : AboutChannel def get_about_info(ucid, locale) : AboutChannel
begin begin
@@ -47,102 +45,46 @@ def get_about_info(ucid, locale) : AboutChannel
end end
tags = [] of String tags = [] of String
tab_names = [] of String
total_views = 0_i64
joined = Time.unix(0)
if age_gate_renderer = initdata.dig?("contents", "twoColumnBrowseResultsRenderer", "tabs", 0, "tabRenderer", "content", "sectionListRenderer", "contents", 0, "channelAgeGateRenderer") if auto_generated
description_node = nil author = initdata["header"]["interactiveTabbedHeaderRenderer"]["title"]["simpleText"].as_s
author = age_gate_renderer["channelTitle"].as_s author_url = initdata["microformat"]["microformatDataRenderer"]["urlCanonical"].as_s
ucid = initdata.dig("responseContext", "serviceTrackingParams", 0, "params", 0, "value").as_s author_thumbnail = initdata["header"]["interactiveTabbedHeaderRenderer"]["boxArt"]["thumbnails"][0]["url"].as_s
author_url = "https://www.youtube.com/channel/#{ucid}"
author_thumbnail = age_gate_renderer.dig("avatar", "thumbnails", 0, "url").as_s # Raises a KeyError on failure.
banner = nil banners = initdata["header"]["interactiveTabbedHeaderRenderer"]?.try &.["banner"]?.try &.["thumbnails"]?
is_family_friendly = false banner = banners.try &.[-1]?.try &.["url"].as_s?
is_age_gated = true
tab_names = ["videos", "shorts", "streams"] description_base_node = initdata["header"]["interactiveTabbedHeaderRenderer"]["description"]
auto_generated = false # some channels have the description in a simpleText
# ex: https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/
description_node = description_base_node.dig?("simpleText") || description_base_node
tags = initdata.dig?("header", "interactiveTabbedHeaderRenderer", "badges")
.try &.as_a.map(&.["metadataBadgeRenderer"]["label"].as_s) || [] of String
else else
if auto_generated author = initdata["metadata"]["channelMetadataRenderer"]["title"].as_s
author = initdata["header"]["interactiveTabbedHeaderRenderer"]["title"]["simpleText"].as_s author_url = initdata["metadata"]["channelMetadataRenderer"]["channelUrl"].as_s
author_url = initdata["microformat"]["microformatDataRenderer"]["urlCanonical"].as_s author_thumbnail = initdata["metadata"]["channelMetadataRenderer"]["avatar"]["thumbnails"][0]["url"].as_s
author_thumbnail = initdata["header"]["interactiveTabbedHeaderRenderer"]["boxArt"]["thumbnails"][0]["url"].as_s author_verified = has_verified_badge?(initdata.dig?("header", "c4TabbedHeaderRenderer", "badges"))
# Raises a KeyError on failure. ucid = initdata["metadata"]["channelMetadataRenderer"]["externalId"].as_s
banners = initdata["header"]["interactiveTabbedHeaderRenderer"]?.try &.["banner"]?.try &.["thumbnails"]?
banner = banners.try &.[-1]?.try &.["url"].as_s?
description_base_node = initdata["header"]["interactiveTabbedHeaderRenderer"]["description"] # Raises a KeyError on failure.
# some channels have the description in a simpleText banners = initdata["header"]["c4TabbedHeaderRenderer"]?.try &.["banner"]?.try &.["thumbnails"]?
# ex: https://www.youtube.com/channel/UCQvWX73GQygcwXOTSf_VDVg/ banners ||= initdata.dig?("header", "pageHeaderRenderer", "content", "pageHeaderViewModel", "banner", "imageBannerViewModel", "image", "sources")
description_node = description_base_node.dig?("simpleText") || description_base_node banner = banners.try &.[-1]?.try &.["url"].as_s?
tags = initdata.dig?("header", "interactiveTabbedHeaderRenderer", "badges") # if banner.includes? "channels/c4/default_banner"
.try &.as_a.map(&.["metadataBadgeRenderer"]["label"].as_s) || [] of String # banner = nil
else # end
author = initdata["metadata"]["channelMetadataRenderer"]["title"].as_s
author_url = initdata["metadata"]["channelMetadataRenderer"]["channelUrl"].as_s
author_thumbnail = initdata["metadata"]["channelMetadataRenderer"]["avatar"]["thumbnails"][0]["url"].as_s
author_verified = has_verified_badge?(initdata.dig?("header", "c4TabbedHeaderRenderer", "badges"))
ucid = initdata["metadata"]["channelMetadataRenderer"]["externalId"].as_s description_node = initdata["metadata"]["channelMetadataRenderer"]?.try &.["description"]?
tags = initdata.dig?("microformat", "microformatDataRenderer", "tags").try &.as_a.map(&.as_s) || [] of String
# Raises a KeyError on failure.
banners = initdata["header"]["c4TabbedHeaderRenderer"]?.try &.["banner"]?.try &.["thumbnails"]?
banners ||= initdata.dig?("header", "pageHeaderRenderer", "content", "pageHeaderViewModel", "banner", "imageBannerViewModel", "image", "sources")
banner = banners.try &.[-1]?.try &.["url"].as_s?
# if banner.includes? "channels/c4/default_banner"
# banner = nil
# end
description_node = initdata["metadata"]["channelMetadataRenderer"]?.try &.["description"]?
tags = initdata.dig?("microformat", "microformatDataRenderer", "tags").try &.as_a.map(&.as_s) || [] of String
end
is_family_friendly = initdata["microformat"]["microformatDataRenderer"]["familySafe"].as_bool
if tabs_json = initdata["contents"]["twoColumnBrowseResultsRenderer"]["tabs"]?
# Get the name of the tabs available on this channel
tab_names = tabs_json.as_a.compact_map do |entry|
name = entry.dig?("tabRenderer", "title").try &.as_s.downcase
# This is a small fix to not add extra code on the HTML side
# I.e, the URL for the "live" tab is .../streams, so use "streams"
# everywhere for the sake of simplicity
(name == "live") ? "streams" : name
end
# Get the currently active tab ("About")
about_tab = extract_selected_tab(tabs_json)
# Try to find the about metadata section
channel_about_meta = about_tab.dig?(
"content",
"sectionListRenderer", "contents", 0,
"itemSectionRenderer", "contents", 0,
"channelAboutFullMetadataRenderer"
)
if !channel_about_meta.nil?
total_views = channel_about_meta.dig?("viewCountText", "simpleText").try &.as_s.gsub(/\D/, "").to_i64? || 0_i64
# The joined text is split to several sub strings. The reduce joins those strings before parsing the date.
joined = extract_text(channel_about_meta["joinedDateText"]?)
.try { |text| Time.parse(text, "Joined %b %-d, %Y", Time::Location.local) } || Time.unix(0)
# Normal Auto-generated channels
# https://support.google.com/youtube/answer/2579942
# For auto-generated channels, channel_about_meta only has
# ["description"]["simpleText"] and ["primaryLinks"][0]["title"]["simpleText"]
auto_generated = (
(channel_about_meta["primaryLinks"]?.try &.size) == 1 && \
extract_text(channel_about_meta.dig?("primaryLinks", 0, "title")) == "Auto-generated by YouTube" ||
channel_about_meta.dig?("links", 0, "channelExternalLinkViewModel", "title", "content").try &.as_s == "Auto-generated by YouTube"
)
end
end
end end
is_family_friendly = initdata["microformat"]["microformatDataRenderer"]["familySafe"].as_bool
allowed_regions = initdata allowed_regions = initdata
.dig?("microformat", "microformatDataRenderer", "availableCountries") .dig?("microformat", "microformatDataRenderer", "availableCountries")
.try &.as_a.map(&.as_s) || [] of String .try &.as_a.map(&.as_s) || [] of String
@@ -160,22 +102,61 @@ def get_about_info(ucid, locale) : AboutChannel
end end
end end
total_views = 0_i64
joined = Time.unix(0)
tab_names = [] of String
if tabs_json = initdata["contents"]["twoColumnBrowseResultsRenderer"]["tabs"]?
# Get the name of the tabs available on this channel
tab_names = tabs_json.as_a.compact_map do |entry|
name = entry.dig?("tabRenderer", "title").try &.as_s.downcase
# This is a small fix to not add extra code on the HTML side
# I.e, the URL for the "live" tab is .../streams, so use "streams"
# everywhere for the sake of simplicity
(name == "live") ? "streams" : name
end
# Get the currently active tab ("About")
about_tab = extract_selected_tab(tabs_json)
# Try to find the about metadata section
channel_about_meta = about_tab.dig?(
"content",
"sectionListRenderer", "contents", 0,
"itemSectionRenderer", "contents", 0,
"channelAboutFullMetadataRenderer"
)
if !channel_about_meta.nil?
total_views = channel_about_meta.dig?("viewCountText", "simpleText").try &.as_s.gsub(/\D/, "").to_i64? || 0_i64
# The joined text is split to several sub strings. The reduce joins those strings before parsing the date.
joined = extract_text(channel_about_meta["joinedDateText"]?)
.try { |text| Time.parse(text, "Joined %b %-d, %Y", Time::Location.local) } || Time.unix(0)
# Normal Auto-generated channels
# https://support.google.com/youtube/answer/2579942
# For auto-generated channels, channel_about_meta only has
# ["description"]["simpleText"] and ["primaryLinks"][0]["title"]["simpleText"]
auto_generated = (
(channel_about_meta["primaryLinks"]?.try &.size) == 1 && \
extract_text(channel_about_meta.dig?("primaryLinks", 0, "title")) == "Auto-generated by YouTube" ||
channel_about_meta.dig?("links", 0, "channelExternalLinkViewModel", "title", "content").try &.as_s == "Auto-generated by YouTube"
)
end
end
sub_count = 0 sub_count = 0
pronouns = nil
if (metadata_rows = initdata.dig?("header", "pageHeaderRenderer", "content", "pageHeaderViewModel", "metadata", "contentMetadataViewModel", "metadataRows").try &.as_a) if (metadata_rows = initdata.dig?("header", "pageHeaderRenderer", "content", "pageHeaderViewModel", "metadata", "contentMetadataViewModel", "metadataRows").try &.as_a)
metadata_rows.each do |row| metadata_rows.each do |row|
subscribe_metadata_part = row.dig?("metadataParts").try &.as_a.find { |i| i.dig?("text", "content").try &.as_s.includes?("subscribers") } metadata_part = row.dig?("metadataParts").try &.as_a.find { |i| i.dig?("text", "content").try &.as_s.includes?("subscribers") }
if !subscribe_metadata_part.nil? if !metadata_part.nil?
sub_count = short_text_to_number(subscribe_metadata_part.dig("text", "content").as_s.split(" ")[0]).to_i32 sub_count = short_text_to_number(metadata_part.dig("text", "content").as_s.split(" ")[0]).to_i32
end end
break if sub_count != 0
pronoun_metadata_part = row.dig?("metadataParts").try &.as_a.find { |i| i.dig?("tooltip").try &.as_s.includes?("Pronouns") }
if !pronoun_metadata_part.nil?
pronouns = pronoun_metadata_part.dig("text", "content").as_s
end
break if sub_count != 0 && !pronouns.nil?
end end
end end
@@ -192,12 +173,10 @@ def get_about_info(ucid, locale) : AboutChannel
sub_count: sub_count, sub_count: sub_count,
joined: joined, joined: joined,
is_family_friendly: is_family_friendly, is_family_friendly: is_family_friendly,
pronouns: pronouns,
allowed_regions: allowed_regions, allowed_regions: allowed_regions,
tabs: tab_names, tabs: tab_names,
tags: tags, tags: tags,
verified: author_verified || false, verified: author_verified || false,
is_age_gated: is_age_gated || false,
) )
end end

View File

@@ -223,7 +223,7 @@ def fetch_channel(ucid, pull_all_videos : Bool)
length_seconds = channel_video.try &.length_seconds length_seconds = channel_video.try &.length_seconds
length_seconds ||= 0 length_seconds ||= 0
live_now = channel_video.try &.badges.live_now? live_now = channel_video.try &.live_now
live_now ||= false live_now ||= false
premiere_timestamp = channel_video.try &.premiere_timestamp premiere_timestamp = channel_video.try &.premiere_timestamp
@@ -249,7 +249,11 @@ def fetch_channel(ucid, pull_all_videos : Bool)
if was_insert if was_insert
LOGGER.trace("fetch_channel: #{ucid} : video #{video_id} : Inserted, updating subscriptions") LOGGER.trace("fetch_channel: #{ucid} : video #{video_id} : Inserted, updating subscriptions")
NOTIFICATION_CHANNEL.send(VideoNotification.from_video(video)) if CONFIG.enable_user_notifications
Invidious::Database::Users.add_notification(video)
else
Invidious::Database::Users.feed_needs_update(video)
end
else else
LOGGER.trace("fetch_channel: #{ucid} : video #{video_id} : Updated") LOGGER.trace("fetch_channel: #{ucid} : video #{video_id} : Updated")
end end
@@ -271,7 +275,7 @@ def fetch_channel(ucid, pull_all_videos : Bool)
ucid: video.ucid, ucid: video.ucid,
author: video.author, author: video.author,
length_seconds: video.length_seconds, length_seconds: video.length_seconds,
live_now: video.badges.live_now?, live_now: video.live_now,
premiere_timestamp: video.premiere_timestamp, premiere_timestamp: video.premiere_timestamp,
views: video.views, views: video.views,
}) })
@@ -281,7 +285,11 @@ def fetch_channel(ucid, pull_all_videos : Bool)
if Time.utc - video.published > 1.minute if Time.utc - video.published > 1.minute
was_insert = Invidious::Database::ChannelVideos.insert(video) was_insert = Invidious::Database::ChannelVideos.insert(video)
if was_insert if was_insert
NOTIFICATION_CHANNEL.send(VideoNotification.from_video(video)) if CONFIG.enable_user_notifications
Invidious::Database::Users.add_notification(video)
else
Invidious::Database::Users.feed_needs_update(video)
end
end end
end end
end end

View File

@@ -3,8 +3,8 @@ private IMAGE_QUALITIES = {320, 560, 640, 1280, 2000}
# TODO: Add "sort_by" # TODO: Add "sort_by"
def fetch_channel_community(ucid, cursor, locale, format, thin_mode) def fetch_channel_community(ucid, cursor, locale, format, thin_mode)
if cursor.nil? if cursor.nil?
# EgVwb3N0c_IGBAoCSgA%3D is the protobuf object to load "posts" # Egljb21tdW5pdHk%3D is the protobuf object to load "community"
initial_data = YoutubeAPI.browse(ucid, params: "EgVwb3N0c_IGBAoCSgA%3D") initial_data = YoutubeAPI.browse(ucid, params: "Egljb21tdW5pdHk%3D")
items = [] of JSON::Any items = [] of JSON::Any
extract_items(initial_data) do |item| extract_items(initial_data) do |item|
@@ -24,21 +24,15 @@ def fetch_channel_community(ucid, cursor, locale, format, thin_mode)
return extract_channel_community(items, ucid: ucid, locale: locale, format: format, thin_mode: thin_mode) return extract_channel_community(items, ucid: ucid, locale: locale, format: format, thin_mode: thin_mode)
end end
def decode_ucid_from_post_protobuf(params)
decoded_protobuf = params.try { |i| URI.decode_www_form(i) }
.try { |i| Base64.decode(i) }
.try { |i| IO::Memory.new(i) }
.try { |i| Protodec::Any.parse(i) }
return decoded_protobuf.try(&.["56:0:embedded"]["2:0:string"].as_s)
end
def fetch_channel_community_post(ucid, post_id, locale, format, thin_mode) def fetch_channel_community_post(ucid, post_id, locale, format, thin_mode)
object = { object = {
"56:embedded" => { "2:string" => "community",
"2:string" => ucid, "25:embedded" => {
"3:string" => post_id.to_s, "22:string" => post_id.to_s,
"11:string" => ucid, },
"45:embedded" => {
"2:varint" => 1_i64,
"3:varint" => 1_i64,
}, },
} }
params = object.try { |i| Protodec::Any.cast_json(i) } params = object.try { |i| Protodec::Any.cast_json(i) }
@@ -46,7 +40,7 @@ def fetch_channel_community_post(ucid, post_id, locale, format, thin_mode)
.try { |i| Base64.urlsafe_encode(i) } .try { |i| Base64.urlsafe_encode(i) }
.try { |i| URI.encode_www_form(i) } .try { |i| URI.encode_www_form(i) }
initial_data = YoutubeAPI.browse("FEpost_detail", params: params) initial_data = YoutubeAPI.browse(ucid, params: params)
items = [] of JSON::Any items = [] of JSON::Any
extract_items(initial_data) do |item| extract_items(initial_data) do |item|
@@ -143,7 +137,7 @@ def extract_channel_community(items, *, ucid, locale, format, thin_mode, is_sing
case attachment.as_h case attachment.as_h
when .has_key?("videoRenderer") when .has_key?("videoRenderer")
parse_item(attachment) parse_item(attachment)
.as(SearchVideo | ProblematicTimelineItem) .as(SearchVideo)
.to_json(locale, json) .to_json(locale, json)
when .has_key?("backstageImageRenderer") when .has_key?("backstageImageRenderer")
json.object do json.object do

View File

@@ -6,19 +6,19 @@ def fetch_channel_playlists(ucid, author, continuation, sort_by)
case sort_by case sort_by
when "last", "last_added" when "last", "last_added"
# Equivalent to "&sort=lad" # Equivalent to "&sort=lad"
# {"2:string": "playlists", "3:varint": 4, "4:varint": 1, "6:varint": 1, "110:embedded": {"1:embedded": {"8:string": ""}}} # {"2:string": "playlists", "3:varint": 4, "4:varint": 1, "6:varint": 1}
"EglwbGF5bGlzdHMYBCABMAHyBgQKAkIA" "EglwbGF5bGlzdHMYBCABMAE%3D"
when "oldest", "oldest_created" when "oldest", "oldest_created"
# formerly "&sort=da" # formerly "&sort=da"
# Not available anymore :c or maybe ?? # Not available anymore :c or maybe ??
# {"2:string": "playlists", "3:varint": 2, "4:varint": 1, "6:varint": 1, "110:embedded": {"1:embedded": {"8:string": ""}}} # {"2:string": "playlists", "3:varint": 2, "4:varint": 1, "6:varint": 1}
"EglwbGF5bGlzdHMYAiABMAHyBgQKAkIA" "EglwbGF5bGlzdHMYAiABMAE%3D"
# {"2:string": "playlists", "3:varint": 1, "4:varint": 1, "6:varint": 1} # {"2:string": "playlists", "3:varint": 1, "4:varint": 1, "6:varint": 1}
# "EglwbGF5bGlzdHMYASABMAE%3D" # "EglwbGF5bGlzdHMYASABMAE%3D"
when "newest", "newest_created" when "newest", "newest_created"
# Formerly "&sort=dd" # Formerly "&sort=dd"
# {"2:string": "playlists", "3:varint": 3, "4:varint": 1, "6:varint": 1, "110:embedded": {"1:embedded": {"8:string": ""}}} # {"2:string": "playlists", "3:varint": 3, "4:varint": 1, "6:varint": 1}
"EglwbGF5bGlzdHMYAyABMAHyBgQKAkIA" "EglwbGF5bGlzdHMYAyABMAE%3D"
end end
initial_data = YoutubeAPI.browse(ucid, params: params || "") initial_data = YoutubeAPI.browse(ucid, params: params || "")
@@ -44,12 +44,3 @@ def fetch_channel_releases(ucid, author, continuation)
end end
return extract_items(initial_data, author, ucid) return extract_items(initial_data, author, ucid)
end end
def fetch_channel_courses(ucid, author, continuation)
if continuation
initial_data = YoutubeAPI.browse(continuation)
else
initial_data = YoutubeAPI.browse(ucid, params: "Egdjb3Vyc2Vz8gYFCgPCAQA%3D")
end
return extract_items(initial_data, author, ucid)
end

Some files were not shown because too many files have changed in this diff Show More