Compare commits

..

743 Commits

Author SHA1 Message Date
Fijxu 4daf1f0818 Add TvSimply client
Data taken from: https://github.com/LuanRT/YouTube.js/commit/8cf658151fc4e4266fadfb7e53dd5db3db693355, https://github.com/LuanRT/YouTube.js/commit/689fb0b90edab6f0e4326a35144541d68f72fe01 and https://github.com/LuanRT/YouTube.js/commit/b15f623dab3acb44eaef33175df2d22d35be2979
2025-06-12 01:24:45 -04:00
syeopite df8839d1f0 Make base-Invidious video info extraction more resilient (#5312)
Try next fallback client if one raises

Convert `dig` to `dig?`

Optimize companionless stream retrieval
2025-05-28 20:18:51 +00:00
syeopite b859faebf0 Remove @iv-org/developers from codeowners (#5314) 2025-05-28 17:34:49 +02:00
Fijxu 4b37d47ebb Add missing xml.text on "title" element for channels RSS (#5320) 2025-05-22 20:12:54 -04:00
syeopite 2c857b5ab6 Remove text captchas from Invidious (#5308)
textcaptcha.com seems to be down since April and it does not appear that
service will be restored.

Text captchas can be easily automated using free LLMs, so keeping the
text captcha is more like a gate to create accounts in mass on public
Invidious instances.

It also gives headaches like bots automating account creation to modify
the videos that appear popular page of each instance (since the popular
page is based on the subscriptions of the registered users).
2025-05-17 16:37:55 -07:00
Fijxu 00299ca4a0 Remove Image CAPTCHA and Text CAPTCHA from locale 2025-05-17 19:23:40 -04:00
syeopite 9d18c8699f Release versioning maintenance (#5310) 2025-05-17 16:22:32 -07:00
syeopite 475bf7448a Add Javascript licence information automatically (#5297) 2025-05-17 16:20:38 -07:00
syeopite 50e0a4361b Add missing javascript licenses (#5292) 2025-05-17 16:19:21 -07:00
syeopite 6bfb61e9b4 fix: safely access "label" key (#5282) 2025-05-17 16:18:58 -07:00
syeopite ef07c542dc fix: pass user to query.process if present (#5277) 2025-05-17 16:18:37 -07:00
syeopite a9180aa6c1 fix: do not strip '+' character from referer (#5276) 2025-05-17 16:18:15 -07:00
syeopite 4b2f9ffffc fix: set CSP header after setting preferences of registered users (#5275) 2025-05-17 16:17:43 -07:00
syeopite 64ad97f308 fix(typo): 'Salect' -> 'Select' (#5242) 2025-05-17 16:17:08 -07:00
syeopite d5cb653fd1 Handle parse errors gracefully on timeline items (#5196) 2025-05-17 16:16:20 -07:00
syeopite 0b23dd12e1 require base_job before the other jobs (#5194) 2025-05-17 16:15:32 -07:00
syeopite 23d66338cd Translations update from Hosted Weblate (#5192) 2025-05-17 16:15:03 -07:00
syeopite df41cb9588 Update Kemal to 1.6.0 and remove Kilt (#5120) 2025-05-17 16:14:40 -07:00
syeopite 49ada0aae9 Fix incorrect PR link for v2.20250504.0 2025-05-17 15:49:03 -07:00
syeopite f6a41ce90d Bump shard.yml version 2025-05-17 15:42:48 -07:00
Emilien f7aefd5fb1 Release v2.20250517.0 2025-05-17 15:41:33 -07:00
Fijxu 6376fd55db Remove text captcha due to textcaptcha.com being down
Fixes https://github.com/iv-org/invidious/issues/5295

textcaptcha.com seems to be down since April and it does not appear that service will be restored.

Text captchas can be easily automated using free LLMs, so keeping the text captcha is more like a gate to create accounts in mass on public Invidious instances.

It also gives headaches like bots automating account creation to modify the videos that appear popular page of each instance (since the popular page is based on the subscriptions of the registered users).
2025-05-17 13:17:26 -04:00
Hosted Weblate 9e172d8371 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate 8d0834005f Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate 9f192d4f74 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate ee7b8b6c61 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate b9097d0a3b Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate be469304de Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate b6b245586a Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate 88195113bf Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate 4d381aca60 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate a5904ecce2 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate 42125dfadd Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate 5953f7286f Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate 31556d0f88 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:08 +02:00
Hosted Weblate 7bd1abecde Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate 583195ccbd Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate f96e476ed9 Update Vietnamese translation
Update translation files

Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Abc's Noob <abcsspprt@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate 9186020f94 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate 546a799f0b Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate 2d8326c63d Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate 9c9a8592e0 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate 435106b7de Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate 6a9ed48d5d Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate a5b97a5850 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate f8f6eb74f5 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate 1e73f4e382 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate 476bc51b0e Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate 96b226b130 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Hosted Weblate 3b87bf2675 Update Latvian translation
Add Latvian translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) <coool@mail.lv>
2025-05-14 07:51:07 +02:00
Hosted Weblate 0dff773a07 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-05-14 07:51:07 +02:00
Fijxu 03f89be929 CI: Bump Crystal version matrix (#5293)
* CI: Bump Crystal version matrix

- 1.12.1 -> 1.12.2
- 1.13.2 -> 1.13.3
- 1.14.0 -> 1.14.1
- 1.15.0 -> 1.15.1
- Add 1.16.3

* Update Crystal 1.16.2 to 1.16.3

https://github.com/crystal-lang/crystal/releases/tag/1.16.3
2025-05-14 01:51:03 -04:00
dependabot[bot] d4eb2a9741 Bump crystallang/crystal from 1.16.2-alpine to 1.16.3-alpine in /docker (#5301)
Bumps crystallang/crystal from 1.16.2-alpine to 1.16.3-alpine.

---
updated-dependencies:
- dependency-name: crystallang/crystal
  dependency-version: 1.16.3-alpine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-14 01:20:50 -04:00
Fijxu 6fe21a7523 Revert "Update src/invidious/routes/before_all.cr"
This reverts commit aab6ff4bb6.
2025-05-10 23:08:48 -04:00
Fijxu aab6ff4bb6 Update src/invidious/routes/before_all.cr
Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2025-05-10 23:02:34 -04:00
syeopite 20cf913a4e Add Javascript licence information automatically
This commit automates the process of documenting the licenses of
Invidious Javascript files through a compile time macro in the
licenses.ecr template file.

This should hopefully help keep the license documentation up-to-date
and allow extensions like LibreJS to always be able to load the latest
Javascript files of Invidious.

Currently only Invidious's first-party Javascript files are supported.
In the future it should be possible to leverage videojs-dependencies.yml
to automatically document the Javascript licenses for
VideoJS and co. as well.
2025-05-10 18:44:53 -07:00
Fijxu 1492453c60 update comment 2025-05-10 16:31:14 -04:00
Fijxu 401bc110d6 fix: set CSP header after setting preferences of registered users
Fixes https://github.com/iv-org/invidious/issues/5142

add reason why extra_media_csp is after reading user preferences from the database and cookies

set media-src after loading database user preferences
2025-05-10 13:26:30 -04:00
Fijxu 30ae222bf2 Add missing javascript licenses 2025-05-09 23:02:19 -04:00
dependabot[bot] 81ca831439 Bump crystallang/crystal from 1.12.2-alpine to 1.16.2-alpine in /docker (#5290)
Bumps crystallang/crystal from 1.12.2-alpine to 1.16.2-alpine.

---
updated-dependencies:
- dependency-name: crystallang/crystal
  dependency-version: 1.16.2-alpine
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-09 22:19:04 +02:00
Émilien (perso) 8feea29607 Fix crystal version used in alpine 3.21 2025-05-09 22:09:09 +02:00
dependabot[bot] c4944ee061 Bump crystal-lang/install-crystal from 1.8.0 to 1.8.2 (#5286)
Bumps [crystal-lang/install-crystal](https://github.com/crystal-lang/install-crystal) from 1.8.0 to 1.8.2.
- [Release notes](https://github.com/crystal-lang/install-crystal/releases)
- [Commits](https://github.com/crystal-lang/install-crystal/compare/v1.8.0...v1.8.2)

---
updated-dependencies:
- dependency-name: crystal-lang/install-crystal
  dependency-version: 1.8.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-09 22:00:24 +02:00
dependabot[bot] 406277b16f Bump docker/build-push-action from 5 to 6 (#5287)
Bumps [docker/build-push-action](https://github.com/docker/build-push-action) from 5 to 6.
- [Release notes](https://github.com/docker/build-push-action/releases)
- [Commits](https://github.com/docker/build-push-action/compare/v5...v6)

---
updated-dependencies:
- dependency-name: docker/build-push-action
  dependency-version: '6'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-09 22:00:15 +02:00
dependabot[bot] 7259c63648 Bump alpine from 3.20 to 3.21 in /docker (#5288)
Bumps alpine from 3.20 to 3.21.

---
updated-dependencies:
- dependency-name: alpine
  dependency-version: '3.21'
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-09 22:00:06 +02:00
dependabot[bot] 73f524fccd Bump actions/cache from 3 to 4 (#5289)
Bumps [actions/cache](https://github.com/actions/cache) from 3 to 4.
- [Release notes](https://github.com/actions/cache/releases)
- [Changelog](https://github.com/actions/cache/blob/main/RELEASES.md)
- [Commits](https://github.com/actions/cache/compare/v3...v4)

---
updated-dependencies:
- dependency-name: actions/cache
  dependency-version: '4'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-09 21:59:56 +02:00
dependabot[bot] 03e06b239b Bump actions/stale from 8 to 9 (#5291)
Bumps [actions/stale](https://github.com/actions/stale) from 8 to 9.
- [Release notes](https://github.com/actions/stale/releases)
- [Changelog](https://github.com/actions/stale/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/stale/compare/v8...v9)

---
updated-dependencies:
- dependency-name: actions/stale
  dependency-version: '9'
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-05-09 21:59:03 +02:00
Émilien (perso) c304ea6db3 chore: Add dependabot for docker and github actions (#5285) 2025-05-09 21:58:06 +02:00
Fijxu b120abdcc5 fix: safely access "label" key
Fixes https://github.com/iv-org/invidious/issues/5095

On some videos, `label` is missing from the video information. Invidious
assumed that the `label` key existed.

Videos with label have this inside `metadataBadgeRenderer`:

```
{"style" => "BADGE_STYLE_TYPE_SIMPLE",
 "label" => "4K",
 "trackingParams" => "COMDENwwGAoiEwiCrebe6JWNAxWIxz8EHSQRFTU="}
```

but other videos, for some reason, look like this:

```
{"icon" => {"iconType" => "PERSON_RADAR"},
 "style" => "BADGE_STYLE_TYPE_SIMPLE",
 "trackingParams" => "CM4DENwwGAsiEwiCrebe6JWNAxWIxz8EHSQRFTU="}
```
2025-05-09 02:58:29 -04:00
Émilien (perso) 9e3c0dfd85 fix: fallback first with TVHTML then MWEB
fixes #5273
2025-05-08 19:55:22 +02:00
Fijxu 25eade589f fix: pass user to query.process if present.
Fixes https://github.com/iv-org/invidious/issues/5097
2025-05-08 03:12:00 -04:00
Fijxu 35896d086b fix: do not strip '+' character from referer
Fix that a user of my instance (https://inv.nadeko.net) sent me by email.
2025-05-08 01:00:46 -04:00
Emilien d1bc15b8bf Release v2.20250504.0 2025-05-04 11:59:42 +02:00
Vyquos 1f028fee0f Reflect companion secret character limit in example config comment (#5269)
Update the comments in the example config to show that the companion secret key must be exactly 16 characters long as per https://github.com/iv-org/invidious-companion/pull/81#issuecomment-2750675405.
2025-05-04 07:47:42 +00:00
absidue 2c1400c41e Fix proxying live DASH streams (#4589) 2025-05-03 20:28:19 +00:00
Alex Maras 8fd0b82c38 feat: route to invidious companion on downloads (#5224) 2025-05-03 01:28:18 +02:00
Émilien (perso) 7579adc3a3 fix: fallback other yt clients no url found for adaptive formats (#5262) 2025-05-02 16:57:02 +02:00
efb4f5ff-1298-471a-8973-3d47447115dc d567c6be6e Fix minor casing issues in brand names (#5258) 2025-05-02 15:36:31 +02:00
Fijxu 05b99df49a fix(typo): 'Salect' -> 'Select' 2025-04-17 16:55:30 -04:00
syeopite 6c063436d4 Fix issues raised by code review
Remove explicit `self.` from #process of parsers

Remove explicit return tuple in get_issue_template

Fix formatting

Move inline issue template style to stylesheet

Use @id in ProblematicTimelineItem xml repr

Fix naming
2025-04-05 12:40:38 -07:00
Émilien (perso) 0c07e9d27a chore: set dash by default (#5216) 2025-04-04 14:00:29 +02:00
Émilien (perso) 23ff6135bb chore: enforce 16 characters for invidious_companion_key (#5220) 2025-03-26 15:27:59 +01:00
syeopite 7b27585454 Support ProblematicTimelineItem in trending feed 2025-03-19 23:50:41 -07:00
syeopite f7810ba007 Use ProblematicTimelineItem as needed in playlists 2025-03-19 23:32:46 -07:00
syeopite c288005bfd Make "show technical details" btn translatable 2025-03-19 22:52:04 -07:00
syeopite aae5ba01c2 Fix formatting 2025-03-19 22:52:04 -07:00
syeopite dd16f15aae Improve error card border color on dark theme 2025-03-19 22:52:04 -07:00
syeopite 180d77276b Emphasise error card icon 2025-03-19 22:52:04 -07:00
syeopite 0e0a95430a Improve JSON repr of ProblematicTimelineItem 2025-03-19 22:52:03 -07:00
syeopite 9de69c0052 Improve design of placeholder item
Also makes it show the error backtrace
2025-03-19 22:52:03 -07:00
syeopite dbeee71457 Apply search filters details css only to itself
The CSS for the search filters details box was applied to every
detail element when search.css is loaded
2025-03-19 22:52:03 -07:00
syeopite 94cb80ea81 Handle parse errors gracefully on timeline items
Prior to this commit, if even a single item fails to parse Invidious
will throw out an error. This means that even if everything else
on a page can be parsed and rendered without issues, the single
problematic item will cause the entire page to be unusable.

This commit gracefully handles parse errors by catching and then
replacing the problematic item with a new "timeline error" object
that represents the parse error. This will allow the rest of the page
to be rendered and an error card that will replace the location of the
problematic item.
2025-03-19 22:52:03 -07:00
syeopite 409d12a81e Prepare for next release (#5206) 2025-03-16 01:03:01 +00:00
Émilien (perso) 70ff463cc6 Add invidious companion support (#4985)
* add support for invidious companion

* redirect latest_version and dash manifest to invidious companion

* fix Shadowing outer local variable `response`

* fixing condition for Content-Security-Policy

* throw error if inv_sig_helper and invidious_companion used same time

* Use sample instead of Random.rand

Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>

* Remove debug puts functions

Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>

* modify the description for config.example.yaml about invidious companion

* move config checks for invidious companion

* separate invidious_companion logic + better config.yaml config

* fixing "end" misplacement

* fix linting + use .empty?

* crystal handle decompression already by itself

* fix download function when invidious companion used

* fix linting

* invidious companion always used so always add CSP and redirect latest_version

* apply all the suggestions + rework invidious_companion parameter

* format watch.cr

* fix ameba Redundant use of `Object#to_s` in interpolation

* add ability for invidious companion to check request from invidious

* Better document private_url and public_url

* Better doc for invidious_companion_key

* !empty? to present?

* skip proxy for invidious companion

* fixing format

* missing ,

* add companion pooling http

* fix: don't use http proxy when sending requests to companion

* fix: logic where we want to have the invidious logic if companion is not used

* chore: remove baseurl usage from invidious companion

* chore: change from inv-sig-helper to companion for required playback

* fix: use puts + add warning for inv-sig-helper deprecated

---------

Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2025-03-13 16:44:00 +01:00
syeopite e23d0d13be Add changelog for v2.20250314.0 (#5197)
* Release v2.20250314.0

* Update CHANGELOG.md
2025-03-12 03:31:15 -07:00
syeopite 5c8b4eb379 Warn when po_token, visitor_data and/or inv-sig-helper is not configured (#5202)
* Warn when required configs for playback is missing

* Add link to documentation in warnings

* Direct users to /installation instead
2025-03-12 10:11:17 +01:00
Fijxu dd2e999402 require base_job before the other jobs
The crystal compiler seems to evaluate `require` in an alphabetical way,
so if anyone in the future, wants to add another job and that job is
above `base_job.cr` in alphabetical order, the compiler is going to fail
with `Error: undefined constant: Invidious::Jobs::BaseJob`.

This doesn't fix anything, but it will prevent a future headache.
2025-02-28 19:47:22 -03:00
syeopite adcdb8cb92 Fix lint and formatting 2025-02-26 14:18:50 -08:00
syeopite fe4fa0480a Fix HLS being used for non-livestream videos (#5189)
Invidious does not currently support non-livestream hls playback

Originally, the HLS manifest check was essentially a boolean:
if the HLS manifest field was present, it was assumed to be a
livestream. Some videos include the HLS Manifest but aren't
livestreams.

In the case where they are livestreams, the video contains a videoType
field with the value "Livestream". In the case that they're normal
videos, the videoType is "Video". This is exposed via the
`video.live_now` property.

This commit just checks that `video.live_now` is true before treating
it as a livestream
2025-02-26 14:14:29 -08:00
syeopite dbbcacc955 Images: fix typo in thumbnail logic 2025-02-26 14:13:58 -08:00
syeopite 58ad848d56 Channels: Support YouTube's change to from /community to /posts (#5183) 2025-02-26 14:13:22 -08:00
syeopite f9b9e85ee4 Docker: Use Crystal compiler cache in docker builds (#5163)
Adding the compiler cache reduces the build times on repeated
builds significantly
2025-02-26 14:11:12 -08:00
syeopite 6ac74f4362 Videos: Fix empty response when rv published field is nonexistent (#5162)
Fixes #5161 by checking recommended videos published field for presence
before attempting to parse it in api
2025-02-26 14:09:28 -08:00
syeopite 9fbe3944b0 Channels: Add Courses to channel page and channel API (#5158)
Closes #5144
2025-02-26 14:08:44 -08:00
syeopite c5e9447f41 Pick a different instance upon redirect (#5154)
The automatic instance redirection has the potential to pick
the same instance the user is currently on. This is especially
prevalent when the instance list is limited in number like how it is
today.

This PR checks the domain of the instance and ensures that it is not
the same as the current instane before redirecting the user to it.
Otherwise, it just sends the user to rediret.invidious.io
2025-02-26 14:05:21 -08:00
syeopite 3e329410d1 Add the ability to listen on UNIX sockets (#5112) 2025-02-26 14:04:29 -08:00
syeopite 74dfda150e i18n: Enable Tamil 2025-02-26 14:02:57 -08:00
syeopite e60f53154e Translations update from Hosted Weblate (#4989) 2025-02-26 13:57:04 -08:00
syeopite 3d77635a5c Add API endpoint for fetching transcripts from YouTube (#4788) 2025-02-26 13:56:39 -08:00
syeopite d0433c8386 JS: Update timeupdate event defensive to prevent errors (#4782) 2025-02-26 13:56:13 -08:00
syeopite 4ea4878d1a User: Batch notifications together 2025-02-26 13:55:25 -08:00
syeopite 1f0a89fb5f RSS: Channel + Playlist improvements (#4298) 2025-02-26 13:55:01 -08:00
syeopite f95f87e448 Frontend: Add a first page and previous page buttons for channel navigation (#4123) 2025-02-26 13:54:25 -08:00
Alex Maras 49afbf2a14 Fix an issue with the HLS manifest check for livestream videos
Originally, the HLS manifest check was essentially a boolean: if the HLS
manifest field was present, it was assumed to be a livestream. Some
videos include the HLS Manifest but aren't livestreams.

In the case where they are livestreams, the video contains a videoType
field with the value "Livestream". In the case that they're normal
videos, the videoType is "Video". This is exposed via the video.live_now
method.

This commit just checks that video.live_now is true before treating it
as a livestream
2025-02-21 16:30:39 +08:00
syeopite d853b9f6dc Typo
Co-authored-by: Samantaz Fox <coding@samantaz.fr>
2025-02-18 14:46:18 -08:00
Fijxu d70681538a Channels: Fix community tab 2025-02-18 19:20:55 -03:00
syeopite 05c5448bc1 Update Kemal to 1.6.0 and remove Kilt
Kilt is unmaintained and the ECR templating logic has been
natively integrated into Kemal with the issues previously seen
having been resolved.

This commit is mostly a precursor to support the next Kemal
release which will add the ability to create error handlers for
raised exceptions.

See https://github.com/kemalcr/kemal/pull/688
2025-01-29 11:49:45 -08:00
syeopite e2df12b7d6 Use Crystal compiler cache in docker builds 2025-01-28 23:31:01 -08:00
Drikanis 29219c46a1 fix 5161 by checking recommended videos published field for presence instead of just not nil 2025-01-28 19:40:15 -07:00
epicsam123 a77f083a0a remove ! on reject 2025-01-26 16:42:59 -05:00
ChunkyProgrammer eaf47385c5 Add Courses to channel page and channel API 2025-01-25 14:43:39 -05:00
Hosted Weblate 1fb8d3f583 Add Toki Pona translation
Co-authored-by: Dave Brunker <dbrunker@flashmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2025-01-25 14:02:51 +01:00
Hosted Weblate 26b15d6e35 Update Norwegian Bokmål translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Petter Reinholdtsen <pere-weblate@hungry.com>
2025-01-25 14:02:51 +01:00
Hosted Weblate 786e3e0550 Update Serbian (Cyrillic script) translation
Update Serbian (Cyrillic script) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
2025-01-25 14:02:51 +01:00
Hosted Weblate 104553fdc4 Update Chinese (Simplified Han script) translation
Update Chinese (Simplified Han script) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
2025-01-25 14:02:50 +01:00
Hosted Weblate ae670d5b2d Update Chinese (Traditional Han script) translation
Update Chinese (Traditional Han script) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jeff Huang <s8321414@gmail.com>
2025-01-25 14:02:50 +01:00
Hosted Weblate b2c14f1a2a Update Slovenian translation
Co-authored-by: Damjan Gerl <damjan@damjan.net>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2025-01-25 14:02:49 +01:00
Hosted Weblate b899bc959e Update Korean translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: xrfmkrh <rF3nMd7sRKezjF2vcEQo@protonmail.com>
2025-01-25 14:02:49 +01:00
Hosted Weblate 74dc6795cd Update Albanian translation
Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2025-01-25 14:02:48 +01:00
Hosted Weblate 5404b67bef Update Serbian translation
Update Serbian translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
2025-01-25 14:02:48 +01:00
Hosted Weblate 7b59ccf645 Update Finnish translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Juli <julimiro@posteo.net>
2025-01-25 14:02:48 +01:00
Hosted Weblate cc6c39d0e6 Update Persian translation
Co-authored-by: Danial Behzadi <dani.behzi@ubuntu.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2025-01-25 14:02:47 +01:00
Hosted Weblate 37f3c285d7 Update Swedish translation
Update Swedish translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
2025-01-25 14:02:47 +01:00
Hosted Weblate 106086c766 Update French translation
Co-authored-by: ABCraft19 <lesenfantsbergaoui@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2025-01-25 14:02:46 +01:00
Hosted Weblate 0980867d42 Update Spanish translation
Update Spanish translation

Update Spanish translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jorge Maldonado Ventura <jorgesumle@freakspot.net>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
2025-01-25 14:02:46 +01:00
Hosted Weblate 3abc377d56 Update Dutch translation
Update Dutch translation

Co-authored-by: Dick Groskamp <dikgro@yahoo.co.uk>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2025-01-25 14:02:45 +01:00
Hosted Weblate 4a0a6f7ed5 Update Arabic translation
Update Arabic translation

Update Arabic translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rex_sa <rex.sa@pm.me>
2025-01-25 14:02:45 +01:00
Hosted Weblate 3056e1767e Update Italian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
2025-01-25 14:02:44 +01:00
Hosted Weblate 0846faa6f6 Update Polish translation
Update Polish translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Matthaiks <kitynska@gmail.com>
2025-01-25 14:02:44 +01:00
Hosted Weblate 943c42e47b Update Croatian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
2025-01-25 14:02:43 +01:00
Hosted Weblate fc7b5120db Update Icelandic translation
Update Icelandic translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
2025-01-25 14:02:43 +01:00
Hosted Weblate d4d6a4b172 Update Portuguese translation
Update Portuguese translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Sergio Marques <so.boston.android@gmail.com>
2025-01-25 14:02:42 +01:00
Hosted Weblate e0cb54f7e0 Update Czech translation
Update Czech translation

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2025-01-25 14:02:42 +01:00
Hosted Weblate 844e1bdf43 Update Japanese translation
Update Japanese translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: maboroshin <maboroshin@users.noreply.hosted.weblate.org>
2025-01-25 14:02:41 +01:00
Hosted Weblate aacfbb09da Update Ukrainian translation
Update Ukrainian translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
2025-01-25 14:02:41 +01:00
Hosted Weblate f57b4b5e4f Update Russian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: sergio <sergio+it@outerface.net>
2025-01-25 14:02:41 +01:00
Hosted Weblate b1422b7434 Update Greek translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: hompre <46e989cc@opayq.com>
2025-01-25 14:02:40 +01:00
Hosted Weblate f56e4012fe Update German translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Sanny Cue <sanny.cue@gmail.com>
2025-01-25 14:02:39 +01:00
Hosted Weblate 7d5b2ec7b6 Update Portuguese (Brazil) translation
Update Portuguese (Brazil) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: joaooliva <joaooliva@protonmail.com>
2025-01-25 14:02:39 +01:00
Hosted Weblate cad64e420c Update Tamil translation
Add Tamil translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
2025-01-25 14:02:38 +01:00
Hosted Weblate f181ae3cb0 Update Turkish translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
2025-01-25 14:02:38 +01:00
epicsam123 0fd480bae2 lint edits, refactor 2025-01-25 03:24:38 -05:00
epicsam123 afb0aad7d3 moved comments 2025-01-24 21:54:10 -05:00
epicsam123 6816ded0fa add missing end statement 2025-01-23 22:17:46 -05:00
epicsam123 0546a73bfa Pick a different instance upon redirect 2025-01-22 17:33:54 -05:00
syeopite 164d764d55 API: Add a 'published' video parameter for related videos (#4149) 2025-01-22 11:38:12 -08:00
syeopite 4a31da4000 User: Ensure IO is properly closed when importing NewPipe subscriptions (#4346) 2025-01-22 11:36:58 -08:00
syeopite 831017f403 Frontend: Carry over audio-only mode in playlist links (#4784) 2025-01-22 11:35:33 -08:00
syeopite 52daafe047 Videos: Fix missing host parameter on playback URLs when local=true (#4992) 2025-01-22 11:34:46 -08:00
syeopite dca130ca6f Routes: Clean ajax actions handlers (#5036) 2025-01-22 11:33:51 -08:00
syeopite 086c6209ab Remove stdlib override for proxy initialization (#5065) 2025-01-22 11:33:20 -08:00
syeopite 0d398c9d1a API: Add support for author thumbnails in search api for videos (#5072) 2025-01-22 11:32:21 -08:00
syeopite dc38bcdf17 Kemal: Skip route if response was closed by handlers (#5073) 2025-01-22 11:30:45 -08:00
syeopite d5442d45bc API: Fix video thumbnails in mixes (#5116) 2025-01-22 11:29:12 -08:00
syeopite d4f0560e80 CI: Drop support for versions prior to 1.12 and add 1.15.0 (#5148) 2025-01-22 11:28:38 -08:00
syeopite eae3c42dab Videos: Set language for dash audio streams and sort (#5149) 2025-01-22 11:25:39 -08:00
syeopite c0131d8646 Warn when any top-level config is "CHANGE_ME!!" (#5150) 2025-01-22 11:16:24 -08:00
syeopite 21fd717701 Comment out http_proxy in example config (#5151)
The http_proxy section was not commented out in the example config
causing Invidious to error out unless an HTTP proxy was configured.

This problem affects new manual installs in which the example config
is copied to create the actual config Invidious uses
2025-01-22 11:11:42 -08:00
syeopite 8ee73aa0c1 Remove formatter check on container workflows (#5153) 2025-01-22 19:07:24 +00:00
Giuliano Macedo 6e3ec10d76 feat(manifset): improved adaptationset label 2025-01-22 11:01:37 -08:00
GTechAlpha d95ae7e6a5 Add audio track info to dash manifest, if present
- language id
  - language display name
  - main/default track
Sort audio formats so that main/default is first (for clients not using dash)

* Note: this should be a non-breaking change; if audio track info is not availablle, the behavior does not change from current
2025-01-22 11:01:37 -08:00
syeopite d36f372bd1 CI: Add support for 1.15.0 2025-01-22 10:34:24 -08:00
syeopite 58c65e921f CI: Drop support for versions prior to 1.12.0 2025-01-22 10:34:24 -08:00
syeopite 5d9ed95ffd Warn when any top-level config is "CHANGE_ME!!" 2025-01-22 10:34:04 -08:00
syeopite 033e42a981 Comment out http_proxy in example config 2025-01-22 10:33:34 -08:00
syeopite bfa6da2474 Make Invidious compliant to Crystal 1.15 formatting rules (#5014) 2025-01-22 18:32:35 +00:00
syeopite 097b4f0433 CI: Use separate shards cache for lint step
Ameba could be built with an older version of Crystal that follows
a different set of formatting rules than the latest version causing
the Lint/Formatting rule to fail when in actuality the code is actually
compliant with the formatting rules in the latest version of Crystal
2025-01-20 16:39:33 -08:00
syeopite e1378702af Apply upcoming formatting rules from Crystal 1.15 2025-01-20 16:15:13 -08:00
Émilien (perso) b13f77b5af Update bug report issue message 2025-01-09 14:21:28 +01:00
Caian Benedicto b4a6193642 Improve syntax
Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2025-01-05 09:56:00 +00:00
Caian Benedicto 525dea1e2a Add checks for socket path and permissions 2024-12-27 20:58:44 -03:00
Caian Benedicto f9885cca8e Revert changes made to other parameters 2024-12-27 15:19:13 -03:00
Brahim Hadriche 047ead8080 Fix video thumbnails in mixes 2024-12-16 16:54:04 -05:00
Caian Benedicto 275318dae2 Change socket_binding to a nested configuration in YAML 2024-12-14 15:18:25 -03:00
Caian Benedicto 48d2250024 Unify socket_binding and socket_permissions 2024-12-14 06:53:30 -03:00
Caian Benedicto 5f8130fd03 Leave socket_binding disabled by default in the configuration example 2024-12-14 05:39:03 -03:00
Caian Benedicto b4e930f3bc Change bind_unix to socket_binding, add socket_permissions and config example 2024-12-13 21:50:02 -03:00
Caian Benedicto d7f5cdc2f9 Merge branch 'master' into unix-sockets 2024-12-13 20:26:52 -03:00
ChunkyProgrammer 04b0742293 remove icon element from channel rss feed 2024-11-17 13:14:39 -05:00
ChunkyProgrammer 1838ac4c99 do a sanity check on the provided ucid
Co-Authored-By: absidue <48293849+absidue@users.noreply.github.com>
Co-Authored-By: Samantaz Fox <coding@samantaz.fr>
2024-11-17 13:14:39 -05:00
ChunkyProgrammer 8729f01075 Channel RSS: deprecate author thumbnail, make less requests to youtube 2024-11-17 13:14:39 -05:00
ChunkyProgrammer 6dd89bd401 RSS: return 404 if youtube playlist doesnt exist 2024-11-17 13:14:39 -05:00
ChunkyProgrammer bba1769f4b Use a find instead of an each loop 2024-11-17 13:12:56 -05:00
ChunkyProgrammer 6b0e4e6817 Put temp.delete inside ensure block 2024-11-17 13:12:56 -05:00
ChunkyProgrammer 6abee5de99 Ensure IO is properly closed when importing NewPipe subscriptions 2024-11-17 13:12:56 -05:00
Samantaz Fox 9892604758 Prepare for next release 2024-11-10 21:40:32 +01:00
Samantaz Fox 5d2dd40bc3 Release v2.20241110.0 2024-11-10 21:35:03 +01:00
Samantaz Fox 699d53ad41 Update shard.yml metadata (#5066)
Changes are mostly based off of the Crystal compiler's own shard.yml

Remember to bump the version attribute when creating a release!!!
2024-11-10 21:03:13 +01:00
Samantaz Fox 3ac8978e96 VideoProxy: Handle 302 redirects in chunked section 2024-11-10 18:15:24 +01:00
Samantaz Fox e7a93fcc18 API: Replace any URL in HLS manifests 2024-11-10 18:13:30 +01:00
Samantaz Fox aa33d9b7ec Videos: Fix missing host parameter on playback URLs when local=true 2024-11-10 18:13:30 +01:00
Samantaz Fox 2150264d84 Update CHANGELOG.md 2024-11-10 18:00:26 +01:00
Samantaz Fox d42561d74a API: Add "sort_by" parameter to channels/shorts endpoint (#5071)
Small follow up to PR 5059

No related issue
2024-11-10 17:50:00 +01:00
Samantaz Fox 7092bb8855 Docker: Install tzdata in Dockerfile (#5070)
Should close 5067
2024-11-10 17:48:18 +01:00
Samantaz Fox d7c35e6e3d Videos: Stop using TVHTML5_SIMPLY_EMBEDDED_PLAYER (#5063)
The age restriction bypass does not work anymore with this client.
See: https://github.com/iv-org/invidious/issues/2189#issuecomment-2437740627

Related to 2189
2024-11-10 17:45:58 +01:00
Samantaz Fox bc86fb8a82 Routing: Deprecate old channel API routes (#5045)
Deprecate the following routes:

* /api/v1/channels/videos/:ucid
* /api/v1/channels/latest/:ucid
* /api/v1/channels/playlists/:ucid
* /api/v1/channels/community/:ucid
* /api/v1/channels/search/:ucid

in favor of:

* /api/v1/channels/:ucid/videos
* /api/v1/channels/:ucid/latest
* /api/v1/channels/:ucid/playlists
* /api/v1/channels/:ucid/community
* /api/v1/channels/:ucid/search

No related issue
2024-11-10 17:44:45 +01:00
Samantaz Fox ec82c2f539 Videos: use WEB client instead of WEB CREATOR (#4984)
Use the WEB client when a potoken is configured, otherwise try with Android
test suite if there is no potoken configured.

This PR reverts some of the changes made in 4928

Related to 4734
2024-11-10 17:41:54 +01:00
Samantaz Fox 4b363e32fa Parsers: Fix parsing live_now and premiere_timestamp (#4934)
This pull request fixes the parsing for the 'live_now' and 'premiere_timestamp'
variables so that they work without the 'microformat' data being present.

Related to 4929
2024-11-10 17:36:49 +01:00
syeopite 7a15318fbc Skip route if resp got closed by before handlers 2024-11-10 05:45:06 +00:00
ChunkyProgrammer 5fa87cc27c Add support for author thumbnails in search api for videos 2024-11-09 22:31:41 -05:00
Brahim Hadriche d2123b4682 Sort channel shorts API 2024-11-09 17:49:06 -05:00
Émilien (perso) 0f8f32bca8 remove explicit usage of WEB 2024-11-09 22:21:09 +01:00
Emilien f3e93ca83d revert back to www.youtube.com when client_config.screen embed 2024-11-09 22:21:09 +01:00
Emilien 82b1506ccc remove usage of WebEmbeddedPlayer 2024-11-09 22:21:09 +01:00
Emilien b9ad9bd723 use WEB when po_token + android test suite when no po_token 2024-11-09 22:21:09 +01:00
syeopite 8bf7e02978 Change authors section to reflect current state 2024-11-09 13:04:10 -08:00
Samantaz Fox 1a49e798c8 Docker: Install tzdata in Dockerfile 2024-11-09 21:52:06 +01:00
syeopite 9d54cf903e Update shard.yml metadata 2024-11-08 15:54:37 -08:00
syeopite 1333fed26c Remove stdlib override for proxy initialization
HTTP Proxy is now initialized in the make_client function
2024-11-08 15:28:12 -08:00
Samantaz Fox b173d4acf2 Update CHANGELOG.md 2024-11-08 23:45:15 +01:00
Samantaz Fox 43d5efd9da Stale bot updates (#5060)
* Prevents PRs from being considered staled
* Double the stale timer for issues
* Prevent discussion issues from being staled

No related issue
2024-11-08 23:42:45 +01:00
Samantaz Fox 1480e0089f Channels: Fix "Youtube API returned error 400" (#5059)
This PR also adds sort option to the channel "shorts" tab.
Thanks to iBicha for the original fix of the "livestreams" tab.

Closes 4029, 5021 and 5029
2024-11-08 23:40:34 +01:00
Samantaz Fox a5fb78bba5 Locales: Add Bulgarian, Welsh and Lombard to the list (#5046)
No related issue
2024-11-08 23:33:36 +01:00
Samantaz Fox 09f5485889 Shards: Update database dependencies (#5034)
No related issue
2024-11-08 23:32:25 +01:00
Samantaz Fox a760b69cb6 Logger: Add color support for different log levels (#4931)
No related issue
2024-11-08 23:28:51 +01:00
Samantaz Fox 4f7a18a630 Fix named arg syntax when passing force_resolve (#4754)
No related issue
2024-11-08 23:27:22 +01:00
Samantaz Fox 42da2547e3 Use make_client instead of calling HTTP::Client (#4709)
No related issue
2024-11-08 23:26:32 +01:00
Émilien (perso) 09ccea1d31 remove usage of TVHTML5_SIMPLY_EMBEDDED_PLAYER 2024-11-08 22:01:23 +01:00
Samantaz Fox 2a19dbb1fe Channels: Use the same structure as in the other ctoken functions
Change explanation, courtesy of iBicha:
The \n is basically a decimal 10, which is 1010 binary. That is a field number
1, and a wire type 2 (length-delimited). Then the $ is a decimal 36, which is
exactly the length of 00000000-0000-0000-0000-000000000000.
So both objects end up being encoded into the same data.
2024-11-08 18:28:58 +01:00
Samantaz Fox 6dd662a5b8 Channels: lockupViewModel is also used in the "playlists" tab 2024-11-08 17:44:36 +01:00
Samantaz Fox 301aeffa78 Channels: Multiple small fixes
Fix the "newest" link not being bold when 'sort_by' uses the default value
Show 60 videos per page, rather than 30
2024-11-08 14:00:35 +01:00
Samantaz Fox d27a5e7fae Channels: Rename ctoken generator functions as requested 2024-11-08 14:00:35 +01:00
Samantaz Fox afc5b27d83 Extractors: Add support for shortsLockupViewModel
The 'shortsLockupViewModel' structure is used in the channel "shorts" tab
2024-11-08 14:00:30 +01:00
Samantaz Fox 1a5047aad9 Extractors: Add support for lockupViewModel
The 'lockupViewModel' structure is used in the channel "podcasts" tab
2024-11-08 14:00:16 +01:00
syeopite ce910b5269 Prevent discussion issues from being staled 2024-11-07 20:45:23 -08:00
syeopite 78f18b257c Double stale timer for issues
Days before staling is increased to 730 days
Days before closing is increased to 60 days
2024-11-07 20:42:19 -08:00
syeopite 3196182d4d Prevent PRs from being considered stale 2024-11-07 20:41:04 -08:00
Samantaz Fox 82248fad02 Channels: Add sort options to shorts 2024-11-07 23:08:36 +01:00
Samantaz Fox cbc546f032 Channels: Add function to generate the new ctoken objects 2024-11-07 23:08:31 +01:00
Samantaz Fox 792d0d5f6d CI: Check Crystal lint only on latest version (#5042)
* CI: Check Crystal lint only on latest version

* Apply suggestion from code review

Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>

---------

Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2024-11-07 13:14:36 +00:00
Émilien (perso) ac6e796c73 checking the status code returned by youtube (#5052)
* checking the status code returned by youtube

* add documentation link

* Update src/invidious/yt_backend/youtube_api.cr

Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>

---------

Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2024-11-07 14:04:43 +01:00
Samantaz Fox 75c5881c55 Locales: Add Bulgarian, Welsh and Lombard to the list 2024-10-31 13:34:51 +01:00
Samantaz Fox 6da18ddc41 Routing: Also remove outdated comment about notification routes 2024-10-31 11:52:09 +01:00
Samantaz Fox cdf93b29e6 Routing: Remove deprecated /api/v1/channels/.../:ucid routes 2024-10-31 11:51:33 +01:00
RadoslavL eed14d08a8 Update src/invidious/jsonify/api_v1/video_json.cr
Co-authored-by: Samantaz Fox <coding@samantaz.fr>
2024-10-31 09:59:06 +02:00
Brahim Hadriche c243d08afb refactor 2024-10-30 13:38:13 -04:00
Samantaz Fox 2e3a7ad044 Update CHANGELOG.md 2024-10-30 17:13:00 +01:00
Samantaz Fox c427c184e2 Captions: Add "Filipino (auto-generated)" to the list of languages (#4995)
I encountered a wild
[warn] i18n: Missing translation key "Filipino (auto-generated)"
while browsing videos on the test instance.

No related issue.
2024-10-30 17:07:09 +01:00
Samantaz Fox 59acf23c0c Makefile: Add MT option to enable the 'preview_mt' flag (#4993)
This PR add an MT option to the Makefile. When make is invoked with 'MT=1',
the 'preview_mt' flag is passed to the Crystal compiler.

It doesn't mean that invidious fully supports multi-threading, but at least
it provides an easy way for trying that out.

No related issue.
2024-10-30 17:05:21 +01:00
Samantaz Fox 2eeb6a731d SigHelper: Reconnect to signature helper (#4991)
Fijxu have been using it for more than 3 weeks on their instance and
they report that it works really well.

This only works if 'inv_sig_helper' itself crashes and restarts (via systemd
or docker restart policy) but it will not work if 'inv_sig_helper' hangs and
stops responding to invidious (but this is an issue with 'inv_sig_helper',
not Invidious).

Closes issue 4926
2024-10-30 17:02:51 +01:00
Samantaz Fox 0fb67cc090 Player: Fix a bug where menus were hard to open (#4750)
The fix basically enlarges the hoverable area in order to avoid getting the
menu closed if the mouse isn't moved fast enough.

Video of the fix:
https://www.loom.com/share/36494a3653984650aea3eaa2af276a35

Closes issue 4749
2024-10-30 16:59:34 +01:00
Samantaz Fox 9957da28dc Proxy: Use connection pools for images (#4326)
Theoretically this should improve memory usage and performance by quite a bit
as we aren't creating a new HTTP::Client and in a turn a new connection for
every image we request from YouTube.

Closes issue 4009
2024-10-30 13:55:28 +01:00
Samantaz Fox f326bcf8db Add support for using Invidious through a HTTP Proxy (#4270)
Partially addresses issue 301
2024-10-30 13:46:49 +01:00
Samantaz Fox b0c7dd9771 HTML: Replace hidden 'action' input with query parameter
The server side can only handle parameters passed as URL query
parameters and not inside the request body
2024-10-29 22:14:27 +01:00
Samantaz Fox dbdf2ad23a Routes: Simplify actions in watch_ajax 2024-10-29 18:27:53 +01:00
Samantaz Fox dbd96c77e4 Routes: Simplify actions in token_ajax 2024-10-29 18:21:58 +01:00
Samantaz Fox e453a2a682 Routes: Simplify actions in subscription_ajax 2024-10-29 18:16:52 +01:00
Samantaz Fox 7e4b3b182a Routes: Simplify actions in playlist_ajax 2024-10-29 18:09:50 +01:00
Samantaz Fox 711d52d47f Shards: Update database dependencies 2024-10-29 17:26:24 +01:00
Brahim Hadriche ee72809282 [Alternative] Fix for channel live videos 2024-10-26 12:40:31 -04:00
syeopite d8b893e9ad Bump CI matrix (#5015) 2024-10-18 21:33:38 +02:00
Émilien (perso) 70e4eb7f5d Merge pull request #5004 from unixfox/update-mocks
update the mocks with the latest updated data
2024-10-14 00:06:29 +02:00
Emilien Devos 0d03818700 libsqlite3-dev is now missing in the CI env 2024-10-14 00:02:41 +02:00
Emilien Devos e6f52eaf00 update submodule 2024-10-13 23:57:29 +02:00
Emilien Devos 90544e07b6 update the mocks with the latest updated data 2024-10-13 21:18:21 +02:00
Samantaz Fox 952b3625a0 Add "Filipino (auto-generated)" to the list of caption languages 2024-10-10 20:31:22 +02:00
Samantaz Fox f51a3b8d2b Makefile: Add MT option to enable the 'preview_mt' flag 2024-10-09 18:37:08 +02:00
Fijxu 84e4746265 SigHelper: Reconnect to signature helper
Signed-off-by: Fijxu <fijxu@nadeko.net>
2024-10-08 19:09:14 -03:00
Fijxu d2edd4b63f fixup! Logger: Add color support for different log levels 2024-10-08 18:36:50 -03:00
Samantaz Fox a88a723de3 Update CHANGELOG.md 2024-10-08 18:36:41 +02:00
Samantaz Fox d5f5490aee Search: Fix 'youtu.be' URLs in sanitizer (#4894)
Use the proper URL argument when transforming youtu.be URLs to their
youtube.com equivalents.

Thanks to Tuhgy on the fediverse for reporting this!

No related issue
2024-10-08 18:03:56 +02:00
Samantaz Fox 82d797b74e Ameba: Disable Style/RedundantNext rule (#4888)
No related issue
2024-10-08 18:02:47 +02:00
Samantaz Fox 97895a491a Playlists: Fix 'invalid byte sequence' error when subscribing (#4887)
In Crystal, handling multi-byte sequences in UTF-8 requires understanding that
slicing by bytes can lead to invalid sequences if the slicing isn't aligned
with character boundaries. In this case, attempting to slice a string by bytes
can cut through multi-byte UTF-8 sequences, leading to invalid sequences.

To avoid this, strings should be sliced based on characters rather than bytes.

Fixes issue 4886
2024-10-08 18:01:22 +02:00
Samantaz Fox 0ac9367322 Parse more metadata badges for SearchVideos (#4863)
This PR makes it possible to display badges in the search results for third
party Invidious applications (ex: FreeTube)

See also: https://github.com/FreeTubeApp/FreeTube/pull/5590

No related issue
2024-10-08 17:59:35 +02:00
Samantaz Fox d3830f7870 Translations update from Hosted Weblate (#4862) 2024-10-08 17:56:39 +02:00
Samantaz Fox 3cfcc16403 Videos: Convert URL before putting result into cache (#4850)
Closes issue 4837
2024-10-08 17:52:34 +02:00
Samantaz Fox 171c0a0814 HTML: Add error message to "search issues on GitHub" link (#4652)
This PR adds the error message to the "search on Github" link located on
the crash page, so that the search bar is already filled and the issues
filtered when the user opens said link.

As seen with #4584 and other critical problems, duplicate issues end up
unnecessarily flooding the issue reports. While this change won't entirely
stop this behavior, this will help the user to easily identify if the error
they have received has been reported yet and discourage them from creating
a duplicate (hopefully...).

No associated issue was open
2024-10-08 17:51:36 +02:00
Samantaz Fox 82ac9a8609 Preferences: Add option to control preloading of video data (#4122)
This PR adds a configuration option to control the preloading of video data on
page load with the HTML5 'preload'[1] attribute on the `<video>` element.

The option is enabled by default, meaning that the `preload` attribute's value
will be 'auto'. If users want to prevent preloading of video data, they
can disable the option, which will set the attribute value to 'none'.

[1](https://www.w3schools.com/tags/att_video_preload.asp)

Closes issue 4110
2024-10-08 17:38:06 +02:00
Samantaz Fox 7c79ee7cc2 Performance: Improve speed of automatic instance redirection (#4193)
The automatic instance redirection implemented in #1940 fetches a new list of
instances each time someone queries the /redirect endpoint. This is extremely
inefficient...

This PR optimizes all that into a background job that only fetches a single
list every 30 minutes. This should performance quite a bit.

No related issue was opened.
2024-10-08 17:31:20 +02:00
ChunkyProgrammer f6e09250cd Use "LIVE" instead of "LIVE NOW" when parsing the live_now video badge
Co-authored-by: Samantaz Fox <coding@samantaz.fr>
2024-10-07 11:30:33 -04:00
Hosted Weblate 0fecde6917 Update Norwegian Bokmål translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Petter Reinholdtsen <pere-weblate@hungry.com>
2024-10-06 16:16:37 +02:00
Hosted Weblate 66f5b12ecd Update Serbian (Cyrillic script) translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
2024-10-06 16:16:37 +02:00
Hosted Weblate 77f57714ea Update Chinese (Simplified Han script) translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
2024-10-06 16:16:37 +02:00
Hosted Weblate d9afe38504 Update Chinese (Traditional Han script) translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jeff Huang <s8321414@gmail.com>
2024-10-06 16:16:36 +02:00
Hosted Weblate 3af11d800c Update English (United States) translation
Co-authored-by: Dick Groskamp <dikgro@yahoo.co.uk>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-10-06 16:16:36 +02:00
Hosted Weblate d72531d843 Update Korean translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: xrfmkrh <rF3nMd7sRKezjF2vcEQo@protonmail.com>
2024-10-06 16:16:35 +02:00
Hosted Weblate ecfcad8d1c Update Albanian translation
Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-10-06 16:16:35 +02:00
Hosted Weblate d63b15dc1c Update Serbian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
2024-10-06 16:16:34 +02:00
Hosted Weblate edb69d601e Update Persian translation
Co-authored-by: Danial Behzadi <dani.behzi@ubuntu.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-10-06 16:16:34 +02:00
Hosted Weblate 51562f4b24 Update Swedish translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
2024-10-06 16:16:34 +02:00
Hosted Weblate 76f045b8d7 Update French translation
Co-authored-by: ABCraft19 <lesenfantsbergaoui@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-10-06 16:16:33 +02:00
Hosted Weblate 46eaa0f9b8 Update Spanish translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
2024-10-06 16:16:33 +02:00
Hosted Weblate 56bccaba77 Update Dutch translation
Update Dutch translation

Update Dutch translation

Co-authored-by: Dick Groskamp <dikgro@yahoo.co.uk>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-10-06 16:16:33 +02:00
Hosted Weblate 4e8d03221b Update Interlingua translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Software In Interlingua <softinterlingua@gmail.com>
2024-10-06 16:16:32 +02:00
Hosted Weblate 5d46eba6f2 Update Arabic translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rex_sa <rex.sa@pm.me>
2024-10-06 16:16:32 +02:00
Hosted Weblate d3eedab545 Update Italian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
2024-10-06 16:16:31 +02:00
Hosted Weblate cd43997bba Update Polish translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Matthaiks <kitynska@gmail.com>
2024-10-06 16:16:31 +02:00
Hosted Weblate fead7603e6 Update Croatian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
2024-10-06 16:16:31 +02:00
Hosted Weblate 486b5b363c Update Icelandic translation
Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
2024-10-06 16:16:30 +02:00
Hosted Weblate 2b3619e489 Update Portuguese translation
Co-authored-by: Henrique Oliveira <ho.henrique@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-10-06 16:16:30 +02:00
Hosted Weblate 7a95cb43ef Update Czech translation
Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-10-06 16:16:29 +02:00
Hosted Weblate e09a7de5c7 Update Japanese translation
Update Japanese translation

Co-authored-by: Himmel <Himmel@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: maboroshin <maboroshin@users.noreply.hosted.weblate.org>
2024-10-06 16:16:29 +02:00
Hosted Weblate 79d1aaff1a Update Ukrainian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
2024-10-06 16:16:29 +02:00
Hosted Weblate d7a5ca8fff Update Russian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: lotigara <lotigara@yandex.ru>
2024-10-06 16:16:28 +02:00
Hosted Weblate 542d4fe553 Update Greek translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: hompre <46e989cc@opayq.com>
2024-10-06 16:16:28 +02:00
Hosted Weblate 33df8249f1 Update German translation
Update German translation

Co-authored-by: Ettore Atalan <atalanttore@googlemail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lenny Angst <lenny@familie-angst.ch>
2024-10-06 16:16:27 +02:00
Hosted Weblate 4e7fd7ac3b Update Portuguese (Brazil) translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jose Delvani <jsdelvani@users.noreply.hosted.weblate.org>
2024-10-06 16:16:27 +02:00
Hosted Weblate 8912e2448d Update Turkish translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
2024-10-06 16:16:26 +02:00
ChunkyProgrammer 98f1e4170b Rename CCommons to ClosedCaptions 2024-09-30 22:02:57 -04:00
ChunkyProgrammer b384133dc9 Fix tests 2024-09-30 22:02:57 -04:00
ChunkyProgrammer 1961fc3b11 switch to enum flag instead of adding lots of properties to SearchVideo 2024-09-30 22:02:57 -04:00
ChunkyProgrammer 2e649363d2 Parse more metadata badges for SearchVideos 2024-09-30 22:02:57 -04:00
TheFrenchGhosty 53e8a5d62d Remove myself from CODEOWNERS on the config file (#4942) 2024-09-28 23:54:52 +02:00
Fijxu 17b525f2a6 Logger: colorize_logs false by default 2024-09-27 18:08:21 -03:00
absidue b2a83991d1 Fix parsing live_now and premiere_timestamp 2024-09-20 18:46:00 +02:00
Fijxu d77afdcf00 Logger: Make colorize_logs true by default 2024-09-20 00:32:27 -03:00
Fijxu f8ec312328 Logger: Add color support for different log levels 2024-09-19 21:35:52 -03:00
Émilien (perso) a021b93063 Update latest version WEB_CREATOR + fix comment web embed (#4930)
* Update to latest version WEB_CREATOR

* fix comment about using web embed as a fallback
2024-09-20 00:05:41 +00:00
Émilien (perso) d9df90b5e3 use WEB_CREATOR when po_token with WEB_EMBED as a fallback (#4928)
* use WEB_CREATOR when po_token with WEB_EMBEDDED_PLAYER as a fallback

* remove unrelated comment

Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>

---------

Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2024-09-20 00:19:13 +02:00
Emilien Devos cec3cfba77 Revert "use web screen embed for fixing potoken functionality (#4923)"
This reverts commit de918b9234.
The code doesn't work as expected. Reverting
2024-09-17 00:22:06 +02:00
Émilien (perso) de918b9234 use web screen embed for fixing potoken functionality (#4923)
* use web screen embed for fixing potoken functionality

* use web screen embed only for getting streamingData + disable tv screen on po_token
2024-09-16 23:42:43 +02:00
Samantaz Fox 5e899d73a9 Search: Fix for youtu.be URL in sanitizer 2024-09-02 18:14:57 +02:00
Thomas Lange f247b2f862 Update config/config.example.yml
Accept suggested change from @SamantazFox.

Co-authored-by: Samantaz Fox <coding@samantaz.fr>
2024-08-30 19:52:33 +02:00
Dmitry Sandalov bd34659ff6 Fix 'invalid byte sequence' error when subscribing to playlists ([] accessor with range) 2024-08-29 22:47:59 +02:00
syeopite f1baeef4bc Ameba: Disable Style/RedundantNext rule 2024-08-28 23:49:10 -07:00
Dmitry Sandalov 157c4c3e98 Fix 'invalid byte sequence' error when subscribing to playlists 2024-08-28 23:54:31 +02:00
⛧-440729 [sophie] 3850739d7f apply review suggestions 2024-08-27 10:48:34 +02:00
Samantaz Fox 4782a67038 Release v2.20240825.2 2024-08-26 22:52:50 +02:00
Samantaz Fox 5baaedfa39 CI: Fix docker container tags (#4883)
Closes issue 4880
2024-08-26 22:48:14 +02:00
Samantaz Fox 9d91ac3b88 Use snake case for all variables 2024-08-26 20:17:45 +00:00
Samantaz Fox 4f066e880c CI: Fix docker container tags 2024-08-26 21:55:43 +02:00
Sophie Tauchert 5d0149844f Batch user notifications together 2024-08-26 21:24:27 +02:00
Samantaz Fox 3e17d04875 Release v2.20240825.1 2024-08-25 22:30:46 +02:00
syeopite cec905e95e Allow manual trigger of release-container build (#4877) 2024-08-25 19:55:52 +00:00
Samantaz Fox 80958aa0d8 Release v2.20240825 2024-08-25 21:25:48 +02:00
syeopite 75b68618ab Remove useless proc usage in images.cr 2024-08-24 19:47:42 -07:00
syeopite 003c6f81dc Preserve connection close header of get_storyboard 2024-08-24 19:47:42 -07:00
syeopite 4bc77b81bf Move YTIMG_POOLS to connection_pool.cr 2024-08-24 19:47:40 -07:00
syeopite 06e1a508e8 Fix headers not being added in image requests
Regression from #2364
2024-08-24 19:45:52 -07:00
syeopite 52bc9aa328 Refactor duplicate logic in image routes 2024-08-24 19:45:52 -07:00
syeopite 480e073fa9 Use HTTP pools for image requests to YouTube 2024-08-24 19:45:52 -07:00
syeopite 6e39b9b303 make_client: add YouTube headers on *.youtube.com 2024-08-24 19:41:39 -07:00
syeopite 46c58bd84c Pool: Use force_resolve in fallback new client 2024-08-24 19:41:23 -07:00
syeopite 7521902e88 Ensure IP family is always used when force_resolve 2024-08-24 19:41:22 -07:00
syeopite bd48af825c Search API: Fix named arg syntax to make_client 2024-08-24 19:34:09 -07:00
syeopite ee89db49ba Typo
Co-authored-by: Samantaz Fox <coding@samantaz.fr>
2024-08-24 19:34:09 -07:00
syeopite 3af6681869 Fix typo in argument to make_client
Co-authored-by: ChunkyProgrammer <78101139+ChunkyProgrammer@users.noreply.github.com>
2024-08-24 19:34:09 -07:00
syeopite 1124dd645d Use make_client instead of calling HTTP::Client
Using `make_client` to create `HTTP::Client`, allows for a simple way to
easily add logic to all `HTTP::Client` initialized within Invidious.
2024-08-24 19:34:09 -07:00
Samantaz Fox c5fdd9ea65 HTML: Sort playlists alphabetically in watch page drop down (#4853)
Closes issue 4708
2024-08-24 20:50:46 +02:00
Samantaz Fox 2876ee0f9f HTML: Fix XSS vulnerability in description/comments (#4852)
Before this PR, the comment/description content was not HTML escaped when 'parse_description()'
was called with a JSON object lacking the "commandRuns" entry.

Closes issue 4727
2024-08-24 20:50:05 +02:00
Samantaz Fox 0699e5fc27 YtAPI: Bump client versions (#4849)
This might help reducing the amount of playback errors.

No related issue
2024-08-24 20:47:01 +02:00
Samantaz Fox 15669acccf SigHelper: Fix inverted time comparison in 'check_update' (#4845)
Closes issue 4840
2024-08-24 20:44:52 +02:00
Samantaz Fox cd2daf4adb Storyboards: Various fixes and code cleaning (#4153)
Closes issue 3441
2024-08-24 20:43:05 +02:00
syeopite ccecc6d318 Fix lint errors introduced in #4146 and #4295 (#4876)
* Ameba: Fix Naming/VariableNames

Introduced in #4295

* Ameba: Fix Naming/PredicateName

Introduced in #4146
2024-08-24 18:11:11 +00:00
Samantaz Fox 3c6a662aaf Search: Add support for Youtube URLs (#4146)
Closes issue 3300
2024-08-24 19:44:59 +02:00
Samantaz Fox 9e55799269 Channel: Render age restricted channels (#4295)
This PR:
 * gets thumbnail and channel name from the initial request
 * gets videos, shorts and streams via autogenerated channel playlists

Test Url: /channel/UCbfnHqxXs_K3kvaH-WlNlig

Closes issue 3513
2024-08-24 19:43:59 +02:00
Samantaz Fox da70c9b7b0 Ameba: Miscellaneous fixes (#4807)
End of a series of PRs meant to improve code quality.

Related to issue 2231
2024-08-24 19:42:10 +02:00
Samantaz Fox 828da3c6ce API: Proxy formatStreams URLs too (#4859)
The /api/v1/videos endpoint does not proxy the formatStreams URLs when
'local=true' is passed, whereas the adaptiveFormats URLs are correctly proxied.

The Web UI does proxy when clicking "Download" with 'fmt=18' for example, so
this is probably an oversight. This PR aims to fix that.

No related issue
2024-08-24 19:39:36 +02:00
Samantaz Fox febf18cbf7 UI: Add search button to search bar (#4706)
Closes issue 529
2024-08-24 19:38:48 +02:00
Samantaz Fox b2133c6b2c Videos: Convert URL before putting result into cache 2024-08-24 18:01:56 +02:00
Samantaz Fox 21ab5dc668 Storyboard: Revert cue timing "fix" 2024-08-22 00:29:15 +02:00
Samantaz Fox b200ebfb6b CSS: Remove extra space in default.css 2024-08-21 20:23:45 +00:00
syeopite ecbea0b67b Ameba: Fix Lint/ShadowingOuterLocalVar 2024-08-21 02:43:26 -07:00
syeopite d1cd790388 Ameba: Fix Lint/RedundantStringCoercion 2024-08-21 02:43:26 -07:00
syeopite f66068976e Ameba: Fix Naming/PredicateName 2024-08-21 02:43:08 -07:00
syeopite 22b35c453e Ameba: Fix Style/WhileTrue 2024-08-21 02:43:08 -07:00
Colin Leroy-Mira c606465708 Proxify formatStreams URLs too 2024-08-19 09:37:24 +02:00
Samantaz Fox 85deea5aca Search: Change smart search inhibitor to a backslash 2024-08-17 19:22:40 +02:00
Samantaz Fox 78c5ba93c7 Misc: Clean some code in UrlSanitizer 2024-08-17 19:22:40 +02:00
Samantaz Fox 31a80420ec Search: Add URL search inhibition logic 2024-08-17 19:22:40 +02:00
Samantaz Fox 4c0b5c314d Search: Add support for youtu.be and youtube.com URLs 2024-08-17 19:22:40 +02:00
Samantaz Fox eb0f651812 Add a youtube URL sanitizer 2024-08-17 19:22:40 +02:00
Samantaz Fox 764965c441 Storyboards: Fix lint error 2024-08-17 12:20:53 +02:00
RadoslavL b526f48120 Changed Unix time to Rfc3339 time and removed NaN message 2024-08-16 23:57:49 +03:00
RadoslavL e8cd631b2d Formatting 2024-08-16 14:13:05 +03:00
RadoslavL 69ff6def5f Removed useless variable 2024-08-16 14:11:28 +03:00
RadoslavL 26dc9dc99c Solution 2024-08-16 14:08:04 +03:00
RadoslavL 2d6b46c926 Fixed a really easy mistake 2024-08-16 14:05:13 +03:00
RadoslavL cab02d4959 Corrected usage of publishedText variable throughout the code 2024-08-16 13:54:27 +03:00
Samantaz Fox b795bdf2a4 HTML: Sort playlists alphabetically in watch page drop down 2024-08-16 12:10:22 +02:00
Samantaz Fox 5b05f3bd14 Storyboards: Workarounds for videojs-vtt-thumbnails
The workarounds are as follow:
  * Unescape HTML entities
  * Always use 0:00:00.000 for cue start/end
2024-08-16 11:36:01 +02:00
Samantaz Fox a335bc0814 Storyboards: Fix some small logic mistakes 2024-08-16 10:05:49 +02:00
Samantaz Fox 7b50388eaf Storyboards: Fix broken first storyboard 2024-08-16 10:05:48 +02:00
Samantaz Fox da3d58f03c Storyboards: Cleanup and document code 2024-08-16 10:05:47 +02:00
Samantaz Fox 8327862697 Storyboards: Use replace the NamedTuple by a struct 2024-08-16 10:04:40 +02:00
Samantaz Fox 6878822c4d Storyboards: Move parser to its own file 2024-08-16 10:02:52 +02:00
Samantaz Fox 0b28054f8a videos: Fix XSS vulnerability in description/comments
Patch provided by e-mail, thanks to an anonymous user whose cats are named
Yoshi and Yasuo.

Comment is mine
2024-08-15 18:26:17 +02:00
Samantaz Fox cc33d3f074 YtAPI: Also update User-Agent string 2024-08-15 18:14:29 +02:00
Samantaz Fox acbb625866 YtAPI: Update clients to latest version 2024-08-15 12:57:36 +02:00
Samantaz Fox 466bfbb306 SigHelper: Fix inverted time comparison in 'check_update' 2024-08-14 21:43:37 +02:00
ChunkyProgrammer e31053e812 Use dig to get properties
Co-authored-by: Samantaz Fox <coding@samantaz.fr>
2024-08-13 15:09:16 -04:00
ChunkyProgrammer 96ade642fa Channel: Render age restricted channels 2024-08-13 15:09:16 -04:00
Samantaz Fox e319c35f09 Videos: use intermediary variable when using CONFIG.po_token 2024-08-13 20:56:09 +02:00
Samantaz Fox 2d18ff1f80 Add ability to set po_token and visitordata ID (#4789)
This PR adds two new config option, to pass a PO token (config 'po_token') and
a visitor ID (config 'visitor_data') to Youtube. These two strings are required
to play videos using the WEB client.

Warning: These strings gives much more identifiable information to Google!

If the po_token setting is filled in, then the WEB client is used. If not, the
Android client is used. TvHtml5ScreenEmbed will still be used as a fallback.

Script for generating po_token and visitor_data:
https://github.com/iv-org/youtube-trusted-session-generator

Helps with issue 4734
2024-08-13 20:35:43 +02:00
Samantaz Fox 2d7869b48b Add support for an external signature server (#4772)
This PR adds support for inv_sig_helper, which offloads the player fetching,
function extraction and signature parsing, which in turn allows to use the
web client to watch videos.

When the new config option "signature_server" is not set, the logic for the
external signature server is not enabled and invidious behaves like before.

This PR also updates the crystal overrides because the stdlib changed quite
a while ago (See issue 11049 at crystal-lang/crystal) and those were required
to properly use TCP/unix sockets.

Closes issue 4649
2024-08-13 20:26:59 +02:00
Samantaz Fox 88b9f17388 Ameba: Fix Naming/VariableNames (#4790)
Related to issue 2231
2024-08-13 20:26:15 +02:00
Samantaz Fox 7a7d1137d6 Translations update from Hosted Weblate (#4659) 2024-08-13 20:25:52 +02:00
Hosted Weblate 3add83c49e Update Norwegian Bokmål translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Petter Reinholdtsen <pere-weblate@hungry.com>
2024-08-13 19:51:36 +02:00
Hosted Weblate a8825a27d4 Update Serbian (cyrillic) translation
Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Bulgarian translation

Update German translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jose Delvani <delvani.eletricista@gmail.com>
Co-authored-by: Least Significant Bite <leastsignificantbite@proton.me>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Unacceptium <unacceptium@proton.me>
Co-authored-by: hiatsu0 <hietsu@gmail.com>
2024-08-13 19:51:36 +02:00
Hosted Weblate bedcf97fbf Update Korean translation
Co-authored-by: Conflict3618 <won_ennui_0i@icloud.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-08-13 19:51:36 +02:00
Hosted Weblate 89c17f2127 Update Serbian (cyrillic) translation
Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Bulgarian translation

Update German translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jose Delvani <delvani.eletricista@gmail.com>
Co-authored-by: Least Significant Bite <leastsignificantbite@proton.me>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Unacceptium <unacceptium@proton.me>
Co-authored-by: hiatsu0 <hietsu@gmail.com>
2024-08-13 19:51:36 +02:00
Hosted Weblate 905fed66d1 Update Finnish translation
Update Finnish translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Bulgarian translation

Update German translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jiri Grönroos <jiri.gronroos@iki.fi>
Co-authored-by: Jose Delvani <delvani.eletricista@gmail.com>
Co-authored-by: Least Significant Bite <leastsignificantbite@proton.me>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Tuomas Hietala <tuomas.hietala@iki.fi>
Co-authored-by: Unacceptium <unacceptium@proton.me>
Co-authored-by: hiatsu0 <hietsu@gmail.com>
2024-08-13 19:51:36 +02:00
Hosted Weblate f837d99eab Update Persian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Wireless Acquired <clcsdtxsl@proton.me>
2024-08-13 19:51:36 +02:00
Hosted Weblate 86ec5ad6e0 Update Swedish translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
2024-08-13 19:51:36 +02:00
Hosted Weblate ae93146f47 Update French translation
Update French translation

Update French translation

Update French translation

Co-authored-by: ABCraft19 <lesenfantsbergaoui@gmail.com>
Co-authored-by: Duc-Thomas <duckiduc.dev@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Patricio Carrau <duckycb@proton.me>
Co-authored-by: Samantaz Fox <translator-weblate@samantaz.fr>
2024-08-13 19:51:36 +02:00
Hosted Weblate e538410262 Update Dutch translation
Update Dutch translation

Co-authored-by: Dick Groskamp <dikgro@yahoo.co.uk>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Martijn Westerink <martijn.westerink.86@gmail.com>
2024-08-13 19:51:36 +02:00
Hosted Weblate 8ad19f06ee Update Serbian (cyrillic) translation
Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Bulgarian translation

Update German translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jose Delvani <delvani.eletricista@gmail.com>
Co-authored-by: Least Significant Bite <leastsignificantbite@proton.me>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Unacceptium <unacceptium@proton.me>
Co-authored-by: hiatsu0 <hietsu@gmail.com>
2024-08-13 19:51:36 +02:00
Hosted Weblate 366732b4fd Update Serbian (cyrillic) translation
Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Bulgarian translation

Update German translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jose Delvani <delvani.eletricista@gmail.com>
Co-authored-by: Least Significant Bite <leastsignificantbite@proton.me>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Unacceptium <unacceptium@proton.me>
Co-authored-by: hiatsu0 <hietsu@gmail.com>
2024-08-13 19:51:36 +02:00
Hosted Weblate 32ea9cfe16 Update Icelandic translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
2024-08-13 19:51:36 +02:00
Hosted Weblate 53a60bf7bd Update Portuguese translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Sergio Marques <so.boston.android@gmail.com>
2024-08-13 19:51:36 +02:00
Hosted Weblate 2d485b18a4 Update Welsh translation
Add Welsh translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: newidyn <grugallt@protonmail.ch>
2024-08-13 19:51:36 +02:00
Hosted Weblate 5cb1688c78 Update Catalan translation
Co-authored-by: Daniel <trikaphundo@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-08-13 19:51:36 +02:00
Hosted Weblate 456b00a699 Update Ukrainian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
2024-08-13 19:51:36 +02:00
Hosted Weblate 84aded85c5 Update Serbian (cyrillic) translation
Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Bulgarian translation

Update German translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jose Delvani <delvani.eletricista@gmail.com>
Co-authored-by: Least Significant Bite <leastsignificantbite@proton.me>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Unacceptium <unacceptium@proton.me>
Co-authored-by: hiatsu0 <hietsu@gmail.com>
2024-08-13 19:51:36 +02:00
Hosted Weblate e99b591855 Update Russian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Stepan <iam@amphetom.fun>
2024-08-13 19:51:36 +02:00
Hosted Weblate 7cf7cce0b2 Update Greek translation
Update Greek translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Open Contribution <open.alat4@slmail.me>
Co-authored-by: mpt.c <open.alat4@slmail.me>
2024-08-13 19:51:36 +02:00
Hosted Weblate f842033eb5 Update Serbian (cyrillic) translation
Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Bulgarian translation

Update German translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jose Delvani <delvani.eletricista@gmail.com>
Co-authored-by: Least Significant Bite <leastsignificantbite@proton.me>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Unacceptium <unacceptium@proton.me>
Co-authored-by: hiatsu0 <hietsu@gmail.com>
2024-08-13 19:51:36 +02:00
Hosted Weblate c9fb19431d Update Serbian (cyrillic) translation
Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Update Bulgarian translation

Update German translation

Update Serbian (cyrillic) translation

Update Serbian translation

Update Finnish translation

Update Italian translation

Update Hungarian translation

Update Portuguese (Brazil) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jose Delvani <delvani.eletricista@gmail.com>
Co-authored-by: Least Significant Bite <leastsignificantbite@proton.me>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Co-authored-by: Unacceptium <unacceptium@proton.me>
Co-authored-by: hiatsu0 <hietsu@gmail.com>
2024-08-13 19:51:36 +02:00
Emilien Devos 4b8bfe1201 use docker compose instead of docker-compose for CI 2024-08-13 15:02:02 +02:00
Emilien Devos e6c39f9e3a add pot= parameter now required by youtube 2024-08-13 14:37:35 +02:00
Samantaz Fox 5e38ef59da Ameba: Fix Lint/UselessAssign (#4795)
Related to issue 2231
2024-08-11 13:38:29 +02:00
Samantaz Fox 80ffc442f2 HTML: Add rel="noreferrer noopener" to external links (#4667)
Note: Does not add rel="noreferrer noopener" to:
 * links in channel description
 * links in video descriptions
 * links in video comments

Related to issue 4267
2024-08-11 13:35:57 +02:00
Samantaz Fox 9bf754ed4f Remove unused methods in Invidious::LogHandler (#4812)
Closes issue 4791
2024-08-11 11:45:56 +02:00
Samantaz Fox fa6c5158c5 Ameba: Fix Lint/NotNilAfterNoBang (#4796)
Related to issue 2231
2024-08-11 11:45:05 +02:00
Samantaz Fox b45310c7d4 Ameba: Fix unused argument Lint warnings (#4805)
Related to issue 2231
2024-08-11 11:43:56 +02:00
Samantaz Fox eb2dfe0ab1 Ameba: i18next.cr fixes (#4806)
Related to issue 2231
2024-08-11 11:41:36 +02:00
Samantaz Fox cc36a82933 SigHelper: Fix some logic errors raised during code review 2024-08-07 23:26:10 +02:00
Samantaz Fox 7798faf234 SigHelper: Make signature server optional and configurable 2024-08-07 23:25:35 +02:00
Samantaz Fox ec1bb5db87 SigHelper: Add support for PLAYER_UPDATE_TIMESTAMP opcode 2024-08-07 23:25:32 +02:00
Samantaz Fox 3b7e45b7bc SigHelper: Small fixes + suggestions from code review 2024-08-07 23:12:38 +02:00
Krystof Pistek 5f590dda80 Carry over audio-only mode in playlist links 2024-08-07 20:58:08 +02:00
syeopite e098c27a45 Remove unused methods in Invidious::LogHandler 2024-07-28 16:44:30 -07:00
syeopite 90e94d4e6c Merge pull request #4792 from syeopite/disable-ameba-rules
Ameba: Disable rules
2024-07-27 02:31:31 +00:00
syeopite 6506b8dbfc Ameba: Fix Naming/PredicateName 2024-07-25 20:08:26 -07:00
Samantaz Fox 61d75050e4 SigHelper: Use 'URI.parse' instead of 'URI.new'
Co-authored-by: Brahim Hadriche <brahim.hadriche@gmail.com>
2024-07-25 22:13:08 +02:00
Samantaz Fox 10e5788c21 Videos: Send player sts when required 2024-07-25 22:13:08 +02:00
Samantaz Fox b509aa91d5 SigHelper: Fix many issues 2024-07-25 22:13:08 +02:00
Samantaz Fox ec8b7916fa Videos: Make use of the video decoding 2024-07-25 22:13:08 +02:00
Samantaz Fox 56a7488161 Helpers: Add inv_sig_helper client 2024-07-25 22:13:08 +02:00
Samantaz Fox a845752fff Jobs: Remove the signature function update job 2024-07-25 22:13:08 +02:00
Samantaz Fox 63a729998b Misc: Sync crystal overrides with current stdlib 2024-07-25 22:13:07 +02:00
syeopite 205f988491 Ameba: Fix Naming/MethodNames 2024-07-24 20:04:44 -07:00
syeopite 0db3b830b7 Ameba: Fix Lint/HashDuplicatedKey 2024-07-24 20:03:41 -07:00
syeopite c8fb75e6fd Ameba: Fix Lint/UnusedBlockArgument 2024-07-24 19:59:20 -07:00
syeopite 636a6d0be2 Ameba: Fix Lint/UnusedArgument 2024-07-24 19:57:54 -07:00
syeopite 3415507e4a Ameba: undo Lint/NotNilAfterNoBang in signatures.cr
File is set to be removed with #4772
2024-07-24 19:48:34 -07:00
Emilien Devos 53223f99b0 Add ability to set po_token and visitordata ID 2024-07-24 19:28:47 +02:00
Samantaz Fox 325561e755 Channel: parse subscriber count and channel banner (#4785)
This PR adds support for parsing the newer channel header format
(banner + subscription parsing)

Before this change:
* 0 subscribers
* No banner image

After this change:
* Example with Mr Breast channel: 299M
* Image banner is visible

Closes issue 4783
2024-07-21 17:24:09 +02:00
Samantaz Fox 09bf09befe Player: Fix playback position of already watched videos (#4731)
Trying to watch an already watched video will make the video start 15 seconds
before the end. This is not very comfortable when listening to music or
watching/listening playlists over and over.

This can be easily tested on any instance with the "Save playback position"
enabled in the Preferences.

Closes issue 3976
2024-07-21 17:24:06 +02:00
Samantaz Fox 7fdbda612f Videos: Fix genre url being unusable (#4717)
Closes issue 4700
2024-07-21 17:24:03 +02:00
Samantaz Fox 4f60feee17 API: Fix out of bound error on empty playlists (#4696)
Before this PR, Invidious assumed that every playlist had at least one video.
When a playlist had no videos, Invidious was throwing an "Index out of bounds"
exception.

The following API endpoints were impacted:
* api/v1/playlists/:plid
* api/v1/auth/playlists/:plid

Fixes issue 4679
2024-07-21 17:24:01 +02:00
Samantaz Fox 733bd27a5c Handle playlists cataloged as Podcast (#4695)
Videos of a playlist cataloged as podcast are called "episodes" therefore
Invidious was not able to find video in the text value inside the stats array.

Test case: "/playlist?list=PLDu-Eh5lUs1a4irCbnxMIB6FrUMaTXgVF"

Fixes issue 4688
2024-07-21 17:23:58 +02:00
Samantaz Fox 1ff0775f4b API: Fix duplicated query parameters in proxied video URLs (#4587)
This pull request fixes that bug that was causing the query parameters to get
doubled in the streaming URLs when '?local=true' is passed to the
'/api/v1/videos/{id}' API endpoint.

Before: host/path?parameters?parameters
After: host/path?parameters

No associated open issue
2024-07-21 17:23:53 +02:00
Samantaz Fox e62d4db752 API: Return actual stream height, width and fps (#4586)
At the moment Invidious will return hardcoded data for the 'size',
'qualityLabel' and 'fps' fields for streams, when such hardcoded data is
available, otherwise it just omits those fields from the response (e.g. with
the AV1 formats). Those issues are especially noticable when Invidious claims
that 50fps streams have 60fps and when it claims that the dimensions for a
vertical video are landscape. The DASH manifests that Invidious generates
already use the correct information.

This pull request corrects that issue by returning the information that
YouTube provides instead of hardcoded values and also fixes the long
standing bug of Invidious claiming that audio streams have 30 fps.

Here are two test cases:
50/25/13fps: https://youtu.be/GbXYZwUigCM (/api/v1/videos/GbXYZwUigCM)
vertical video: https://youtu.be/hxQwWEOOyU8 (/api/v1/videos/hxQwWEOOyU8)

Originally these problems were going to be solved by the complete refactor
of stream handling in 3620, but as that pull request got closed by the stale
bot over a month ago and has such a massive scope that it would require a
massive amount of work to complete it, I decided to open this pull request
that takes a less radical approach of just fixing bugs instead of a full
on refactoring.

FreeTube generates it's own DASH manifests instead of using Invidious' one,
so that it can support multiple audio tracks and HDR. Unfortunately due to
the missing and inaccurate information in the API responses, FreeTube has
to request the DASH manifest from Invidious to extract the height, width and
fps. With this pull request FreeTube could rely just on the API response,
saving that extra request to the Invidious instance. It would also make it
possible for FreeTube to use the vp9 streams with Invidious, which would
reduce the load on the video proxies.

Closes issue 4131
2024-07-21 17:23:50 +02:00
Samantaz Fox 8b1da2001e Preferences: Fix handling of modified source code URL(#4437)
Before this PR, setting the modified code repo URL through the preferences
page in Invidious was broken:

* the HTML input tag for this field had invalid type "input"
  (though browser falls back on text input)

* the URL was used to set the "checked" property and not as a plain value,
  which makes no sense for a text-based input (and resulted in a blank field)

* when the submitted field is empty, the retrieved value was an empty 'String'
  instead of 'nil', causing the "modified source code URL" to be an empty
  'href' link which just pointed to the current page

No associated open issue
2024-07-21 17:23:48 +02:00
Samantaz Fox 5a12005b48 API: Fix URL for vtt subtitles (#4221)
For 'fmt=vtt' to work, the 'fmt' parameter needs to be replaced
in the original caption api URL.

No associated open issue
2024-07-21 17:23:44 +02:00
syeopite 8575794bad Exclude spec/parsers_helper from Lint/SpecFilename
False positive
2024-07-17 12:52:13 -07:00
syeopite fad0a4f52d Ameba: Fix Lint/UselessAssign 2024-07-17 12:39:40 -07:00
syeopite fa50e0abf4 Simplify last_node retrieval
Co-authored-by: Samantaz Fox <coding@samantaz.fr>
2024-07-17 12:21:48 -07:00
syeopite 76ab51e219 Ameba: Disable Naming/BlockParameterName 2024-07-17 12:17:05 -07:00
syeopite 8258062ec5 Ameba: Fix Lint/NotNilAfterNoBang 2024-07-15 17:36:00 -07:00
syeopite 8d9723d43c Disable Naming/AccessorMethodName rule
Most cases of Naming/AccessorMethodName are false positives
2024-07-11 21:15:45 -07:00
syeopite 8a90add310 Ameba: Fix Naming/VariableNames
Fix Naming/VariableNames in comment renderer

Fix Naming/VariableNames in helpers/utils

Fix Naming/VariableNames in api/v1/misc.cr
2024-07-11 20:56:28 -07:00
syeopite c45e710845 Disable Documentation/DocumentationAdmonition rule 2024-07-11 20:47:24 -07:00
syeopite 593257a750 Fix typo 2024-07-11 20:45:27 -07:00
syeopite b2f5b1eb68 Add logic to fetch transcripts from label
Although available this method should be discouraged as it requires
an extra request to YouTube to get caption data in order to
map label -> language code and auto-generated status, which are needed
to fetch transcripts.
2024-07-11 09:37:18 -07:00
syeopite 7693f61e44 Add API endpoint to fetch YouTube transcripts 2024-07-11 09:37:17 -07:00
Samantaz Fox bad92093bf Channels: Add sort options to streams (#4224) 2024-07-10 22:28:22 +02:00
Samantaz Fox 436a61e3bb API: Fix error code for disabled popular endpoint (#4296)
When visiting /api/v1/popular and popular endpoint is disabled
Before:

500 {"error":"Closed stream"}

After

403 {"error":"Administrator has disabled this endpoint."}
2024-07-10 22:25:31 +02:00
Samantaz Fox 5e0f55333a Allow embedding videos in local HTML files (#4450)
The current Content Security Policy does not allow to embed videos
inside local HTML files which are viewed in the browser via the file
protocol. This commit adds the file protocol to the allowed frame
ancestors, so that the embedded videos load correctly in local HTML
files.

This behaviour is consistent which how the official YouTube website
allows to embed videos from itself.

Closes issue 4448
2024-07-10 22:24:18 +02:00
Samantaz Fox de61b163a3 CI: Bump Crystal version matrix (#4654) 2024-07-10 22:21:17 +02:00
Samantaz Fox 99c7e9e800 YtAPI: Remove API keys like official clients (#4655)
This PR removes API keys from innertube requests, as the official clients
did it too.
2024-07-10 22:19:51 +02:00
Samantaz Fox e9bab06e90 HTML: Use full URL in the og:image property (#4675)
Some opengraph implementations don't support a URL without the domain
therefore failing to fetch the video thumbnail and channel image.
This pull request basically fixes that.
2024-07-10 22:17:45 +02:00
Samantaz Fox a56a724a55 Rewrite transcript logic to be more generic (#4747)
The transcript logic in Invidious was written specifically as a workaround for
captions, and not transcripts as a feature.

This PR genericises the logic as so it can be used to implement transcripts
within Invidious.

The most notable change is the added parsing of section headings when it was
previously skipped over in favor of regular lines.
2024-07-10 22:14:56 +02:00
Samantaz Fox 0a54e26536 CI: Run Ameba (#4753)
This PR simply adds Ameba to the CI but doesn't actually fix any of the
detected issues.
2024-07-10 22:13:45 +02:00
Samantaz Fox d135e5b7f7 CI: Add release based containers (#4763)
This PR changes the current master based container to use "master" tag instead
of "latest" tag and adds a new workflow to build a container on each new
release which has the "latest" tag, and a tag based on the current released
version.
2024-07-10 22:11:01 +02:00
ChunkyProgrammer 911dad6935 Channel: parse subscriber count and channel banner 2024-07-09 14:43:14 -04:00
PMK 7214fdaff4 JS: Update timeupdate event defensive to prevent errors 2024-07-06 21:39:00 +02:00
syeopite 220cc9bd2f Typo
Co-authored-by: Samantaz Fox <coding@samantaz.fr>
2024-07-04 10:14:19 -07:00
syeopite aace30b2b4 Bump nightly container build workflow crystal ver 2024-07-04 10:11:36 -07:00
syeopite 64d1f26ece Fix trigger for stable container build 2024-07-01 21:39:14 -07:00
syeopite 8f5c6a602b Rename container workflows 2024-07-01 21:35:08 -07:00
syeopite dd38eef41a Add workflow to build container on release 2024-06-24 11:45:00 -07:00
syeopite 848ab1e9c8 Specify which workflow builds from master 2024-06-24 11:36:11 -07:00
syeopite 933802b897 Use "master" label for master container build 2024-06-24 11:34:55 -07:00
meatball 3bac467a8c Call as? instead of as to not force string conversion 2024-06-19 12:52:53 +02:00
meatball 248df785d7 Update spec and rollback to last commits changes 2024-06-18 20:55:14 +02:00
syeopite 6b429575bf Update ameba version 2024-06-16 16:22:01 -07:00
syeopite c24ed85110 Fix named arg syntax when passing force_resolve 2024-06-16 14:49:48 -07:00
syeopite e0ed094cc4 Cache ameba binary 2024-06-16 13:29:06 -07:00
syeopite a644d76497 Update ameba config 2024-06-16 13:21:55 -07:00
syeopite 45fd4a1968 Add job to lint code through Ameba in CI 2024-06-16 13:21:55 -07:00
Fijxu e82c965e89 Player: Fix video playback for videos that have already been watched.
Trying to watch an already watched video will make the video start 15
seconds before the end of the video. This is not very comfortable when
listening to music or watching/listening playlists over and over.
2024-06-15 18:15:51 -04:00
syeopite f466116cd7 Extract label for transcript in YouTube response 2024-06-13 09:07:20 -07:00
giacomocerquone 288e1dccda Fix player menus hiding onHover 2024-06-13 01:10:35 +02:00
syeopite 5b519123a7 Raise error when transcript does not exist 2024-06-11 18:46:34 -07:00
syeopite 0224162ad2 Rewrite transcript logic to be more generic
The transcript logic in Invidious was written specifically
as a workaround for captions, and not transcripts as a feature.

This commit genericises the logic a bit as so it can be used for
implementing transcripts within Invidious' API and UI as well.

The most notable change is the added parsing of section headings
when it was previously skipped over in favor of regular lines.
2024-06-11 18:23:01 -07:00
meatball 04ca64691b Make solution complaint with spec 2024-05-30 22:37:55 +02:00
meatball 5957523624 Improve code quallity 2024-05-30 22:13:30 +02:00
meatball 629599f940 Fix change in parser file 2024-05-30 21:57:15 +02:00
meatball 31ad708206 fix: Handle nil value for genreUcid in Video struct 2024-05-30 21:56:33 +02:00
Émilien (perso) 1ae14cc224 move helm chart to a dedicated github repository (#4711) 2024-05-27 00:40:43 +02:00
syeopite 9980c0e00f Update uptime logic to handle updown.io response 2024-05-22 13:28:15 -07:00
syeopite aa96cf3453 Fix invalid logic for instance uptime comparison 2024-05-22 13:22:00 -07:00
syeopite 41c978d350 Use HTTP::Client directly in instance list job
The HTTP::Client created via `make_client` is affected by the
force_resolve configuration option. However, api.invidious.io
does not support ipv6 and as such any request with ipv6 to
api.invidious.io will instead raise.

Directly calling the HTTP::Client will ignore the force_resolve option
allowing requests to go through ipv4 when needed.
2024-05-22 13:22:00 -07:00
syeopite cff25a7b25 Refactor instance fetching logic into separate job 2024-05-22 13:22:00 -07:00
syeopite 6b7e730100 Validate override for crystal 1.12.1 2024-05-22 13:10:46 -07:00
thansk 1ce2d10c50 fix: use ion icon for search icon 2024-05-20 14:17:30 +00:00
thansk 5abafb8296 fix: use a search icon instead of text 2024-05-20 11:49:56 +00:00
thansk 9cd2e93a2e feat: allow submitting search with mouse 2024-05-19 11:46:55 +00:00
absidue 3b773c4f77 Fix missing commas 2024-05-14 19:02:41 +02:00
absidue 57e606cb43 Add back missing resolution field 2024-05-14 19:02:41 +02:00
absidue f57aac5815 Fix the missing p in the quality labels.
Co-authored-by: Samantaz Fox <coding@samantaz.fr>
2024-05-14 19:02:41 +02:00
absidue 71a821a7e6 Return actual height, width and fps for streams in /api/v1/videos 2024-05-14 19:02:32 +02:00
Fijxu e0d0dbde3c API: Check if playlist has any videos on it.
Invidious assumes that every playlist will have at least one video
because it needs to check for the `index` key. So if there is no videos
on a playlist, there is no `index` key and Invidious throws
`Index out of bounds`
2024-05-13 21:07:46 -04:00
Fijxu 90fcf80a8d Handle playlists cataloged as Podcast
Videos of a playlist cataloged as podcast are called episodes therefore
Invidious was not able to find `video` in the `text` value inside the
stats array.
2024-05-13 19:39:46 -04:00
ulmemxpoc c4fec89a9b Apply suggestions from code review 2024-05-10 11:23:11 -07:00
Fijxu 9d66676f2d Use full URL in the og:image property. 2024-05-01 22:21:18 -04:00
ulmemxpoc f696f96824 Add rel="noreferrer noopener" to external links 2024-04-30 03:40:19 +00:00
syeopite ccb2a6c58e Bump http_proxy to v0.10.3 2024-04-28 21:34:05 -07:00
syeopite 3b471ae964 Automatically initialize proxy via stdlib override 2024-04-28 19:43:22 -07:00
syeopite eb8fcc9e88 Add support for using HTTP proxies 2024-04-28 19:43:17 -07:00
tracedgod 5b11ca22d0 Use string interpolation instead of concatenation 2024-04-28 00:04:30 -04:00
Samantaz Fox 2fdb6dd644 CI: Bump Crystal version in docker too 2024-04-27 21:02:37 +02:00
Samantaz Fox 470245de54 YtAPI: Remove API keys like official clients 2024-04-27 20:48:42 +02:00
Samantaz Fox b0ec359028 CI: Bump Crystal version matrix 2024-04-27 20:01:19 +02:00
Samantaz Fox eda7444ca4 Update changelog 2024-04-27 00:17:01 +02:00
Samantaz Fox 79b342aee5 Rename legacy changelog file 2024-04-27 00:14:46 +02:00
Samantaz Fox 0ab6d9e748 Videos: Use android test suite client (#4650)
"Temporary" fix, until a better and more permanent solution is found.

Closes issue 4584
2024-04-26 23:54:24 +02:00
Samantaz Fox 6f889dc695 Trending: Un-nest category if this is the only one (#4600)
Trending music was returning less than 24 videos which was getting
filtered out. Since multiple categories only appears on the default
trending page, we don't need to do that filtering for Music, Gaming or movies.

Closes issue 4596
2024-04-26 23:52:44 +02:00
Samantaz Fox 8eaaeb1c74 API: Add bitrate to formatStreams too (#4590)
Before this PR, the bitrate was only returned for the 'adaptiveFormats'.
They are now also returned the 'formatStreams'.

No linked issue
2024-04-26 23:49:44 +02:00
Samantaz Fox 7c1d2714e0 Comments: Add support for new format (#4576)
The new comment format is similar to the description's commandRuns.

This should fix the issues with most comments but there are still
some more changes that would need to be made like adding support for
formatting (bold, italic, underline) and channel emojis.

Fixes issue 4566
2024-04-26 23:48:15 +02:00
Samantaz Fox c94c6f4b83 Remove legacy proxy code (#4570)
Also fixes the build on nightly as the offending code was removed.

Related to
https://github.com/iv-org/invidious/pull/4270#issuecomment-1858876952
2024-04-26 23:44:47 +02:00
Samantaz Fox f1fd197cbc API: convey info "is post live" from Youtube response (#4569)
Returns the 'isPostLiveDvr' field in the videos API when the video
is a post-live DVR (= ended livestream that hasn't been reprocessed
into VOD yet).

Example taken 10 minutes after that livestream ended:
/api/v1/videos/euqnWk-uP6M

{
  ...
  "isPostLiveDvr": true,
  ...
}

Partially fixes 4421
2024-04-26 23:44:30 +02:00
Samantaz Fox bd549f21e9 API: Add 'authorVerified' field on recommended videos (#4562)
Closes 3323
2024-04-26 23:36:08 +02:00
Samantaz Fox 48ad864572 Videos: Add support for new likes format (#4462)
YouTube added a new format for like data in December 2023.
This PR adds support for parsing saod new format.

Related: LuanRT/YouTube.js issue 557

Closes 4419
2024-04-26 23:30:30 +02:00
Samantaz Fox bcb679e653 Proxy: Handle non-200 HTTP codes on DASH manifests (#4429)
Before this PR, Invidious assumed that fetching the DASH manifest from
YouTube will always be successful and didn't check the status code.

That meant that if YouTube gave a rate-limiting page, invidious would
return an HTTP 200 response with the 'application/dash+xml' Content-Type
header and the YouTube ratelimiting page as the body.

No associated issue
2024-04-26 23:25:54 +02:00
Samantaz Fox b163afecb7 API: Parse channel's tags (#4294)
Example from an auto generated channel (Minecraft - Topic):
/api/v1/channels/UCQvWX73GQygcwXOTSf_VDVg

{
  ...
  "tags":[
    "Video game","Indie game","Xbox One","New Nintendo 3DS",
    "PS3","Nintendo Switch","Wii U","Fire OS",
    "Mac operating systems","Apple TV","Xbox 360",
    "PlayStation Vita","PS4","Windows","Linux","Nintendo 3DS",
    "iOS","Windows Phone","iPadOS","Java","Android","tvOS",
    "ChromeOS"
  ]
  ...
}

Example from another channel (Mr Beast):
/api/v1/channels/UCX6OQ3DkcsbYNE6H8uQQuVA

{
  ...
  "tags":["mrbeast6000","beast","mrbeast","Mr.Beast","mr"]
  ...
}

No associated issue
2024-04-26 23:20:30 +02:00
Samantaz Fox 5855e9d188 Translations update from Hosted Weblate (#4164) 2024-04-26 23:19:23 +02:00
Samantaz Fox 33f316c864 Videos: Remove AndroidScreenEmbed client 2024-04-26 23:15:34 +02:00
Samantaz Fox be291e8f0f Videos: Copy captions over between responses 2024-04-26 22:33:08 +02:00
Samantaz Fox d49c762609 YtAPI: Add more client infos for Android test suite 2024-04-26 22:26:45 +02:00
Samantaz Fox 7f3ddad12e Videos: Use android test suite client 2024-04-26 22:03:59 +02:00
tracedgod 6db4a46c5f update the url_search_issues variable to search for the current error on GitHub instead of showing all issues 2024-04-26 16:01:02 -04:00
Hosted Weblate 01e2a5e89d Update Lombard translation
Update translation files

Updated by "Remove blank strings" hook in Weblate.

Update Lombard translation

Add Lombard translation

Co-authored-by: Federico <fv4@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2024-04-25 18:35:09 +02:00
Hosted Weblate bff0b5c85a Update Serbian (cyrillic) translation
Update Serbian (cyrillic) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
2024-04-25 18:35:09 +02:00
Hosted Weblate 2da63bf36d Update Chinese (Simplified) translation
Update Chinese (Simplified) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
2024-04-25 18:35:09 +02:00
Hosted Weblate 7546cb511d Update Chinese (Traditional) translation
Update Chinese (Traditional) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jeff Huang <s8321414@gmail.com>
2024-04-25 18:35:09 +02:00
Hosted Weblate 200cfd7579 Update Portuguese (Portugal) translation
Co-authored-by: Samantaz Fox <translator-weblate@samantaz.fr>
2024-04-25 18:35:09 +02:00
Hosted Weblate 6ed872d72b Update English (United States) translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lime bar <limebarartist@gmail.com>
2024-04-25 18:35:09 +02:00
Hosted Weblate 58dc63671a Update Korean translation
Update Korean translation

Update Korean translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: simmon <simmon@nplob.com>
Co-authored-by: xrfmkrh <rF3nMd7sRKezjF2vcEQo@protonmail.com>
2024-04-25 18:35:08 +02:00
Hosted Weblate eba0699c48 Update Serbian translation
Update Serbian translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
2024-04-25 18:35:08 +02:00
Hosted Weblate e3018e00c4 Update Swedish translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
2024-04-25 18:35:08 +02:00
Hosted Weblate b54d45504f Update Spanish translation
Update Spanish translation

Update Spanish translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Samantaz Fox <translator-weblate@samantaz.fr>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
2024-04-25 18:35:08 +02:00
Hosted Weblate 64eef948bd Update Dutch translation
Co-authored-by: Gert-dev <Gert-dev@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-04-25 18:35:08 +02:00
Hosted Weblate 3f9c7b6c19 Update Interlingua translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Software In Interlingua <softinterlingua@gmail.com>
2024-04-25 18:35:08 +02:00
Hosted Weblate c60d2561d1 Update Arabic translation
Update Arabic translation

Update Arabic translation

Update Arabic translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Co-authored-by: Samantaz Fox <translator-weblate@samantaz.fr>
2024-04-25 18:35:08 +02:00
Hosted Weblate 0de3b0a96d Update Italian translation
Update Italian translation

Co-authored-by: Federico <fv4@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-04-25 18:35:08 +02:00
Hosted Weblate 5551b613d3 Update Polish translation
Update Polish translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Matthaiks <kitynska@gmail.com>
2024-04-25 18:35:08 +02:00
Hosted Weblate ef7f3f5bd4 Update Hindi translation
Update Hindi translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Scrambled777 <weblate.scrambled777@simplelogin.com>
2024-04-25 18:35:08 +02:00
Hosted Weblate c8369f9dbb Update Croatian translation
Update Croatian translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
2024-04-25 18:35:08 +02:00
Hosted Weblate 8d75d6431a Update Vietnamese translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Knight Hat <knightchanelgaming@gmail.com>
2024-04-25 18:35:08 +02:00
Hosted Weblate a6bcf0280c Update Portuguese translation
Update Portuguese translation

Update Portuguese translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Samantaz Fox <translator-weblate@samantaz.fr>
Co-authored-by: Sergio Marques <so.boston.android@gmail.com>
2024-04-25 18:35:08 +02:00
Hosted Weblate 97c4263530 Update Czech translation
Update Czech translation

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-04-25 18:35:08 +02:00
Hosted Weblate dd01b0f5eb Update Japanese translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: maboroshin <maboroshin@users.noreply.hosted.weblate.org>
2024-04-25 18:35:08 +02:00
Hosted Weblate 197b3972a9 Update Ukrainian translation
Update Ukrainian translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Samantaz Fox <translator-weblate@samantaz.fr>
2024-04-25 18:35:08 +02:00
Hosted Weblate cbbaded209 Update Bengali translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Tauhid Alam Rifty <tauhidalamrifty@gmail.com>
2024-04-25 18:35:08 +02:00
Hosted Weblate 066b1c35cc Update Romanian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Wiktor Muzynski <wiktormuzynski@gmail.com>
2024-04-25 18:35:08 +02:00
Hosted Weblate 25cbfd0681 Update Basque translation
Co-authored-by: Samantaz Fox <translator-weblate@samantaz.fr>
2024-04-25 18:35:08 +02:00
Hosted Weblate a2f9707b3f Update Danish translation
Co-authored-by: Samantaz Fox <translator-weblate@samantaz.fr>
2024-04-25 18:35:08 +02:00
Hosted Weblate 89c008211d Update German translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lenny Angst <lenny@familie-angst.ch>
2024-04-25 18:35:08 +02:00
Hosted Weblate e92d250a1c Update Portuguese (Brazil) translation
Update Portuguese (Brazil) translation

Update Portuguese (Brazil) translation

Update Portuguese (Brazil) translation

Update Portuguese (Brazil) translation

Update Portuguese (Brazil) translation

Update Portuguese (Brazil) translation

Update Portuguese (Brazil) translation

Update Portuguese (Brazil) translation

Update Portuguese (Brazil) translation

Update Portuguese (Brazil) translation

Update Portuguese (Brazil) translation

Co-authored-by: André Marcelo Alvarenga <andrealvarenga@gmx.net>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jose Delvani <delvani.eletricista@gmail.com>
Co-authored-by: joaooliva <joaooliva@protonmail.com>
2024-04-25 18:35:08 +02:00
Hosted Weblate 668c130f01 Update Turkmen translation
Add Turkmen translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Hydyr Sopyyew <sopyyewhydyr46@gmail.com>
2024-04-25 18:35:08 +02:00
Hosted Weblate f7ae680c25 Update Turkish translation
Update Turkish translation

Update Turkish translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
2024-04-25 18:35:08 +02:00
ChunkyProgrammer 24de19d06f only ignore smaller trending categories on default trending tab 2024-04-23 23:51:22 -04:00
RadoslavL 7b7197cde8 retrigger checks 2024-04-22 16:26:49 +03:00
RadoslavL 3c6019edd0 retrigger checks 2024-04-22 16:20:11 +03:00
absidue f313162fa1 Add bitrate to formatStreams in /api/v1/videos/{id} response 2024-04-21 12:53:31 +02:00
absidue b90cf286fc Fix duplicate query parameters in URLs when local=true for /api/v1/videos/{id} 2024-04-20 20:46:01 +02:00
ChunkyProgrammer 2b6e71b553 Simplify cvm assignment logic + improve formatting
Co-Authored-By: Samantaz Fox <coding@samantaz.fr>
2024-04-20 10:25:51 -04:00
ChunkyProgrammer d1eae10147 make authorVerified a bool value 2024-04-16 18:21:45 -04:00
ChunkyProgrammer fbf07e18aa Parse links in the comments
Co-Authored-By: Samantaz Fox <coding@samantaz.fr>
2024-04-11 08:58:33 -04:00
ChunkyProgrammer de2287963f fix loading replies to comments, remove unneeded code
Co-Authored-By: Samantaz Fox <coding@samantaz.fr>
2024-04-10 18:32:20 -04:00
ChunkyProgrammer 039212ed91 escape html, add todo comment 2024-04-10 18:21:53 -04:00
ChunkyProgrammer a9f55aa310 fix lint, improve performance 2024-04-10 18:21:53 -04:00
ChunkyProgrammer c27bb90e4d Add support for new comment format 2024-04-10 18:21:53 -04:00
Émilien (perso) b673695aa2 Merge pull request #4561 from ChunkyProgrammer/use-trending-api-for-health-checks
Use Trending API for health checks
2024-04-10 20:21:17 +07:00
syeopite 990931ff67 Remove legacy proxy code 2024-04-07 11:08:12 -07:00
ChunkyProgrammer bfd9c9876e Parse if video is post live dvr and include it in API 2024-04-07 10:26:33 -04:00
ChunkyProgrammer 2a029b4d8c Add field for authorVerified for recommended videos when using the API 2024-04-04 20:20:27 -04:00
ChunkyProgrammer 170eef58fd Use trending api for health checks 2024-04-04 19:10:27 -04:00
Brahim Hadriche a9e8aabe1f Merge commit '08390acd0c17875fddb84cabba54197a5b5740e4' into fix/popular-disabled-error 2024-04-01 10:03:37 -04:00
Brahim Hadriche b0c6bdf44c use 403 code 2024-04-01 10:03:29 -04:00
Brahim Hadriche c5eb10b21f Revert "Fix error code for disabled popular endpoint"
This reverts commit 1363fb8094.
2024-04-01 10:02:49 -04:00
Samantaz Fox 08390acd0c Update workaround used to fetch streaming URLs (#4552)
Thanks to LuanRT (From youtube.js) for the fix!

Closes issue 4498
2024-03-31 18:42:10 +02:00
Brahim Hadriche 1a2d408d38 Update shorts params 2024-03-31 11:37:13 -04:00
src-tinkerer 72fe8af850 Merge branch 'master' into stream-sort 2024-03-26 12:19:45 +00:00
ChunkyProgrammer 0aaa3e6a08 API: Parse channel's tags 2024-03-11 13:31:14 -04:00
nooptek 499aed37dd Fix handling of modified source code URL setting 2024-03-10 17:51:29 +01:00
Émilien (perso) 99a5e9cbc4 Merge pull request #4473 from SamantazFox/bump-api-clients
YoutubeAPI: bump client versions
2024-03-08 11:23:03 +01:00
Samantaz Fox 619aa3ff05 YoutubeAPI: bump client versions 2024-03-06 21:36:15 +01:00
ChunkyProgrammer 5ceeefa236 add support for new likes format 2024-03-01 23:45:29 -05:00
Tomasz Wilczyński 4adb4c00d2 routes: Allow embedding videos in local HTML files (fixes #4448)
The current Content Security Policy does not allow to embed videos
inside local HTML files which are viewed in the browser via the file
protocol. This commit adds the file protocol to the allowed frame
ancestors, so that the embedded videos load correctly in local HTML
files.

This behaviour is consistent which how the official YouTube website
allows to embed videos from itself.

Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
2024-02-24 20:01:16 +01:00
Samantaz Fox e8a36985af API: Add APIHandler back (#4431)
This handler should no have been removed in 4276, as it adds the required CORS
header (Access-Control-Allow-Origin) for public acces to the API.

Thanks to iBicha for noticing this!
2024-02-19 00:16:17 +01:00
Samantaz Fox 962ce23cc2 WebVTT::Builder: Add logic to escape special chars (#4414)
Note: WebVTT does allow some tags in the cue payload in some circumstances
while this PR just blindly escapes everything:
https://developer.mozilla.org/en-US/docs/Web/API/WebVTT_API#cue_payload_text_tags
2024-02-19 00:16:17 +01:00
Samantaz Fox e0ce59d3e8 Channels: Add support for multi-image community posts (#4412)
This PR adds a CSS-only image carousel for community posts with more than
one image attached.

Closes issue 3522
2024-02-19 00:16:17 +01:00
Samantaz Fox c5a3112e49 CSS: expand #contents width on small screens (#4405)
The #contents div now takes the full width on small screens (< 1280px).
All page elements have a little more room, especially the video titles.
2024-02-19 00:16:17 +01:00
Samantaz Fox d3703baba9 I18n: Add missing translation strings (#4424)
Closes issue 3120
2024-02-19 00:15:44 +01:00
Samantaz Fox 20203f4ec0 I18n: Fix a typo in Finnish localization (#4375) 2024-02-18 23:53:16 +01:00
Samantaz Fox 732553519e Translations update from Hosted Weblate (#4164) 2024-02-18 23:51:53 +01:00
ChunkyProgrammer a957b0fb7c remove trailing white spaces 2024-02-16 16:22:43 -05:00
ChunkyProgrammer 26429bee3f make it so interpolation text can be a hash
Co-Authored-By: Samantaz Fox <coding@samantaz.fr>
2024-02-15 21:45:22 -05:00
ChunkyProgrammer ef6b766b29 Add support for multi image community posts 2024-02-15 21:45:21 -05:00
Émilien (perso) 1e6ec605e8 Remove usage of depends_on (#4383) 2024-02-15 22:59:00 +01:00
Samantaz Fox 60f6a345d9 Locales: Fix broken i18Next v3/v4 plurals
Languages impacted: es, fa, pt
2024-02-15 22:12:04 +01:00
Samantaz Fox d1dddc1adc Locales: Remove Cyrillic text from Serbian (Latin) 2024-02-15 21:37:17 +01:00
Hosted Weblate 00ef004029 Update Norwegian Bokmål translation
Co-authored-by: Deleted User <noreply+73135@weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-02-15 18:02:15 +01:00
Hosted Weblate 7ff11e4c44 Update Serbian (cyrillic) translation
Update Serbian (cyrillic) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
2024-02-15 18:02:15 +01:00
Hosted Weblate 8db2e060d9 Update Chinese (Simplified) translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
2024-02-15 18:02:15 +01:00
Hosted Weblate 8b0cbd2a29 Update Chinese (Traditional) translation
Co-authored-by: Jeff Huang <s8321414@gmail.com>
2024-02-15 18:02:15 +01:00
Hosted Weblate d2ce519559 Update Slovenian translation
Co-authored-by: Damjan Gerl <damjan@damjan.net>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-02-15 18:02:15 +01:00
Hosted Weblate 219b587945 Update Korean translation
Update Korean translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: simmon <simmon@nplob.com>
Co-authored-by: xrfmkrh <rF3nMd7sRKezjF2vcEQo@protonmail.com>
2024-02-15 18:02:15 +01:00
Hosted Weblate e8810509c1 Update Albanian translation
Update Albanian translation

Co-authored-by: Besnik Bleta <besnik@programeshqip.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-02-15 18:02:15 +01:00
Hosted Weblate 9688200caf Update Serbian translation
Update Serbian translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
2024-02-15 18:02:15 +01:00
Hosted Weblate 26a50eb4e8 Update Persian translation
Update Persian translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Kaambiz <kambizx@gmail.com>
2024-02-15 18:02:15 +01:00
Hosted Weblate 0ce945bfa8 Update Swedish translation
Update Swedish translation

Update Swedish translation

Co-authored-by: Deleted User <noreply+73135@weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Max Bengtzén <aura.kettles.0h@icloud.com>
Co-authored-by: bittin1ddc447d824349b2 <bittin@reimu.nl>
2024-02-15 18:02:15 +01:00
Hosted Weblate aadf848ee6 Update French translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jean Mareilles <waged1266@tutanota.com>
2024-02-15 18:02:15 +01:00
Hosted Weblate 53ce2a1a9a Update Spanish translation
Update Spanish translation

Update Spanish translation

Update Spanish translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jorge Maldonado Ventura <jorgesumle@freakspot.net>
Co-authored-by: gallegonovato <fran-carro@hotmail.es>
2024-02-15 18:02:15 +01:00
Hosted Weblate 1d5100462b Update Dutch translation
Update Dutch translation

Co-authored-by: Deleted User <noreply+73135@weblate.org>
Co-authored-by: Gert-dev <Gert-dev@users.noreply.hosted.weblate.org>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-02-15 18:02:15 +01:00
Hosted Weblate 986515dc5b Update Indonesian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Reza Almanda <rezaalmanda27@gmail.com>
2024-02-15 18:02:15 +01:00
Hosted Weblate 1d906aeecc Update Interlingua translation
Add Interlingua translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Software In Interlingua <softinterlingua@gmail.com>
2024-02-15 18:02:15 +01:00
Hosted Weblate 426b472a15 Update Arabic translation
Update Arabic translation

Update Arabic translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rex_sa <rex.sa@pm.me>
2024-02-15 18:02:15 +01:00
Hosted Weblate 1493e6a086 Update Italian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
2024-02-15 18:02:14 +01:00
Hosted Weblate 3767ab2eeb Update Polish translation
Update Polish translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Matthaiks <kitynska@gmail.com>
2024-02-15 18:02:14 +01:00
Hosted Weblate fea36fc639 Update Hindi translation
Update Hindi translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Saurmandal <saurmandal@protonmail.com>
Co-authored-by: Snwglb <wishitwasarchived@gmail.com>
2024-02-15 18:02:14 +01:00
Hosted Weblate a16235d3b9 Update Croatian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
2024-02-15 18:02:14 +01:00
Hosted Weblate 99a3bd4fff Update Vietnamese translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Tran Viet Duc <deli50@protonmail.com>
2024-02-15 18:02:14 +01:00
Hosted Weblate 4aed0e1102 Update Portuguese translation
Update Portuguese translation

Update Portuguese translation

Update Portuguese translation

Co-authored-by: Filipe Martins <mvrtinsbeats@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jener Gomes <jenerg1@gmail.com>
Co-authored-by: SC <lalocas@protonmail.com>
Co-authored-by: jamerLamer <akHarINlMYExpSmVPDRT@proton.me>
2024-02-15 18:02:14 +01:00
Hosted Weblate 833c711cba Update Czech translation
Update Czech translation

Co-authored-by: Fjuro <ifjuro@proton.me>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-02-15 18:02:14 +01:00
Hosted Weblate 7e1deea15e Update Catalan translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: victor dargallo <victordargallo@disroot.org>
2024-02-15 18:02:14 +01:00
Hosted Weblate b9ae1a61da Update Japanese translation
Update Japanese translation

Update Japanese translation

Update Japanese translation

Update Japanese translation

Update Japanese translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: maboroshin <maboroshin@users.noreply.hosted.weblate.org>
2024-02-15 18:02:14 +01:00
Hosted Weblate f062c18b82 Update Ukrainian translation
Update Ukrainian translation

Update Ukrainian translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Co-authored-by: Сергій <sergiy.goncharuk.1@gmail.com>
2024-02-15 18:02:14 +01:00
Hosted Weblate f21a532c0d Update Bulgarian translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
2024-02-15 18:02:14 +01:00
Hosted Weblate 8cec7ba004 Update Russian translation
Update Russian translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Noise Maker <vh0d@disroot.org>
Co-authored-by: hikiko4ern <25303622+hikiko4ern@users.noreply.github.com>
2024-02-15 18:02:14 +01:00
Hosted Weblate 8169cd8977 Update Danish translation
Co-authored-by: Grooty12 <weblate@grooty.site>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
2024-02-15 18:02:14 +01:00
Hosted Weblate 8ffc569ebd Update German translation
Update German translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lenny Angst <lenny@familie-angst.ch>
Co-authored-by: Radoslav Lelchev <rlelchev@abv.bg>
2024-02-15 18:02:14 +01:00
Hosted Weblate 736f35332a Update Portuguese (Brazil) translation
Update Portuguese (Brazil) translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: joaooliva <joaooliva@protonmail.com>
2024-02-15 18:02:14 +01:00
Hosted Weblate c52c6d3c9a Update Turkish translation
Update Turkish translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Oğuz Ersen <oguz@ersen.moe>
2024-02-15 18:02:14 +01:00
Samantaz Fox 7b84bdb29b API: Add APIHandler back
This handler should no have been removed in 4276, as it adds the required CORS
header (Access-Control-Allow-Origin) for public acces to the API.

Thanks to iBicha for noticing this!
2024-02-13 21:05:26 +01:00
Samantaz Fox 5c0b6d8afa Stats: Fix two swapped function names (#4376)
The function names `count_users_active_6m` and `count_users_active_1m` were
swapped. As the names were swapped on both sides (declaration and use), this
had no functional impact.

No related isse was tracked.
2024-02-12 22:34:13 +01:00
Samantaz Fox c85b908613 API: Fix missing wildcards after login redirect (#4348)
This PR fixes an issue where the `scopes` parameter would see its wildmark
characters (*) removed during the login page redirection, after that a call
to `/authorize_token` was made while the user was not logged in.

Closes issue 4200
2024-02-12 22:30:48 +01:00
Samantaz Fox f32764c840 HTML: Preserve playlist in "Watch on YouTube" link (#4342)
It seems that at some point, Youtube changed the URL parameter from `plid`
to `list` and we didn't notice. This fixes that.

Closes #3929
2024-02-12 22:23:44 +01:00
Samantaz Fox d30dae43fe HTML: Add title to toggle theme icon (#4320) 2024-02-12 22:20:14 +01:00
Samantaz Fox 338d3d9f86 CSS: Fix thumbnails' aspect ratio to prevent CLS (#4278)
Force the thumbnails aspect ratio to 16/9 in order to prevent Cumulative Layout
Shifting (CLS) from hapenning during lazy loading.

It also fixes the problematic, taller thumbnails that Youtube returns for
playlists.

Closes issue 4002
2024-02-12 22:19:14 +01:00
Samantaz Fox 1f51255f2f API: Remove the fields parameter (#4276)
Multiple users have reported that the fields parameter is slowing down API
response times significantly. As most API endpoints are already optimized to
make as few requests as possible to Youtube, there is no point in limiting the
output. Furthermore, the added processing might be part of the broader memory
leak problem (See 1438).

In addition, the small increase in data output is not much of an issue compared
to the huge video proxy that lies next to this API.

No related issue tracked
2024-02-12 22:10:45 +01:00
Samantaz Fox dcbe52c9fb Videos: Use start time and end time for clips (#4264)
This PR parses the start and end time for clips.

It also adds a new, dedicated API endpoint (`/api/v1/clips/{id}`) for
retrieving the start and end time of a clip.

Here is a sample response from that new endpoint (`video` is a video object,
as described in https://docs.invidious.io/api/common_types/#videoobject):

GET `/api/v1/clips/UgkxxPM3BRphCAPLP88YoUGuj79KXPfpNNO_?pretty=1`

Response:
```
{
  "startTime": 8842.645,
  "endTime": 8855.856,
  "clipTitle": "✂️ Kirby is pink!",
  "video": {}
}
```

Closes issue 3921
2024-02-12 22:10:16 +01:00
Samantaz Fox bd5df3af5f API: Unescape search suggestions (#4218)
Previously, the suggestion were HTML encoded. This PR fixes that.
2024-02-12 22:03:33 +01:00
Samantaz Fox 9bd2072e1d API: Add playlist and start time to resolve_url
This adds `playlistId` and `startTimeSeconds` to /api/v1/resolveurl if these
informations were returned by Youtube's endpoint.
2024-02-12 22:01:08 +01:00
Samantaz Fox 3b4358dbd4 Extractors: Don't error if AuthorId does not exist (#3869)
Some playlist author's don't have a YouTube channel, so does movies.
This caused various extractors (related videos, search) to fail.

Closes the following issues:
2530, 3349, 3766, 3812, 4133
2024-02-12 21:54:17 +01:00
absidue 72bcd3cc72 Handle non-200 status codes for YouTube DASH manifests 2024-02-12 18:55:15 +01:00
Émilien (perso) cf686202e0 Merge pull request #4423 from tleydxdy/xml-namespace
Fix pubsub feed parsing
2024-02-12 08:29:44 +01:00
shironeko 6b33820f1f Add missing translation strings
closes #3120
2024-02-08 19:01:19 -05:00
shironeko 98c421e9f5 Fix when video from pubsub is a scheduled event 2024-02-08 18:58:23 -05:00
shironeko c864a63b6d Fix pubsub feed parsing
similar to what's done in #3793, this is causing an assert on my instance
2024-02-08 17:05:11 -05:00
syeopite 0ad2eff2a4 WebVTT::Builder: Add logic to escape special chars 2024-01-30 15:25:45 -08:00
ThetaDev c005ada487 fix: prevent censoring of self-harm related search queries (#4403)
* fix: prevent censoring of self-harm related search queries

* fix: yt_filters_spec with new flag
2024-01-29 14:59:25 +01:00
toabr 4a339df5c4 CSS: expand #contents width on small screens 2024-01-27 00:38:47 +01:00
syeopite 1c0b4205d4 Add parameter to disable force_resolve in make_client (#4335)
* Add option to disable force_resolve in make_client

Some websites such as archive.org and textcaptcha.com
does not support IPv6 and as such requests fail when Invidious requests
with IPv6 to those services.

* Reenable force_resolve on pubsub subcribe request

* Make force_resolve false by default in make_client

* Remove missed explicit force_resolve=false
2024-01-10 23:01:00 +00:00
syeopite b16f66ef00 Exempt issues with "exempt-stale" from staling (#4385)
The exempt-stale label was not actually set to exempt issues from staling...
2024-01-10 20:40:19 +00:00
vojkovic 7cca1285aa Fix two swapped function names 2024-01-06 15:51:31 +08:00
pitkajuh c059829035 Fix typo 2024-01-05 20:39:29 +01:00
ChunkyProgrammer 7da4a7f72b add null safety to clip parsing 2023-12-26 22:05:09 -05:00
nixos script 0917efd9cb fix issue where scope would be missing the * if the user was not logged in before calling the authorize endpoint
fix #4200
2023-12-21 13:52:19 +08:00
ChunkyProgrammer 090b470bfc fix potential memory leak 2023-12-19 23:07:18 -05:00
Luigi 97c4165f55 Improve depends_on docker-compose (#4249)
* Improve depends_on checking the service is up and healthy before start the service that might cause issue first boot

* Docker version Ubuntu 22.04 has a version which doesn't support restart
2023-12-18 22:18:05 +00:00
guidiasz 87a8207f37 fix: "Watch on YouTube" preserve current playlist 2023-12-18 13:23:55 -03:00
ChunkyProgrammer fe8b1b4cc4 Add title to toggle theme icon 2023-12-07 11:43:56 -05:00
ChunkyProgrammer f1edb1d6bf fix related video author when id is empty 2023-12-07 09:39:33 -05:00
Chunky programmer b5f8b4542a Search: Don't error if AuthorId does not exist 2023-12-07 09:39:33 -05:00
ChunkyProgrammer b344d98c25 Add API endpoint for Clips 2023-12-07 09:39:04 -05:00
ChunkyProgrammer 8c22e6a640 use start time and endtime for clips 2023-12-07 09:39:03 -05:00
ChunkyProgrammer 6488794218 Unescape search suggestions 2023-12-07 09:36:59 -05:00
src-tinkerer cf61af67ab Update src/invidious/routes/channels.cr sort_by for consistency 2023-11-30 14:34:01 +03:30
Brahim Hadriche 1363fb8094 Fix error code for disabled popular endpoint 2023-11-28 21:34:17 -05:00
src-tinkerer 5f2b43d653 Remove unecessary if condition in videos.cr 2023-11-25 00:48:27 +03:30
src-tinkerer 6251d8d43f Rename a variable in videos.cr 2023-11-25 00:46:11 +03:30
RadoslavL 6861148290 Moved code around and fixed a problem 2023-11-24 11:24:56 +02:00
Samantaz Fox 7b6930c16b Remove the 'fields' parameter on the client side too 2023-11-23 18:30:42 +01:00
Samantaz Fox 9d5fa2bcc4 Helpers: remove JSONFilter logic 2023-11-23 18:30:42 +01:00
Samantaz Fox 9310d09f93 Kemal: remove APIHandler middleware 2023-11-23 18:30:37 +01:00
src-tinkerer 162b89d942 Fix format in videos.cr 2023-11-23 14:44:37 +03:30
src-tinkerer 0d63ad5a7f Use a single function for fetching channel contents 2023-11-22 14:52:17 +03:30
Corné Dorrestijn 16c79f1ef5 Fixed aspect ratio for thumnails to prevent CLS 2023-11-21 08:14:45 +01:00
src-tinkerer 63e5d72466 Remove unused function produce_channel_livestream_url 2023-11-20 15:50:59 +03:30
Brahim Hadriche b40cf6544a Revert "Make head request to resolve short urls"
This reverts commit 7e267da5be.
2023-11-19 16:06:29 -05:00
RadoslavL 03f9962a47 This should work 2023-11-14 10:00:18 +02:00
RadoslavL d098e5ae9b I hope it works at this point 2023-11-14 09:58:37 +02:00
RadoslavL 4c486634e2 Another attempt at fixing the issue 2023-11-14 09:56:06 +02:00
RadoslavL 3bced4e12b Fixed another issue 2023-11-14 09:51:12 +02:00
RadoslavL 0d22af6564 Moved methods around 2023-11-14 09:47:16 +02:00
RadoslavL 2a6a32e667 Fixed an issue 2023-11-14 09:43:52 +02:00
karelrooted c251c66748 fix youtube api vtt format subtitle
for fmt=vtt to work the fmt parameter in the original caption api url need to be replaced
2023-11-14 13:16:08 +08:00
RadoslavL 50da6cf3e7 Organize the code better
Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2023-11-12 20:52:11 +02:00
RadoslavL 7388e4ca72 Add translation to the publishedText parameter
Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2023-11-12 20:51:33 +02:00
RadoslavL be216fff94 Added the text version of the published parameter 2023-11-12 08:37:13 +02:00
RadoslavL 019807256f Seperated repetitive code in a function 2023-11-09 21:56:41 +02:00
RadoslavL a0d24190b8 Made published be an optional parameter 2023-11-08 19:09:16 +02:00
RadoslavL 2b2d67fcfa Fixed a typo
Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2023-11-08 11:48:32 +02:00
RadoslavL 76369eb599 Removed unused attribute 2023-11-08 10:18:29 +02:00
RadoslavL 6236cea33e Changed some variable names
Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2023-11-08 10:13:16 +02:00
src-tinkerer b0df3774db Add sort options to streams 2023-11-01 21:56:25 +03:30
Brahim Hadriche 3881038a32 format 2023-10-26 17:51:38 -04:00
Brahim Hadriche 7e267da5be Make head request to resolve short urls 2023-10-26 17:48:58 -04:00
Brahim Hadriche d7901c1e0d type fix 2023-10-26 17:35:52 -04:00
Brahim Hadriche 85a5bbd696 Add playlist and start time to the resolve url 2023-10-26 17:24:53 -04:00
RadoslavL e8c2388589 Removed the purging of the query parameters 2023-10-26 11:30:12 +03:00
RadoslavL 995df2d296 Removed a space 2023-10-22 17:50:39 +03:00
RadoslavL c0d75bc52f Removed <noscript> and the user preferences option 2023-10-22 13:54:35 +03:00
RadoslavL e307fcc9a1 Fixed an issue 2023-10-20 09:00:23 +03:00
RadoslavL bae8bab3ff Remove unnecessary code 2023-10-15 00:06:37 +03:00
RadoslavL fa59f41f7b Fixed an issue 2023-10-11 09:12:27 +03:00
RadoslavL 20ca1ebcc0 Used the decode_date function instead 2023-10-11 09:08:23 +03:00
RadoslavL b0b4f09b3a Seperated the code in a function 2023-10-09 12:26:38 +03:00
RadoslavL 48af0af9d5 Added minutes as well 2023-10-09 12:18:50 +03:00
RadoslavL f9460e31bc Fixed an issue 2023-10-09 12:09:03 +03:00
RadoslavL b7a252b096 Removed need for more API calls by parsing the publishedTimeText string 2023-10-09 12:00:37 +03:00
RadoslavL 6b929da0e1 Added a 'published' video parameter 2023-10-07 16:57:47 +03:00
RadoslavL 21122db3a7 Fixed an issue 2023-09-30 19:27:06 +03:00
RadoslavL c9a843c7fe Replaced to_json with to_pretty_json 2023-09-30 19:11:42 +03:00
RadoslavL 275501aad3 Actually add the pagination.js file (git didn't detect it the first time) 2023-09-30 19:01:48 +03:00
RadoslavL 5cdbc184c7 Added a previous_page_button preference option and made switching between the first page and previous page buttons possible 2023-09-30 18:36:43 +03:00
RadoslavL 9996d00cb1 Fixed a problem 2023-09-27 19:49:00 +03:00
RadoslavL 9a617ae087 Fixed problem 2023-09-27 19:46:47 +03:00
RadoslavL c257882a1f Removed a tab 2023-09-27 19:35:40 +03:00
RadoslavL 58bad6180f Changed first_page type to Bool 2023-09-27 19:22:34 +03:00
RadoslavL 509bace7d1 Removed a space 2023-09-27 19:05:44 +03:00
Thomas Lange 824cc1a5aa Don't redefine the "preload" option in player.js
If the HTML5 "<video>" element defines the "preload" attribute directly,
it isn't necessary to redefine the "preload" option in the player.js.
2023-09-27 15:36:40 +02:00
RadoslavL 07c52cba3d Fixed an issue with tabs 2023-09-27 15:05:17 +03:00
RadoslavL 04ba7b0d58 Fix more issues related to tabs 2023-09-27 14:22:51 +03:00
RadoslavL 4788a3b4a9 Removed unnecessary spaces 2023-09-27 11:45:02 +03:00
RadoslavL 7fe2af735d Included the check for RTL languages 2023-09-27 11:37:01 +03:00
RadoslavL 905582db66 Added a first page button 2023-09-27 11:28:47 +03:00
Thomas Lange bf470704a5 Add option to control preloading of video data
Fix #4110 by adding an option to control the preloading of video data on
page load. If disabled ("false"), the browser will not preload any video
data until the user explicitly hits the "Play" button.

If enabled ("true"), the default behavior will be used, which means the
browser decides how much of the video will be preloaded.
2023-09-26 22:21:12 +02:00
Emilien Devos 78773d7326 add the ability to listen on unix sockets 2021-05-24 23:41:14 +02:00
195 changed files with 8837 additions and 4535 deletions
+31 -47
View File
@@ -20,6 +20,13 @@ Lint/ShadowingOuterLocalVar:
Excluded:
- src/invidious/helpers/tokens.cr
Lint/NotNil:
Enabled: false
Lint/SpecFilename:
Excluded:
- spec/parsers_helper.cr
#
# Style
@@ -31,6 +38,29 @@ Style/RedundantBegin:
Style/RedundantReturn:
Enabled: false
Style/RedundantNext:
Enabled: false
Style/ParenthesesAroundCondition:
Enabled: false
# This requires a rewrite of most data structs (and their usage) in Invidious.
Naming/QueryBoolMethods:
Enabled: false
Naming/AccessorMethodName:
Enabled: false
Naming/BlockParameterName:
Enabled: false
# Hides TODO comment warnings.
#
# Call `bin/ameba --only Documentation/DocumentationAdmonition` to
# list them
Documentation/DocumentationAdmonition:
Enabled: false
#
# Metrics
@@ -39,50 +69,4 @@ Style/RedundantReturn:
# Ignore function complexity (number of if/else & case/when branches)
# For some functions that can hardly be simplified for now
Metrics/CyclomaticComplexity:
Excluded:
# get_about_info(ucid, locale) => [17/10]
- src/invidious/channels/about.cr
# fetch_channel_community(ucid, continuation, ...) => [34/10]
- src/invidious/channels/community.cr
# create_notification_stream(env, topics, connection_channel) => [14/10]
- src/invidious/helpers/helpers.cr:84:5
# get_index(plural_form, count) => [25/10]
- src/invidious/helpers/i18next.cr
# call(context) => [18/10]
- src/invidious/helpers/static_file_handler.cr
# show(env) => [38/10]
- src/invidious/routes/embed.cr
# get_video_playback(env) => [45/10]
- src/invidious/routes/video_playback.cr
# handle(env) => [40/10]
- src/invidious/routes/watch.cr
# playlist_ajax(env) => [24/10]
- src/invidious/routes/playlists.cr
# fetch_youtube_comments(id, cursor, ....) => [40/10]
# template_youtube_comments(comments, locale, ...) => [16/10]
# content_to_comment_html(content) => [14/10]
- src/invidious/comments.cr
# to_json(locale, json) => [21/10]
# extract_video_info(video_id, ...) => [44/10]
# process_video_params(query, preferences) => [20/10]
- src/invidious/videos.cr
#src/invidious/playlists.cr:327:5
#[C] Metrics/CyclomaticComplexity: Cyclomatic complexity too high [19/10]
# fetch_playlist(plid : String)
#src/invidious/playlists.cr:436:5
#[C] Metrics/CyclomaticComplexity: Cyclomatic complexity too high [11/10]
# extract_playlist_videos(initial_data : Hash(String, JSON::Any))
Enabled: false
+1 -4
View File
@@ -1,12 +1,9 @@
# 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/ @unixfox
kubernetes/ @unixfox
README.md @thefrenchghosty
config/config.example.yml @thefrenchghosty @SamantazFox @unixfox
config/config.example.yml @SamantazFox @unixfox
scripts/ @syeopite
shards.lock @syeopite
+4 -2
View File
@@ -10,8 +10,10 @@ assignees: ''
<!--
BEFORE TRYING TO REPORT A BUG:
* Read the FAQ!
* Use the search function to check if there is already an issue open for your problem!
* Read the FAQ: https://docs.invidious.io/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!
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 an enhancement to an existing feature please use "Enhancement" instead
+10
View File
@@ -0,0 +1,10 @@
version: 2
updates:
- package-ecosystem: "docker"
directory: "/docker"
schedule:
interval: "weekly"
- package-ecosystem: github-actions
directory: /
schedule:
interval: "weekly"
@@ -1,4 +1,4 @@
name: Build and release container
name: Build and release container directly from master
on:
push:
@@ -23,19 +23,6 @@ jobs:
- name: Checkout
uses: actions/checkout@v4
- name: Install Crystal
uses: crystal-lang/install-crystal@v1.8.0
with:
crystal: 1.9.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:
@@ -58,12 +45,12 @@ jobs:
images: quay.io/invidious/invidious
tags: |
type=sha,format=short,prefix={{date 'YYYY.MM.DD'}}-,enable=${{ github.ref == format('refs/heads/{0}', 'master') }}
type=raw,value=latest,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 AMD64 image for Push Event
uses: docker/build-push-action@v5
uses: docker/build-push-action@v6
with:
context: .
file: docker/Dockerfile
@@ -83,12 +70,12 @@ jobs:
suffix=-arm64
tags: |
type=sha,format=short,prefix={{date 'YYYY.MM.DD'}}-,enable=${{ github.ref == format('refs/heads/{0}', 'master') }}
type=raw,value=latest,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
uses: docker/build-push-action@v6
with:
context: .
file: docker/Dockerfile.arm64
@@ -0,0 +1,81 @@
name: Build and release container
on:
workflow_dispatch:
push:
tags:
- "v*"
jobs:
release:
runs-on: ubuntu-latest
steps:
- name: Checkout
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: Login to registry
uses: docker/login-action@v3
with:
registry: quay.io
username: ${{ secrets.QUAY_USERNAME }}
password: ${{ secrets.QUAY_PASSWORD }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v5
with:
images: quay.io/invidious/invidious
flavor: |
latest=false
tags: |
type=semver,pattern={{version}}
type=raw,value=latest
labels: |
quay.expires-after=12w
- name: Build and push Docker AMD64 image for Push Event
uses: docker/build-push-action@v6
with:
context: .
file: docker/Dockerfile
platforms: linux/amd64
labels: ${{ steps.meta.outputs.labels }}
push: true
tags: ${{ steps.meta.outputs.tags }}
build-args: |
"release=1"
- name: Docker meta
id: meta-arm64
uses: docker/metadata-action@v5
with:
images: quay.io/invidious/invidious
flavor: |
latest=false
suffix=-arm64
tags: |
type=semver,pattern={{version}}
type=raw,value=latest
labels: |
quay.expires-after=12w
- name: Build and push Docker ARM64 image for Push Event
uses: docker/build-push-action@v6
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"
+58 -18
View File
@@ -38,10 +38,11 @@ jobs:
matrix:
stable: [true]
crystal:
- 1.7.3
- 1.8.2
- 1.9.2
- 1.10.1
- 1.12.2
- 1.13.3
- 1.14.1
- 1.15.1
- 1.16.3
include:
- crystal: nightly
stable: false
@@ -51,15 +52,22 @@ jobs:
with:
submodules: true
- name: Install required APT packages
run: |
sudo apt install -y libsqlite3-dev
shell: bash
- name: Install Crystal
uses: crystal-lang/install-crystal@v1.8.0
uses: crystal-lang/install-crystal@v1.8.2
with:
crystal: ${{ matrix.crystal }}
- name: Cache Shards
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: ./lib
path: |
./lib
./bin
key: shards-${{ hashFiles('shard.lock') }}
- name: Install Shards
@@ -71,14 +79,6 @@ jobs:
- name: Run tests
run: crystal spec
- name: Run lint
run: |
if ! crystal tool format --check; then
crystal tool format
git diff
exit 1
fi
- name: Build
run: crystal build --warnings all --error-on-warnings --error-trace src/invidious.cr
@@ -90,10 +90,10 @@ jobs:
- uses: actions/checkout@v4
- name: Build Docker
run: docker-compose build --build-arg release=0
run: docker compose build --build-arg release=0
- name: Run Docker
run: docker-compose up -d
run: docker compose up -d
- name: Test Docker
run: while curl -Isf http://localhost:3000; do sleep 1; done
@@ -114,7 +114,7 @@ jobs:
uses: docker/setup-buildx-action@v3
- name: Build Docker ARM64 image
uses: docker/build-push-action@v5
uses: docker/build-push-action@v6
with:
context: .
file: docker/Dockerfile.arm64
@@ -124,4 +124,44 @@ jobs:
- name: Test Docker
run: while curl -Isf http://localhost:3000; do sleep 1; done
lint:
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
with:
submodules: true
- name: Install Crystal
id: lint_step_install_crystal
uses: crystal-lang/install-crystal@v1.8.2
with:
crystal: latest
- name: Cache Shards
uses: actions/cache@v4
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: |
if ! crystal tool format --check; then
crystal tool format
git diff
exit 1
fi
- name: Run Ameba linter
run: bin/ameba
+6 -9
View File
@@ -10,17 +10,14 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v8
- uses: actions/stale@v9
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 365
days-before-pr-stale: 90
days-before-close: 30
exempt-pr-labels: blocked
days-before-stale: 730
days-before-pr-stale: -1
days-before-close: 60
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-pr-label: "stale"
ascending: true
# Never mark feature requests/enhancements as stale
exempt-issue-labels: "feature-request,enhancement,exempt-stale"
# Exempt the following types of issues from being staled
exempt-issue-labels: "feature-request,enhancement,discussion,exempt-stale"
+452 -844
View File
File diff suppressed because it is too large Load Diff
+844
View File
@@ -0,0 +1,844 @@
# Note: This is no longer updated and links to omarroths repo, which doesn't exist anymore.
# 0.20.0 (2019-011-06)
# Version 0.20.0: Custom Playlists
It's been quite a while since the last release! There've been [198 commits](https://github.com/omarroth/invidious/compare/0.19.0..0.20.0) from 27 contributors.
A couple smaller features have since been added. Channel pages and playlists in particular have received a bit of a face-lift, with both now displaying their descriptions as expected, and playlists providing video count and published information. Channels will also now provide video descriptions in their RSS feed.
Turkish (tr), Chinese (zh-TW, in addition to zh-CN), and Japanese (jp) are all now supported languages. Thank you as always to the hard work done by translators that makes this possible.
The feed menu and default home page are both now configurable for registered and unregistered users, and is quite a bit of an improvement for users looking to reduce distractions for their daily use.
## For Administrators
`feed_menu` and `default_home` are now configurable by the user, and have therefore been moved into `default_user_preferences`:
```yaml
feed_menu: ["Popular", "Top"]
default_home: Top
# becomes:
default_user_preferences:
feed_menu: ["Popular", "Top"]
default_home: Top
```
Several new options have also been added, including the ability to set a support email for the instance using `admin_email: EMAIL`, and forcing the use of a specific connection in the case of rate-limiting using `force_resolve` (see below).
## For Developers
Authenticated endpoints are now [properly documented](https://github.com/omarroth/invidious/wiki/Authenticated-Endpoints), as well how to generate and use API tokens. My hope is that this makes some of the more [interesting](https://github.com/omarroth/invidious/wiki/Authenticated-Endpoints#get-apiv1authnotifications) endpoints more accessible for developers to use in their own applications.
API endpoints for interacting with custom playlists have also been added with documentation available [here](https://github.com/omarroth/invidious/wiki/Authenticated-Endpoints#get-apiv1authplaylists).
## Custom playlists
This is probably the feature that has been the longest in the pipe and that I'm quite pleased is now implemented. It is now possible to create custom playlists, which can be played and edited through Invidious. API endpoints have also been added (documentation [here](https://github.com/omarroth/invidious/wiki/Authenticated-Endpoints#get-apiv1authplaylists)).
Overall I'm quite pleased with how smoothly it has been rolled out and with the experience so far, and I'm exctited for how it can be extended and improved in future.
## [instances.invidio.us](https://instances.invidio.us)
It is now possible to view a list of public instances (as provided in the [wiki](https://github.com/omarroth/invidious/wiki/Invidious-Instances)) through an API or a pretty new interface [here](https://instances.invidio.us). It combines uptime information, statistics from each instance and basic information already provided in the wiki. I expect it should be much more user-friendly than compiling the information yourself, and is already used by [Invidition](https://codeberg.org/Booteille/Invidition) to provide a list of instances for users to choose from.
The site itself is licensed under the AGPLv3 and the source is available [here](https://github.com/omarroth/instances.invidio.us).
## Video unavailable [#811](https://github.com/omarroth/invidious/issues/811)
Many users have likely noticed this error message if using Invidious directly or through another service, such as FreeTube. This issue is caused by rate-limiting by Google, and is not a new issuee for projects like Invidious (notably [youtube-dl](https://github.com/ytdl-org/youtube-dl#http-error-429-too-many-requests-or-402-payment-required)) and appears to be affecting smaller, private instances as well.
There is not a permanent fix for administrators currently, however there is some information available [here](https://github.com/omarroth/invidious/issues/811#issuecomment-540017772) that may provide a temporary solution. Unfortanately, in most cases the best option is to wait for the instance to be unbanned or to move the instance to a different IP. A more informative error message is also now provided, which should help an administrator more quickly diagnose the problem.
For those interested, I would recommend following [#811](https://github.com/omarroth/invidious/issues/811) for any future progress on the issue.
## BAT verified publisher
I'm quite late to this announcement, however I'm pleased to mention that Invidious is now a BAT verified publisher! I would recommend looking [here](https://basicattentiontoken.org/about/) or [here](https://www.reddit.com/r/BATProject/comments/7cr7yc/new_to_bat_read_this_introduction_to_basic/) for learning more about what it is and how it works. Overall I think it makes an interesting substitute for services like Liberapay, and a (hopefully) much less-intrusive alternative to direct advertising.
BAT is combined under other cryptocurrencies below. Currently there's a fairly significant delay in payout, which is the reason for the large fluctuation in crypto donations between September and October (and also the reason for the late announcement).
## Release schedule
Currently I'm quite pleased with the current state of the project. There's plenty of things I'd still like to add, however at this point I expect the rate of most new additions will slow down a bit, with more focus on stabililty and any long-standing bugs.
Because of this, I'm planning on releasing a new version quarterly, with any necessary hotfixes being pushed as a new patch release as necessary. As always it will be possible to run Invidious directly from [master](https://github.com/omarroth/invidious/wiki/Updating) if you'd still like to have the lastest version.
I'll plan on providing finances each release, with a similar monthly breakdown as below.
## Finances for September 2019
### Donations
- [Patreon](https://www.patreon.com/omarroth) : \$64.37
- [Liberapay](https://liberapay.com/omarroth) : \$76.04
- Crypto : ~\$99.89 (converted from BAT, BCH, BTC)
- Total : \$240.30
### Expenses
- invidious-lb1 (nyc1) : \$10.00 (load balancer)
- invidious-update1 (s-1vcpu-1gb) : \$5.00 (updates feeds)
- invidious-node1 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node2 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node3 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node4 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node5 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node6 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node7 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node8 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node9 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node10 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node11 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node12 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node13 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node14 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node15 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node16 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-db1 (s-4vcpu-8gb) : \$40.00 (database)
- Total : \$135.00
## Finances for October 2019
- [Liberapay](https://liberapay.com/omarroth) : \$134.40
- Crypto : ~\$8.29 (converted from BAT, BCH, BTC)
- Total : \$142.69
### Expenses
- invidious-lb1 (nyc1) : \$5.00 (load balancer)
- invidious-lb2 (nyc1) : \$5.00 (load balancer)
- invidious-lb3 (nyc1) : \$5.00 (load balancer)
- invidious-lb4 (nyc1) : \$5.00 (load balancer)
- invidious-update1 (s-1vcpu-1gb) : \$5.00 (updates feeds)
- invidious-node1 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node2 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node3 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node4 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node5 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node6 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node7 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node8 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node9 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node10 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node11 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node12 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node13 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node14 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node15 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node16 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node17 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node18 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-db1 (s-4vcpu-8gb) : \$40.00 (database)
- Total : \$155.00
# 0.19.0 (2019-07-13)
# Version 0.19.0: Communities
Hello again everyone! Focus this month has mainly been on improving playback performance, along with a couple new features I'd like to announce. There have been [109 commits](https://github.com/omarroth/invidious/compare/0.18.0...0.19.0) this past month from 10 contributors.
This past month has seen the addition of Chinese (`zh-CN`) and Icelandic (`is`) translations. I would like to give a huge thanks to their respective translators, and again an enormous thanks to everyone who helps translate the site.
I'm delighted to mention that [FreeTube 0.6.0](https://github.com/FreeTubeApp/FreeTube) now supports 1080p thanks to the Invidious API. I would very much recommend reading the [relevant post](https://freetube.writeas.com/freetube-release-0-6-0-beta-1080p-and-a-lot-of-qol) for some more information on how it works, along with several other major improvements. Folks that are interested in adding similar functionality for their own projects should feel free to get in touch.
This past month there has been quite a bit of work on improving memory usage and improving download and playback speeds. As mentioned in the previous release, some extra hardware has been allocated which should also help with this. I'm still looking for ways to improve performance and feedback is always appreciated.
Along with performance, a couple quality of life improvements have been added, including author thumbnails and banners, clickable titles for embedded videos, and better styling for captions, among some other enhancements.
## Communities
Support for YouTube's [communities tab](https://creatoracademy.youtube.com/page/lesson/community-tab) has been added. It's a very interesting but surprisingly unknown feature. Essentially, providing comments for a channel, rather than a video, where an author can post updates for their subscribers.
It's commonly used to promote interesting links and foster discussion. I hope this feature helps people find more interesting content that otherwise would have been overlooked.
## For Developers
For accessing channel communities, an `/api/v1/channels/comments/:ucid` endpoint has been added, with similar behavior and schema to `/api/v1/comments/:id`, with an extra `attachment` field for top-level comments. More info on usage and available data can be found in the [wiki](https://github.com/omarroth/invidious/wiki/API#get-apiv1channelscommentsucid-apiv1channelsucidcomments).
An `/api/v1/auth/feeds` endpoint has been added for programmatically accessing a user's subscription feed, with options for displaying notifications and filtering an existing feed.
An `/api/v1/search/suggestions` endpoint has been added for retrieving suggestions for a given query.
## For Administrators
It is now possible to disable more resource intensive features, such as downloads and DASH functionality by adding `disable_proxy` to your config. See [#453](https://github.com/omarroth/invidious/issues/453) and the [Wiki](https://github.com/omarroth/invidious/wiki/Configuration) for more information and example usage. I expect this to be a big help for folks with limited bandwidth when hosting their own instances.
## Finances
### Donations
- [Patreon](https://www.patreon.com/omarroth) : \$38.39
- [Liberapay](https://liberapay.com/omarroth) : \$84.85
- Crypto : ~\$0.00 (converted from BCH, BTC)
- Total : \$123.24
### Expenses
- invidious-load1 (nyc1) : \$10.00 (load balancer)
- invidious-update1 (s-1vcpu-1gb) : \$5.00 (updates feeds)
- invidious-node1 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node2 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node3 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node4 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node5 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node6 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node7 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node8 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node9 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node10 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-db1 (s-4vcpu-8gb) : \$40.00 (database)
- Total : \$105.00
The goal on Patreon has been updated to reflect the above expenses. As mentioned above, the main reason for more hardware is to improve playback and download speeds, although I'm still looking into improving performance without allocating more hardware.
As always I'm grateful for everyone's support and feedback. I'll see you all next month.
# 0.18.0 (2019-06-06)
# Version 0.18.0: Native Notifications and Optimizations
Hope everyone has been doing well. This past month there have been [97 commits](https://github.com/omarroth/invidious/compare/0.17.0...0.18.0) from 10 contributors. For the most part changes this month have been on optimizing various parts of the site, mainly subscription feeds and support for serving images and other assets.
I'm quite happy to mention that support for Greek (`el`) has been added, which I hope will continue to make the site accessible for more users.
Subscription feeds will now only update when necessary, rather than periodically. This greatly lightens the load on DB as well as making the feeds generally more responsive when changing subscriptions, importing data, and when receiving new uploads.
Caching for images and other assets should be greatly improved with [#456](https://github.com/omarroth/invidious/issues/456). JavaScript has been pulled out into separate files where possible to take advantage of this, which should result in lighter pages and faster load times.
This past month several people have encountered issues with downloads and watching high quality video through the site, see [#532](https://github.com/omarroth/invidious/issues/532) and [#562](https://github.com/omarroth/invidious/issues/562). For this coming month I've allocated some more hardware which should help with this, and I'm also looking into optimizing how videos are currently served.
## For Developers
`viewCount` is now available for `/api/v1/popular` and all videos returned from `/api/v1/auth/notifications`. Both also now provide `"type"` for indicating available information for each object.
An `/authorize_token` page is now available for more easily creating new tokens for use in applications, see [this comment](https://github.com/omarroth/invidious/issues/473#issuecomment-496230812) in [#473](https://github.com/omarroth/invidious/issues/473) for more details.
A POST `/api/v1/auth/notifications` endpoint is also now available for correctly returning notifications for 150+ channels.
## For Administrators
There are two new schema changes for administrators: `views` for adding view count to the popular page, and `feed_needs_update` for tracking feed changes.
As always the relevant migration scripts are provided which should run when following instructions for [updating](https://github.com/omarroth/invidious/wiki/Updating). Otherwise, adding `check_tables: true` to your config will automatically make the required changes.
## Native Notifications
[<img src="https://omar.yt/81c3ae1839831bd9300d75e273b6552a86dc2352/native_notification.png" height="160" width="472">](https://omar.yt/81c3ae1839831bd9300d75e273b6552a86dc2352/native_notification.png "Example of native notification, available in repository under screnshots/native_notification.png")
It is now possible to receive [Web notifications](https://developer.mozilla.org/en-US/docs/Web/API/Notifications_API) from subscribed channels.
You can enable notifications by clicking "Enable web notifications" in your preferences. Generally they appear within 20-60 seconds of a new video being uploaded, and I've found them to be an enormous quality of life improvement.
Although it has been fairly stable, please feel free to report any issues you find [here](https://github.com/omarroth/invidious/issues) or emailing me directly at omarroth@protonmail.com.
Important to note for administrators is that instances require [`use_pubsub_feeds`](https://github.com/omarroth/invidious/wiki/Configuration) and must be served over HTTPS in order to correctly send web notifications.
## Finances
### Donations
- [Patreon](https://www.patreon.com/omarroth) : \$49.73
- [Liberapay](https://liberapay.com/omarroth) : \$100.57
- Crypto : ~\$11.12 (converted from BCH, BTC)
- Total : \$161.42
### Expenses
- invidious-load1 (nyc1) : \$10.00 (load balancer)
- invidious-update1 (s-1vcpu-1gb) : \$5.00 (updates feeds)
- invidious-node1 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node2 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node3 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node4 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node5 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node6 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-db1 (s-4vcpu-8gb) : \$40.00 (database)
- Total : \$85.00
See you all next month!
# 0.17.0 (2019-05-06)
# Version 0.17.0: Player and Authentication API
Hello everyone! This past month there have been [130 commits](https://github.com/omarroth/invidious/compare/0.16.0..0.17.0) from 11 contributors. Large focus has been on improving the player as well as adding API access for other projects to make use of Invidious.
There have also been significant changes in preparation of native notifications (see [#195](https://github.com/omarroth/invidious/issues/195), [#469](https://github.com/omarroth/invidious/issues/469), [#473](https://github.com/omarroth/invidious/issues/473), and [#502](https://github.com/omarroth/invidious/issues/502)), and playlists. I expect to see both of these to be added in the next release.
I'm quite happy to mention that new translations have been added for Esperanto (`eo`) and Ukranian (`uk`). Support for pluralization has also been added, so it should now be possible to make a more native experience for speakers in other languages. The system currently in place is a bit cumbersome, so for any help using this feature please get in touch!
## For Administrators
A `check_tables` option has been added to automatically migrate without the use of custom scripts. This method will likely prove to be much more robust, and is currently enabled for the official instance. To prevent any unintended changes to the DB, `check_tables` is disabled by default and will print commands before executing. Having this makes features that require schema changes much easier to implement, and also makes it easier to upgrade from older instances.
As part of [#303](https://github.com/omarroth/invidious/issues/303), a `cache_annotations` option has been added to speed up access from `/api/v1/annotations/:id`. This vastly improves the experience for videos with annotations. Currently, only videos that contain legacy annotations will be cached, which should help keep down the size of the cache. `cache_annotations` is disabled by default.
## For Developers
An authorization API has been added which allows other applications to read and modify user subscriptions and preferences (see [#473](https://github.com/omarroth/invidious/issues/473)). Support for accessing user feeds and notifications is also planned. I believe this feature is a large step forward in supporting syncing subscriptions and preferences with other services, and I'm excited to see what other developers do with this functionality.
Support for server-to-client push notifications is currently underway. This allows Invidious users, as well as applications using the Invidious API, to receive notifications about uploads in near real-time (see #469). An `/api/v1/auth/notifications` endpoint is currently available. I'm very excited for this to be integrated into the site, and to see how other developers use it in their own projects.
An `/api/v1/storyboards/:id` endpoint has been added for accessing storyboard URLs, which allows developers to add video previews to their players (see below).
## Player
Support for annotations has been merged into master with [#303](https://github.com/omarroth/invidious/issues/303), thanks @glmdgrielson! Annotations can be enabled by default or only for subscribed channels, and can also be toggled per video. I'm extremely proud of the progress made here, and I'm so thankful to everyone that has made this possible. I expect this to be the last update with regards to supporting annotations, but I do plan on continuing to improve the experience as much as possible.
The Invidious player now supports video previews and a corresponding API endpoint `/api/v1/storyboards/:id` has been added for developers looking to add similar functionality to their own players. Not much else to say here. Overall it's a very nice quality of life improvement and an attractive addition to the site.
It is now possible to select specific sources for videos provided using DASH (see [#34](https://github.com/omarroth/invidious/issues/34)). I would consider support largely feature complete, although there are still several issues to be fixed before I would consider it ready for larger rollout. You can watch videos in 1080p by setting `Default quality` to `dash` in your preferences, or by adding `&quality=dash` to the end of video URLs.
## Finances
### Donations
- [Patreon](https://www.patreon.com/omarroth) : \$49.73
- [Liberapay](https://liberapay.com/omarroth) : \$63.03
- Crypto : ~\$0.00 (converted from BCH, BTC)
- Total : \$112.76
### Expenses
- invidious-load1 (nyc1) : \$10.00 (load balancer)
- invidious-update1 (s-1vcpu-1gb) : \$5.00 (updates feeds)
- invidious-node1 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node2 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node3 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node4 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node5 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-db1 (s-4vcpu-8gb) : \$40.00 (database)
- Total : \$80.00
That's all for now. Thanks!
# 0.16.0 (2019-04-06)
# Version 0.16.0: API Improvements and Annotations
Hello again! This past month has seen [116 commits](https://github.com/omarroth/invidious/compare/0.15.0..0.16.0) from 13 contributors and a couple important changes I'd like to announce.
A privacy policy is now available [here](https://invidio.us/privacy). I've done my best to explain things as clearly as possible without oversimplifying, and would very much recommend reading it if you're concerned about your privacy and want to learn more about how Invidious uses your data. Please let me know if there is anything that needs clarification.
I'm also very happy to announce that a Spanish translation has been added to the site. You can use it with `?hl=es` or by setting `es` as your default locale. As always I'm extremely grateful to translators for making the site accessible to more people.
## For Administrators
Invidious now supports server-to-server [push notifications](https://developers.google.com/youtube/v3/guides/push_notifications). This uses [PubSubHubbub](https://pubsubhubbub.github.io/PubSubHubbub/pubsubhubbub-core-0.4.html) to automatically handle new videos sent to an instance, which is less resource intensive and generally faster. Note that it will not pull all videos from a subscribed channel, so recommended usage is in addition to `channel_threads`. Using PubSub requires a valid `domain` that updates can be sent to, and a random string that can be used to sign updates sent to the instance. You can enable it by adding `use_pubsub_feeds: true` to your `config.yml`. See [Configuration](https://github.com/omarroth/invidious/wiki/Configuration) for more info.
Unfortunately there are a couple necessary changes to the DB to support `liveNow` and `premiereTimestamp` in subscription feeds. Migration scripts have been provided that should be used automatically if following the instructions [here](https://github.com/omarroth/invidious/wiki/Updating).
You can now configure default user preferences for your instance. This allows you to set default locale, player preferences, and more. See [#415](https://github.com/omarroth/invidious/issues/415) for more details and example usage.
## For Developers
The [fields](https://developers.google.com/youtube/v3/getting-started#fields) API has been added with [#429](https://github.com/omarroth/invidious/pull/429) and is now supported on all JSON endpoints, thanks [**@afrmtbl**](https://github.com/afrmtbl)! Synax is straight-forward and can be used to reduce data transfer and create a simpler response for debugging. You can see an example [here](https://invidio.us/api/v1/videos/CvFH_6DNRCY?pretty=1&fields=title,recommendedVideos/title). I've been quite happy using it and hope it is similarly useful for others.
An `/api/v1/annotations/:id` endpoint has been added for pulling legacy annotation data from [this](https://archive.org/details/youtubeannotations) archive, see below for more details. You can also access annotation data available on YouTube using `?source=youtube`, although this will only return card data as legacy annotations were deleted on January 15th.
A couple minor changes to existing endpoints:
- A `premiereTimestamp` field has been added to `/api/v1/videos/:id`
- A `sort_by` param has been added to `/api/v1/comments/:id`, supports `new`, `top`.
More info is available in the [documentation](https://github.com/omarroth/invidious/wiki/API).
## Annotations
I'm pleased to announce that annotation data is finally available from the roughly 1.4 billion videos archived as part of [this](https://www.reddit.com/r/DataHoarder/comments/aa6czg/youtube_annotation_archive/) project. They are accessible from the Internet Archive [here](https://archive.org/details/youtubeannotations) or as a 355GB torrent, see [here](https://www.reddit.com/r/DataHoarder/comments/b7imx9/youtube_annotation_archive_annotation_data_from/) for more details. A corresponding `/api/v1/annotations/:id` endpoint has been added to Invidious which uses the collection from IA to provide legacy annotations.
Support for them in the player is possible thanks to [this](https://github.com/afrmtbl/videojs-youtube-annotations) plugin developed by [**@afrmtbl**](https://github.com/afrmtbl). A PR for adding support to the site is available as [#303](https://github.com/omarroth/invidious/pull/303). There's also an [extension](https://github.com/afrmtbl/AnnotationsRestored) for overlaying them on top of the YouTube player (again thanks to [**@afrmtbl**](https://github.com/afrmtbl)), and an [extension](https://tech234a.bitbucket.io/AnnotationsReloaded?src=invidious) for hooking into code still present in the YouTube player itself, developed by [**@tech234a**](https://github.com/tech234a).
I would recommend reading the [official announcement](https://www.reddit.com/r/DataHoarder/comments/b7imx9/youtube_annotation_archive_annotation_data_from/) for more details. I would like to again thank everyone that helped contribute to this project.
## Finances
### Donations
- [Patreon](https://www.patreon.com/omarroth) : \$42.42
- [Liberapay](https://liberapay.com/omarroth) : \$70.11
- Crypto : ~\$1.76 (converted from BCH, BTC, BSV)
- Total : \$114.29
### Expenses
- invidious-load1 (nyc1) : \$10.00 (load balancer)
- invidious-update1 (s-1vcpu-1gb) : \$5.00 (updates feeds)
- invidious-node1 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node2 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node3 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node4 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node5 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-db1 (s-4vcpu-8gb) : \$40.00 (database)
- Total : \$80.00
This past month the site saw a couple abnormal peaks in traffic, so an additional webserver has been added to match the increased load. The goal on Patreon has been updated to match the above expenses.
Thanks everyone!
# 0.15.0 (2019-03-06)
## Version 0.15.0: Preferences and Channel Playlists
The project has seen quite a bit of activity this past month. Large focus has been on fixing bugs, but there's still quite a few new features I'm happy to announce. There have been [133 commits](https://github.com/omarroth/invidious/compare/0.14.0...0.15.0) from 15 contributors this past month.
As a couple miscellaneous changes, a couple [nice screenshots](https://github.com/omarroth/invidious#screenshots) have been added to the README, so folks can see more of what the site has to offer without creating an account.
The footer has also been cleaned up quite a bit, and now displays the current version, so it's easier to know what features are available from the current instance.
## For Administrators
This past month there has been a minor release - `0.14.1` - which fixes a breaking change made by YouTube for their polymer redesign.
There have been several new features that unfortunately require a database migration. There are migration scripts provided in `config/migrate-scripts`, and the [wiki](https://github.com/omarroth/invidious/wiki/Updating) has instructions for automatically applying them. I'll do my best to keep those changes to a minimum, and expect to see a corresponding script to automatically apply any new changes.
Administrator preferences have been added with [#312](https://github.com/omarroth/invidious/issues/312), which allows administrators to customize their instance. Administrators can change the order of feed menus, change the default homepage, disable open registration, and several other options. There's a short 'how-to' [here](https://github.com/omarroth/invidious/issues/312#issuecomment-468831842), and the new options are documented [here](https://github.com/omarroth/invidious/wiki/Configuration).
An `/api/v1/stats` endpoint has been added with [#356](https://github.com/omarroth/invidious/issues/356), which reports the instance version and number of active users. Statistics are disabled by default, and can be enabled in administator preferences. Statistics for the official instance are available [here](https://invidio.us/api/v1/stats?pretty=1).
## For Developers
`/api/v1/channels/:ucid` now provides an `autoGenerated` tag, which returns true for topic channels, and larger genre channels generated by YouTube. These channels don't have any videos of their own, so `latestVideos` will be empty. It is recommended instead to display a list of playlists generated by YouTube.
You can now pull a list of playlists from a channel with `/api/v1/channels/playlists/:ucid`. Supported options are documented in the [wiki](https://github.com/omarroth/invidious/wiki/API#get-apiv1channelsplaylistsucid-apiv1channelsucidplaylists). Pagination is handled with a `continuation` token, which is generated on each call. Of note is that auto-generated channels currently have one page of results, and subsequent calls will be empty.
For quickly pulling the latest 30 videos from a channel, there is now `/api/v1/channels/latest/:ucid`. It is much faster than a call to `/api/v1/channels/:ucid`. It will not convert an author name to a valid ucid automatically, and will not return any extra data about a channel.
## Preferences
In addition to administrator preferences mentioned above, you can now change your preferences without an account (see [#42](https://github.com/omarroth/invidious/pull/42)). I think this is quite an improvement to the usability of the site, and is much friendlier to privacy-conscious folks that don't want to make an account. Preferences will be automatically imported to a newly created account.
Several issues with sorting subscriptions have been fixed, and `/manage_subscriptions` has been sped up significantly. The subscription feed has also seen a bump in performance. Delayed notifications have unfortunately started becoming a problem now that there are more users on the site. Some new changes are currently being tested which should mostly resolve the issue, so expect to see more in the next release.
## Channel Playlists
You can now view available playlists from a channel, and [auto-generated channels](https://invidio.us/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ) are no longer empty. You can sort as you would on YouTube, and all the same functionality should be available. I'm quite pleased to finally have it implemented, since it's currently the only data available from the above mentioned auto-generated channels, and makes it much easier to consume music on the site.
There's also more discussion on improving Invidious for streaming music in [#304](https://github.com/omarroth/invidious/issues/304), and adding support for music.youtube.com. I would appreciate any thoughts on how to improve that experience, since it's a very large and useful part of YouTube.
## Finances
### Donations
- [Patreon](https://www.patreon.com/omarroth) : \$42.42
- [Liberapay](https://liberapay.com/omarroth) : \$30.97
- Crypto : ~\$0.00 (converted from BCH, BTC)
- Total : \$73.39
### Expenses
- invidious-load1 (nyc1) : \$10.00 (load balancer)
- invidious-update1 (s-1vcpu-1gb) : \$5.00 (updates feeds)
- invidious-node1 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node2 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node3 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node4 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-db1 (s-4vcpu-8gb) : \$40.00 (database)
- Total : \$75.00
It's been very humbling to see how fast the project has grown, and I look forward to making the site even better. Thank you everyone.
# 0.14.0 (2019-02-06)
## Version 0.14.0: Community
This last month several contributors have made improvements specifically for the people using this project. New pages have been added to the wiki, and there is now a [Matrix Server](https://riot.im/app/#/room/#invidious:matrix.org) and IRC channel so it's easier and faster for people to ask questions or chat. There have been [101 commits](https://github.com/omarroth/invidious/compare/0.13.0...0.14.0) since the last major release from 8 contributors.
It has come to my attention in the past month how many people are self-hosting, and I would like to make it easier for them to do so.
With that in mind, expect future releases to have a section for For Administrators (if any relevant changes) and For Developers (if any relevant changes).
## For Administrators
This month the most notable change for administrators is releases. As always, there will be a major release each month. However, a new minor release will be made whenever there are any critical bugs that need to be fixed.
This past month is the first time there has been a minor release - `0.13.1` - which fixes a breaking change made by YouTube. Administrators using versioning for their instances will be able to rely on the latest version, and should have a system in place to upgrade their instance as soon as a new release is available.
Several new pages have been added to the [wiki](https://github.com/omarroth/invidious/wiki#for-administrators) (as mentioned below) that will help administrators better setup their own instances. Configuration, maintenance, and instructions for updating are of note, as well as several common issues that are encountered when first setting up.
## For Developers
There's now a `pretty=1` parameter for most endpoints so you can view data easily from the browser, which is convenient for debugging and casual use. You can see an example [here](https://invidio.us/api/v1/videos/CvFH_6DNRCY?pretty=1).
Unfortunately the `/api/v1/insights/:id` endpoint is no longer functional, as YouTube removed all publicly available analytics around a month ago. The YouTube endpoint now returns a 404, so it's unlikely it will be functional again.
## Wiki
There have been a sizable number of changes to the Wiki, including a [list of public Invidious instances](https://github.com/omarroth/invidious/wiki/Invidious-Instances), the [list of extensions](https://github.com/omarroth/invidious/wiki/Extensions), and documentation for administrators (as mentioned above) and developers.
The wiki is editable by anyone so feel free to add anything you think is useful.
## Matrix & IRC
Thee is now a [Matrix Server](https://riot.im/app/#/room/#invidious:matrix.org) for Invidious, so please feel free to hop on if you have any questions or want to chat. There is also a registered IRC channel: #invidious on Freenode which is bridged to Matrix.
## Features
Several new features have been added, including a download button, creator hearts and comment colors, and a French translation.
There have been fixes for Google logins, missing text in locales, invalid links to genre channels, and better error handling in the player, among others.
Several fixes and features are omitted for space, so I'd recommend taking a look at the [compare tab](https://github.com/omarroth/invidious/compare/0.13.0...0.14.0) for more information.
## Annotations Update
Annotations were removed January 15th, 2019 around15:00 UTC. Before they were deleted we were able to archive annotations from around 1.4 billion videos. I'd very much recommend taking a look [here](https://www.reddit.com/r/DataHoarder/comments/al7exa/youtube_annotation_archive_update_and_preview/) for more information and a list of acknowledgements. I'm extremely thankful to everyone who was able to contribute and I'm glad we were able to save such a large part of internet history.
There's been large strides in supporting them in the player as well, which you can follow in [#303](https://github.com/omarroth/invidious/pull/303). You can preview the functionality at https://dev.invidio.us . Before they are added to the main site expect to see an option to disable them, both site-wide and per video.
Organizing this project has unfortunately taken up quite a bit of my time, and I've been very grateful for everyone's patience.
## Finances
### Donations
- [Patreon](https://www.patreon.com/omarroth) : \$49.42
- [Liberapay](https://liberapay.com/omarroth) : \$27.89
- Crypto : ~\$0.00 (converted from BCH, BTC)
- Total : \$77.31
### Expenses
- invidious-load1 (nyc1) : \$10.00 (load balancer)
- invidious-update1 (s-1vcpu-1gb) : \$5.00 (updates feeds)
- invidious-node1 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node2 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node3 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node4 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-db1 (s-4vcpu-8gb) : \$40.00 (database)
- Total : \$75.00
As always I'm grateful for everyone's contributions and support. I'll see you all in March.
# 0.13.1 (2019-01-19)
##
# 0.13.0 (2019-01-06)
## Version 0.13.0: Translations, Annotations, and Tor
I hope everyone had a happy New Year! There's been a couple new additions since last release, with [44 commits](https://github.com/omarroth/invidious/compare/0.12.0...0.13.0) from 9 contributors. It's been quite a year for the project, and I hope to continue improving the project into 2019! Starting off the new year:
## Translations
I'm happy to announce support for translations has been added with [`a160c64`](https://github.com/omarroth/invidious/a160c64). Currently, there is support for:
- Arabic (`ar`)
- Dutch (`nl`)
- English (`en-US`)
- German (`de`)
- Norwegian Bokmål (`nb_NO`)
- Polish (`pl`)
- Russian (`ru`)
Which you can change in your preferences under `Language`. You can also add `&hl=LANGUAGE` to the end of any request to translate it to your preferred language, for example https://invidio.us/?hl=ru. I'd like to say thank you again to everyone who has helped translate the site! I've mentioned this before, but I'm delighted that so many people find the project useful.
## Annotations
Recently, [YouTube announced that all annotations will be deleted on January 15th, 2019](https://support.google.com/youtube/answer/7342737). I believe that annotations have a very important place in YouTube's history, and [announced a project to archive them](https://www.reddit.com/r/DataHoarder/comments/aa6czg/youtube_annotation_archive/).
I expect annotations to be supported in the Invidious player once archiving is complete (see [#110](https://github.com/omarroth/invidious/issues/110) for details), and would also like to host them for other developers to use in their projects.
The code is available [here](https://github.com/omarroth/archive), and contains instructions for running a worker if you would like to contribute. There's much more information available in the announcement as well for anyone who is interested.
## Tor
I unfortunately missed the chance to mention this in the previous release, but I'm now happy to announce that you can now view Invidious through Tor at the following links:
kgg2m7yk5aybusll.onion
axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion
Invidious is well suited to use through Tor, as it does not require any JS and is fairly lightweight. I'd recommend looking [here](https://diasp.org/posts/10965196) and [here](https://www.reddit.com/r/TOR/comments/a3c1ak/you_can_now_watch_youtube_videos_anonymously_with/) for more details on how to use the onion links, and would like to say thank you to [/u/whonix-os](https://www.reddit.com/user/whonix-os) for suggesting it and providing support setting setting them up.
## Popular and Trending
You can now easily view videos trending on YouTube with [`a16f967`](https://github.com/omarroth/invidious/a16f967). It also provides support for viewing YouTube's various categories categories, such as `News`, `Gaming`, and `Music`. You can also change the `region` parameter to view trending in different countries, which should be made easier to use in the coming weeks.
A link to `/feed/popular` has also been added, which provides a list of videos sorted using the algorithm described [here](https://github.com/omarroth/invidious/issues/217#issuecomment-436503761). I think it better reflects what users watch on the site, but I'd like to hear peoples' thoughts on this and on how it could be improved.
## Finances
### Donations
- [Patreon](https://www.patreon.com/omarroth): \$64.63
- [Liberapay](https://liberapay.com/omarroth) : \$30.05
- Crypto : ~\$28.74 (converted from BCH, BTC)
- Total : \$123.42
### Expenses
- invidious-load1 (nyc1) : \$10.00 (load balancer)
- invidious-update1 (s-1vcpu-1gb) : \$5.00 (updates feeds)
- invidious-node1 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node2 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node3 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node4 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-db1 (s-4vcpu-8gb) : \$40.00 (database)
- Total : \$75.00
### What will happen with what's left over?
I believe this is the first month that all expenses have been fully paid for by donations. Thank you! I expect to allocate the current amount for hardware to improve performance and for hosting annotation data, as mentioned above.
Anything that is left over is kept to continue hosting the project for as long as possible. Thank you again everyone!
I think that's everything for 2018. There's lots still planned, and I'm very excited for the future of this project!
# 0.12.0 (2018-12-06)
## Version 0.12.0: Accessibility, Privacy, Transparency
Hello again, it's been a while! A lot has happened since the last release. Invidious has seen [134 commits](https://github.com/omarroth/invidious/compare/0.11.0...0.12.0) from 3 contributors, and I'm quite happy with the progress that has been made. I enjoyed this past month, and I believe having a monthly release schedule allows me to focus on more long-term improvements, and I hope people enjoy these more substantial updates as well.
## Accessability and Privacy
There have been quite a few improvements for user privacy, and improvements that improve accessibility for both people and software.
You can now view comments without JS with [`19516ea`](https://github.com/omarroth/invidious/19516ea). Currently, this functionality is limited to the first 20 comments, but expect this functionality to be improved to come as close to the JS version as possible. Folks can track progress in [#204](https://github.com/omarroth/invidious/issues/204).
Invidious is now compatible with [LibreJS](https://www.gnu.org/software/librejs/), and provides license information [here](https://invidio.us/licenses) with [`7f868ec`](https://github.com/omarroth/invidious/7f868ec). As expected, all libraries are compatible under the AGPLv3, and I'm happy to mention that no other changes were required to make Invidious compatible with LibreJS.
A DNT policy has also been added with [`9194f47`](https://github.com/omarroth/invidious/9194f47) for compatibility with [Privacy Badger](https://www.eff.org/privacybadger). I'm pleased to mention that here too no other changes had to be made in order for Invidious to be compatible with this extension. I expect a privacy policy to be added soon as well, so users can better understand how Invidious uses their data.
For users that are visually impaired, there is now a text CAPTCHA available so it's easier to register and login. Because of the simple front-end of the project, I expect screen readers and other software to be able to easily understand the site's interface. In combination with the ability to listen-only, I believe Invidious is much more accessible than YouTube. Folks can read [#244](https://github.com/omarroth/invidious/issues/244) for more details, and I would very much appreciate any feedback on how this can be improved.
## User Preferences
There have been a lot of improvements to preferences. Options for enabling audio-only by default and continuous playback (autoplay) have been added with [`e39dec9`](https://github.com/omarroth/invidious/e39dec9), with [`4b76b93`](https://github.com/omarroth/invidious/4b76b93), respectively. Users can also now mark videos as watched from their subscription feed and view watch history by going to https://invidio.us/feed/history. I expect to add more information to history so that it's easier to use. Folks can track progress with [#182](https://github.com/omarroth/invidious/issues/182). As with all data Invidious keeps, watch history can be exported [here](https://invidio.us/data_control).
Users can now delete their account with [`b9c29bf`](https://github.com/omarroth/invidious/b9c29bf). This will remove _all_ user data from Invidious, including session IDs, watch history, and subscriptions. As mentioned above, it's easy to export that data and import it to a local instance, or export subscriptions for use with other applications such as [FreeTube](https://github.com/FreeTubeApp/FreeTube) or [NewPipe](https://github.com/TeamNewPipe/NewPipe).
## Translation and Internationalis(z)ation
Invidious has been approved for hosting by Weblate, available [here](https://hosted.weblate.org/projects/invidious/translations/). At the time of writing, translations for Arabic, Dutch, German, Polish, and Russian are currently underway. I would like to say a very big thank you to everyone working on them, and I hope to fully support them within around 2 weeks. Folks can track progress with [#251](https://github.com/omarroth/invidious/issues/251).
## Transperency and Finances
For the sake of transparency, I plan on publishing each month's finances. This is currently already done on Liberapay and Patreon, but there is not a total amount currently provided anywhere, and I would also like to include expenses to provide a better explanation of how patrons' money is being spent.
### Donations
- [Patreon](https://www.patreon.com/omarroth): \$43.60 (Patreon takes roughly 9%)
- [Liberapay](https://liberapay.com/omarroth) : \$22.10
- Crypto : ~\$1.25 (converted from BCH, BTC)
- Total : \$66.95
### Expenses
- invidious-load1 (nyc1) : \$10.00 (load balancer)
- invidious-update1 (s-1vcpu-1gb) : \$5.00 (updates feeds)
- invidious-node1 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node2 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node3 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-node4 (s-1vcpu-1gb) : \$5.00 (web server)
- invidious-db1 (s-4vcpu-8gb) : \$40.00 (database)
- Total : \$75.00
I'd be happy to provide any explanation where needed. I would also like to thank everyone who donates, it really helps and I can't say how happy I am to see that so many people find it valuable.
That's all for this month. I wish everyone the best for the holidays, and I'll see you all again in January!
# 0.11.0 (2018-10-23)
## Week 11: FreeTube and Styling
This past Friday I'm been very excited to see that FreeTube version [0.4.0](https://github.com/FreeTubeApp/FreeTube/tree/0.4.0) has been released! I'd recommend taking a look at the official patch notes, but to spoil a little bit here: FreeTube now uses the Invidious API for _all_ requests previously sent to YouTube, and has also seen support for playlists, keyboard shortcuts, and more default settings (speed, autoplay, and subtitles). I'm happy to see that FreeTube has reached 500 stars on Github, and I think it's very much deserved. I'd recommend keeping an eye on the newly-launched [FreeTube blog](https://freetube.writeas.com/) for updates on the project.
Quite a few styling changes have been added this past week, including channel subscriber count to the subscribe and unsubscribe buttons. The changes sound small, but they've been a very big improvement and I'm quite satisfied with how they look. Also to note is that partial support for duration in thumbnails have been added with [#202](https://github.com/omarroth/invidious/issues/202). Overall, I think the site is becoming much more pleasing visually, and I hope to continue to improve it.
I've been very pleased to see Invidious in its current state, and I believe it's many times more mature compared to even a month ago. Changes have also started slowing down a bit as it's become more mature, and therefore I'd like to transition to a monthly update schedule in order to provide more comprehensive updates for everyone. I want to thank you all for helping me reach this point. I can't say how happy I am for Invidious to be where it is now.
Enjoy the rest of your week everyone, I'll see you in November!
# 0.10.0 (2018-10-16)
## Week 10: Subscriptions
This week I'm happy to announce that subscriptions have been drastically sped up with
35e63fa. As I mentioned last week, this essentially "caches" a user's feed, meaning that operations that previously took 20 seconds or timed out, now can load in under a second. I'd take a look at [#173](https://github.com/omarroth/invidious/issues/173) for a sample benchmark. Previously features that made Invidious's feed so useful, such as filtering by unseen and by author would take too long to load, and so instead would timeout. I'm very happy that this has been fixed, and folks can get back to using these features.
Among some smaller features that have been added this week include [#118](https://github.com/omarroth/invidious/issues/118), which adds, in my opinion, some very attractive subscribe and unsubscribe buttons. I think it's also a bit of a functional improvement as well, since it doesn't require a user to reload the page in order to subscribe or unsubscribe to a channel, and also gives the opportunity to put the channel's sub count on display.
An option to swap between Reddit and YouTube comments without a page reload has been added with
5eefab6, bringing it somewhat closer in functionality to the popular [AlienTube](https://github.com/xlexi/alientube) extension, on which it is based (although the extension unfortunately appears now to be fragmented).
As always, there are a couple smaller improvements this week, including some minor fixes for geo-bypass with
e46e618 and [`245d0b5`](https://github.com/omarroth/invidious/245d0b5), playlist preferences with [`81b4477`](https://github.com/omarroth/invidious/81b4477), and YouTube comments with [`02335f3`](https://github.com/omarroth/invidious/02335f3).
This coming week I'd also recommend keeping an eye on the excellent [FreeTube](https://github.com/FreeTubeApp/FreeTube), which is looking forward to a new release. I've been very lucky to work with [**@PrestonN**](https://github.com/PrestonN) for the past few weeks to improve the Invidious API, and I'm quite looking forward to the new release.
That's all for this week folks, thank you all again for your continued interest and support.
# 0.9.0 (2018-10-08)
## Week 9: Playlists
Not as much to announce this week, but I'm still quite happy to announce a couple things, namely:
Playback support for playlists has finally been added with [`88430a6`](https://github.com/omarroth/invidious/88430a6). You can now view playlists with the `&list=` query param, as you would on YouTube. You can also view mixes with the mentioned `&list=`, although they require some extra handling that I would like to add in the coming week, as well as adding playlist looping and shuffle. I think playback support has been a roadblock for more exciting features such as [#114](https://github.com/omarroth/invidious/issues/114), and I look forward to improving the experience.
Comments have had a bit of a cosmetic upgrade with [#132](https://github.com/omarroth/invidious/issues/132), which I think helps better distinguish between Reddit and YouTube comments, as it makes them appear similarly to their respective sites. You can also now switch between YouTube and Reddit comments with a push of a button, which I think is quite an improvement, especially for newer or less popular videos with fewer comments.
I've had a small breakthrough in speeding up users' subscription feeds with PostgreSQL's [materialized views](https://www.postgresql.org/docs/current/static/rules-materializedviews.html). Without going into too much detail, materialized views essentially cache the result of a query, making it possible to run resource-intensive queries once, rather than every time a user visits their feed. In the coming week I hope to push this out to users, and hopefully close [#173](https://github.com/omarroth/invidious/issues/173).
I haven't had as much time to work on the project this week, but I'm quite happy to have added some new features. Have a great week everyone.
# 0.8.0 (2018-10-02)
## Week 8: Mixes
Hello again!
Mixes have been added with [`20130db`](https://github.com/omarroth/invidious/20130db), which makes it easy to create a playlist of related content. See [#188](https://github.com/omarroth/invidious/issues/188) for more info on how they work. Currently, they return the first 50 videos rather than a continuous feed to avoid tracking by Google/YouTube, which I think is a good trade-off between usability and privacy, and I hope other folks agree. You can create mixes by adding `RD` to the beginning of a video ID, an example is provided [here](https://www.invidio.us/mix?list=RDYE7VzlLtp-4) based on Big Buck Bunny. I've been quite happy with the results returned for the mixes I've tried, and it is not limited to music, which I think is a big plus. To emulate a continuous feed provided many are used to, using the last video of each mix as a new 'seed' has worked well for me. In the coming week I'd like to to add playback support in the player to listen to these easily.
A very big thanks to [**@flourgaz**](https://github.com/flourgaz) for Docker support with [#186](https://github.com/omarroth/invidious/pull/186). This is an enormous improvement in portability for the project, and opens the door for Heroku support (see [#162](https://github.com/omarroth/invidious/issues/162)), and seamless support on Windows. For most users, it should be as easy as running `docker-compose up`.
I've spent quite a bit of time this past week improving support for geo-bypass (see [#92](https://github.com/omarroth/invidious/issues/92)), and am happy to note that Invidious has been able to proxy ~50% of the geo-restricted videos I've tried. In addition, you can now watch geo-restricted videos if you have `dash` enabled as your `preferred quality`, for more details see [#34](https://github.com/omarroth/invidious/issues/34) and [#185](https://github.com/omarroth/invidious/issues/185), or last week's update. For folks interested in replicating these results for themselves, I'd take a look [here](https://gist.github.com/omarroth/3ce0f276c43e0c4b13e7d9cd35524688) for the script used, and [here](https://gist.github.com/omarroth/beffc4a76a7b82a422e1b36a571878ef) for a list of videos restricted in the US.
1080p has seen a fairly smooth roll-out, although there have been a couple issues reported, mainly [#193](https://github.com/omarroth/invidious/issues/193), which is likely an issue in the player. I've also encountered a couple other issues myself that I would like to investigate. Although none are major, I'd like to keep 1080p opt-in for registered users another week to better address these issues.
Have an excellent week everyone.
# 0.7.0 (2018-09-25)
## Week 7: 1080p and Search Types
Hello again everyone! I've got quite a couple announcements this week:
Experimental 1080p support has been added with [`b3ca392`](https://github.com/omarroth/invidious/b3ca392), and can be enabled by going to preferences and changing `preferred video quality` to `dash`. You can find more details [here](https://github.com/omarroth/invidious/issues/34#issuecomment-424171888). Currently quality and speed controls have not yet been integrated into the player, but I'd still appreciate feedback, mainly on any issues with buffering or DASH playback. I hope to integrate 1080p support into the player and push support site-wide in the coming weeks.
You can now filter content types in search with the `type:TYPE` filter. Supported content types are `playlist`, `channel`, and `video`. More info is available [here](https://github.com/omarroth/invidious/issues/126#issuecomment-423823148). I think this is quite an improvement in usability and I hope others find the same.
A [CHANGELOG](https://github.com/omarroth/invidious/blob/master/CHANGELOG.md) has been added to the repository, so folks will now receive a copy of all these updates when cloning. I think this is an improvement in hosting the project, as it is no longer tied to the `/releases` tab on Github or the posts on Patreon.
Recently, users have been reporting 504s when attempting to access their subscriptions, which is tracked in [#173](https://github.com/omarroth/invidious/issues/173). This is most likely caused by an uptick in usage, which I am absolutely grateful for, but unfortunately has resulted in an increase in costs for hosting the site, which is why I will be bumping my goal on Patreon from $60 to $80. I would appreciate any feedback on how subscriptions could be improved.
Other minor improvements include:
- Additional regions added to bypass geo-block with [`9a78523`](https://github.com/omarroth/invidious/9a78523)
- Fix for playlists containing less than 100 videos (previously shown as empty) with [`35ac887`](https://github.com/omarroth/invidious/35ac887)
- Fix for `published` date for Reddit comments (previously showing negative seconds) with [`6e09202`](https://github.com/omarroth/invidious/6e09202)
Thank you everyone for your support!
# 0.6.0 (2018-09-18)
## Week 6: Filters and Thumbnails
Hello again! This week I'm happy to mention a couple new features to search as well as some miscellaneous usability improvements.
You can now constrain your search query to a specific channel with the `channel:CHANNEL` filter (see [#165](https://github.com/omarroth/invidious/issues/165) for more details). Unfortunately, other search filters combined with channel search are not yet supported. I hope to add support for them in the coming weeks.
You can also now search only your subscriptions by adding `subscriptions:true` to your query (see [#30](https://github.com/omarroth/invidious/issues/30) for more details). It's not quite ready for widespread use but I would appreciate feedback as the site updates to fully support it. Other search filters are not yet supported with `subscriptions:true`, but I hope to add more functionality to this as well.
With [#153](https://github.com/omarroth/invidious/issues/153) and [#168](https://github.com/omarroth/invidious/issues/168) all images on the site are now proxied through Invidious. In addition to offering the user more protection from Google's eyes, it also allows the site to automatically pick out the highest resolution thumbnail for videos. I think this is quite a large aesthetic improvement and I hope others will find the same.
As a smaller improvement to the site, you can also now view RSS feeds for playlists with [#113](https://github.com/omarroth/invidious/issues/113).
These updates are also now listed under Github's [releases](https://github.com/omarroth/invidious/releases). I'm also planning on adding them as a `CHANGELOG.md` in the repository itself so people can receive a copy with the project's source.
That's all for this week. Thank you everyone for your support!
# 0.5.0 (2018-09-11)
## Week 5: Privacy and Security
I hope everyone had a good weekend! This past week I've been fixing some issues that have been brought to my attention to help better protect users and help them keep their anonymity.
An issue with open referers has been fixed with [`29a2186`](https://github.com/omarroth/invidious/29a2186), which prevents potential redirects to external sites on actions such as login or modifying preferences.
Additionally, X-XSS-Protection, X-Content-Type-Options, and X-Frame-Options headers have been added with [`96234e5`](https://github.com/omarroth/invidious/96234e5), which should keep users safer while using the site.
A potential XSS vector has also been fixed in YouTube comments with [`8c45694`](https://github.com/omarroth/invidious/8c45694).
All the above vulnerabilities were brought to my attention by someone who wishes to remain anonymous, but I would like to say again here how thankful I am. If anyone else would like to get in touch please feel free to email me at omarroth@hotmail.com or omarroth@protonmail.com.
This week a couple changes have been made to better protect user's privacy as well.
All CSS and JS assets are now served locally with [`3ec684a`](https://github.com/omarroth/invidious/3ec684a), which means users no longer need to whitelist unpkg.com. Although I personally have encountered few issues, I understand that many folks would like to keep their browsing activity contained to as few parties as possible. In the coming week I also hope to proxy YouTube images, so that no user data is sent to Google.
YouTube links in comments now should redirect properly to the Invidious alternate with [`1c8bd67`](https://github.com/omarroth/invidious/1c8bd67) and [`cf63c82`](https://github.com/omarroth/invidious/cf63c82), so users can more easily evade Google tracking.
I'm also happy to mention a couple quality of life features this week:
Invidious now shows a video's "license" if provided, see [#159](https://github.com/omarroth/invidious/issues/159) for more details. You can also search for videos licensed under the creative commons with "QUERY features:creative_commons".
Videos with only one source will always display the cog for changing quality, so that users can see what quality is currently playing. See [#158](https://github.com/omarroth/invidious/issues/158) for more details.
Folks have also probably noticed that the gutters on either side of the screen have been shrunk down quite significantly, so that more of the screen is filled with content. Hopefully this can be improved even more in the coming weeks.
"Music", "Sports", and "Popular on YouTube" channels now properly display their videos. You can subscribe to these channels just as you would normally.
This coming week I'm planning on spending time with my family, so I unfortunately may not be as responsive. I do still hope to add some smaller features for next week however, and I hope to continue development soon.
Thank you everyone again for your support.
# 0.4.0 (2018-09-06)
## Week 4: Genre Channels
Hello! I hope everyone enjoyed their weekend. Without further ado:
Just today genre channels have been added with [#119](https://github.com/omarroth/invidious/issues/119). More information on genre channels is available [here](https://support.google.com/youtube/answer/2579942). You can subscribe to them as normally, and view them as RSS. I think they offer an interesting alternative way to find new content and I hope people find them useful.
This past week folks have started reporting 504s on their subscription page (see [#144](https://github.com/omarroth/invidious/issues/144) for more details). Upgrading the database server appeared to fix the issue, as well as providing a smoother experience across the site. Unfortunately, that means I will be increasing the goal from $50 to $60 in order to meet the increased hosting costs.
With [#134](https://github.com/omarroth/invidious/issues/134), comments are now formatted correctly, providing support for bold, italics, and links in comments. I think this improvement makes them much easier to read, and I hope others find the same. Also to note is that links in both comments and the video description now no longer contain any of Google's tracking with [#115](https://github.com/omarroth/invidious/issues/115).
One of the major use cases for Invidious is as a stripped-down version of YouTube. In line with that, I'm happy to announce that you can now hide related videos if you're logged in, for users that prefer an even more lightweight experience.
Finally, I'm pleased to announce that Invidious has hit 100 stars on GitHub. I am very happy that Invidious has proven to be useful to so many people, and I can't say how grateful I am to everyone for their continued support.
Enjoy the rest of your week everyone!
# 0.3.0 (2018-09-06)
## Week 3: Quality of Life
Hello everyone! This week I've been working on some smaller features that will hopefully make the site more functional.
Search filters have been added with [#126](https://github.com/omarroth/invidious/issues/126). You can now specify 'sort', 'date', 'duration', and 'features' within your query using the 'operator:value' syntax. I'd recommend taking a look [here](https://github.com/omarroth/invidious/blob/master/src/invidious/search.cr#L33-L114) for a list of supported options and at [#126](https://github.com/omarroth/invidious/issues/126) for some examples. This also opens the door for features such as [#30](https://github.com/omarroth/invidious/issues/30) which can be implemented as filters. I think advanced search is a major point in which Invidious can improve on YouTube and hope to add more features soon!
This week a more advanced system for viewing fallback comments has been added (see [#84](https://github.com/omarroth/invidious/issues/84) for more details). You can now specify a comment fallback in your preferences, which Invidious will use. If, for example, no Reddit comments are available for a given video, it can choose to fallback on YouTube comments. This also makes it possible to turn comments off completely for users that prefer a more streamlined experience.
With [#98](https://github.com/omarroth/invidious/issues/98), it is now possible for users to specify preferences without creating an account. You can now change speed, volume, subtitles, autoplay, loop, and quality using query parameters. See the issue above for more details and several examples.
I'd also like to announce that I've set up an account on [Liberapay](https://liberapay.com/omarroth), for patrons that prefer a privacy-friendly alternative to Patreon. Liberapay also does not take any percentage of donations, so I'd recommend donating some to the Liberapay for their hard work. Go check it out!
[Two weeks ago](https://github.com/omarroth/invidious/releases/tag/0.1.0) I mentioned adding 1080p support into the player. Currently, the only thing blocking is [#207](https://github.com/videojs/http-streaming/pull/207) in the excellent [http-streaming](https://github.com/videojs/http-streaming) library. I hope to work with the videojs team to merge it soon and finally implement 1080p support!
That's all for this week, thank you again everyone for your support!
# 0.2.0 (2018-09-06)
## Week 2: Toward Playlists
Sorry for the late update! Not as much to announce this week, but still a couple things of note:
I'm happy to announce that a playlists page and API endpoint has been added so you can now view playlists. Currently, you cannot watch playlists through the player, but I hope to add that in the coming week as well as adding functionality to add and modify playlists. There is a good conversation on [#114](https://github.com/omarroth/invidious/issues/114) about giving playlists even more functionality, which I think is interesting and would appreciate feedback on.
As an update to the Invidious API announcement last week, I've been working with [**@PrestonN**](https://github.com/PrestonN), the developer of [FreeTube](https://github.com/FreeTubeApp/FreeTube), to help migrate his project to the Invidious API. Because of it's increasing popularity, he has had trouble keeping under the quota set by YouTube's API. I hope to improve the API to meet his and others needs and I'd recommend folks to keep an eye on his excellent project! There is a good discussion with his thoughts [here](https://github.com/FreeTubeApp/FreeTube/issues/100).
A couple of miscellaneous features and bugfixes:
- You can now login to Invidious simultaneously from multiple devices - [#109](https://github.com/omarroth/invidious/issues/109)
- Added a note for scheduled livestreams - [#124](https://github.com/omarroth/invidious/issues/124)
- Changed YouTube comment header to "View x comments" - [#120](https://github.com/omarroth/invidious/issues/120)
Enjoy your week everyone!
# 0.1.0 (2018-09-06)
## Week 1: Invidious API and Geo-Bypass
Hello everyone! This past week there have been quite a few things worthy of mention:
I'm happy to announce the [Invidious Developer API](https://github.com/omarroth/invidious/wiki/API). The Invidious API does not use any of the official YouTube APIs, and instead crawls the site to provide a JSON interface for other developers to use. It's still under development but is already powering [CloudTube](https://github.com/cloudrac3r/cadencegq). The API currently does not have a quota (compared to YouTube) which I hope to continue thanks to continued support from my Patrons. Hopefully other developers find it useful, and I hope to continue to improve it so it can better serve the community.
Just today partial support for bypassing geo-restrictions has been added with [fada57a](https://github.com/omarroth/invidious/commit/fada57a307d66d696d9286fc943c579a3fd22de6). If a video is unblocked in one of: United States, Canada, Germany, France, Japan, Russia, or United Kingdom, then Invidious will be able to serve video info. Currently you will not yet be able to access the video files themselves, but in the coming week I hope to proxy videos so that users can enjoy content across borders.
Support for generating DASH manifests has been fixed, in the coming week I hope to integrate this functionality into the watch page, so users can view videos in 1080p and above.
Thank you everyone for your continued interest and support!
+9
View File
@@ -7,6 +7,11 @@ STATIC := 0
NO_DBG_SYMBOLS := 0
# Enable multi-threading.
# Warning: Experimental feature!!
# invidious is not stable when MT is enabled.
MT := 0
FLAGS ?=
@@ -19,6 +24,10 @@ ifeq ($(STATIC), 1)
FLAGS += --static
endif
ifeq ($(MT), 1)
FLAGS += -Dpreview_mt
endif
ifeq ($(NO_DBG_SYMBOLS), 1)
FLAGS += --no-debug
+7 -7
View File
@@ -81,9 +81,9 @@
- [Available in many languages](locales/), thanks to [our translators](#contribute)
**Data import/export**
- Import subscriptions from YouTube, NewPipe and Freetube
- Import subscriptions from YouTube, NewPipe and FreeTube
- Import watch history from YouTube and NewPipe
- Export subscriptions to NewPipe and Freetube
- Export subscriptions to NewPipe and FreeTube
- Import/Export Invidious user data
**Technical features**
@@ -95,11 +95,11 @@
## Quick start
**Using invidious:**
**Using Invidious:**
- [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/)
@@ -114,8 +114,8 @@ https://github.com/iv-org/documentation
### Extensions
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
embedded youtube videos on other websites with invidious.
a browser extension that automatically redirects YouTube URLs to any Invidious instance and replaces
embedded YouTube videos on other websites with Invidious.
The documentation contains a list of browser extensions that we recommended to use along with Invidious.
@@ -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/.
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
+119
View File
@@ -0,0 +1,119 @@
/*
Copyright (c) 2024 by Jennifer (https://codepen.io/jwjertzoch/pen/JjyGeRy)
Permission is hereby granted, free of charge, to any person
obtaining a copy of this software and associated documentation
files (the "Software"), to deal in the Software without restriction,
including without limitation the rights to use, copy, modify,
merge, publish, distribute, sublicense, and/or sell copies of
the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall
be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
.carousel {
margin: 0 auto;
overflow: hidden;
text-align: center;
}
.slides {
width: 100%;
display: flex;
overflow-x: scroll;
scrollbar-width: none;
scroll-snap-type: x mandatory;
scroll-behavior: smooth;
}
.slides::-webkit-scrollbar {
display: none;
}
.slides-item {
align-items: center;
border-radius: 10px;
display: flex;
flex-shrink: 0;
font-size: 100px;
height: 600px;
justify-content: center;
margin: 0 1rem;
position: relative;
scroll-snap-align: start;
transform: scale(1);
transform-origin: center center;
transition: transform .5s;
width: 100%;
}
.carousel__nav {
padding: 1.25rem .5rem;
}
.slider-nav {
align-items: center;
background-color: #ddd;
border-radius: 50%;
color: #000;
display: inline-flex;
height: 1.5rem;
justify-content: center;
padding: .5rem;
position: relative;
text-decoration: none;
width: 1.5rem;
}
.skip-link {
height: 1px;
overflow: hidden;
position: absolute;
top: auto;
width: 1px;
}
.skip-link:focus {
align-items: center;
background-color: #000;
color: #fff;
display: flex;
font-size: 30px;
height: 30px;
justify-content: center;
opacity: .8;
text-decoration: none;
width: 50%;
z-index: 1;
}
.light-theme .slider-nav {
background-color: #ddd;
}
.dark-theme .slider-nav {
background-color: #0005;
}
@media (prefers-color-scheme: light) {
.no-theme .slider-nav {
background-color: #ddd;
}
}
@media (prefers-color-scheme: dark) {
.no-theme .slider-nav {
background-color: #0005;
}
}
+90 -1
View File
@@ -13,6 +13,7 @@ body {
display: flex;
flex-direction: column;
min-height: 100vh;
margin: auto;
}
.h-box {
@@ -197,6 +198,7 @@ img.thumbnail {
display: block; /* See: https://stackoverflow.com/a/11635197 */
width: 100%;
object-fit: cover;
aspect-ratio: 16 / 9;
}
.thumbnail-placeholder {
@@ -276,7 +278,14 @@ div.thumbnail > .bottom-right-overlay {
display: inline;
}
.searchbar .pure-form fieldset { padding: 0; }
.searchbar .pure-form {
display: flex;
}
.searchbar .pure-form fieldset {
padding: 0;
flex: 1;
}
.searchbar input[type="search"] {
width: 100%;
@@ -308,6 +317,16 @@ input[type="search"]::-webkit-search-cancel-button {
background-size: 14px;
}
.searchbar #searchbutton {
border: none;
background: none;
margin-top: 0;
}
.searchbar #searchbutton:hover {
color: rgb(0, 182, 240);
}
.user-field {
display: flex;
flex-direction: row;
@@ -531,6 +550,10 @@ span > select {
color: #565d64;
}
.light-theme .error-card {
border: 1px solid black;
}
@media (prefers-color-scheme: light) {
.no-theme a:hover,
.no-theme a:active,
@@ -577,6 +600,10 @@ span > select {
.light-theme .pure-menu-heading {
color: #565d64;
}
.no-theme .error-card {
border: 1px solid black;
}
}
@@ -639,6 +666,10 @@ body.dark-theme {
color: inherit;
}
.dark-theme .error-card {
border: 1px solid #5e5e5e;
}
@media (prefers-color-scheme: dark) {
.no-theme a:hover,
.no-theme a:active,
@@ -700,6 +731,10 @@ body.dark-theme {
.no-theme footer a {
color: #adadad !important;
}
.no-theme .error-card {
border: 1px solid #5e5e5e;
}
}
@@ -797,3 +832,57 @@ h1, h2, h3, h4, h5, p,
#download_widget {
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);
}
+1
View File
@@ -68,6 +68,7 @@
.video-js.player-style-youtube .vjs-menu-button-popup .vjs-menu {
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;
+5 -5
View File
@@ -1,4 +1,4 @@
summary {
#filters-collapse summary {
/* This should hide the marker */
display: block;
@@ -8,10 +8,10 @@ summary {
cursor: pointer;
}
summary::-webkit-details-marker,
summary::marker { display: none; }
#filters-collapse summary::-webkit-details-marker,
#filters-collapse summary::marker { display: none; }
summary:before {
#filters-collapse summary:before {
border-radius: 5px;
content: "[ + ]";
margin: -2px 10px 0 10px;
@@ -20,7 +20,7 @@ summary:before {
width: 40px;
}
details[open] > summary:before { content: "[ ]"; }
#filters-collapse details[open] > summary:before { content: "[ ]"; }
#filters-box {
+2 -2
View File
@@ -91,7 +91,7 @@
var count = document.getElementById('count');
count.textContent--;
var url = '/token_ajax?action_revoke_token=1&redirect=false' +
var url = '/token_ajax?action=revoke_token&redirect=false' +
'&referer=' + encodeURIComponent(location.href) +
'&session=' + target.getAttribute('data-session');
@@ -111,7 +111,7 @@
var count = document.getElementById('count');
count.textContent--;
var url = '/subscription_ajax?action_remove_subscriptions=1&redirect=false' +
var url = '/subscription_ajax?action=remove_subscriptions&redirect=false' +
'&referer=' + encodeURIComponent(location.href) +
'&c=' + target.getAttribute('data-ucid');
+2 -2
View File
@@ -10,7 +10,7 @@ var notifications, delivered;
var notifications_mock = { close: function () { } };
function get_subscriptions() {
helpers.xhr('GET', '/api/v1/auth/subscriptions?fields=authorId', {
helpers.xhr('GET', '/api/v1/auth/subscriptions', {
retries: 5,
entity_name: 'subscriptions'
}, {
@@ -22,7 +22,7 @@ function create_notification_stream(subscriptions) {
// sse.js can't be replaced to EventSource in place as it lack support of payload and headers
// see https://developer.mozilla.org/en-US/docs/Web/API/EventSource/EventSource
notifications = new SSE(
'/api/v1/auth/notifications?fields=videoId,title,author,authorId,publishedText,published,authorThumbnails,liveNow', {
'/api/v1/auth/notifications', {
withCredentials: true,
payload: 'topics=' + subscriptions.map(function (subscription) { return subscription.authorId; }).join(','),
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
+93
View File
@@ -0,0 +1,93 @@
'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);
}
}
});
+24 -14
View File
@@ -3,7 +3,6 @@ var player_data = JSON.parse(document.getElementById('player_data').textContent)
var video_data = JSON.parse(document.getElementById('video_data').textContent);
var options = {
preload: 'auto',
liveui: true,
playbackRates: [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0],
controlBar: {
@@ -135,26 +134,32 @@ player.on('timeupdate', function () {
// YouTube links
let elem_yt_watch = document.getElementById('link-yt-watch');
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');
let base_url_yt_embed = elem_yt_embed.getAttribute('data-base-url');
elem_yt_watch.href = addCurrentTimeToURL(base_url_yt_watch);
elem_yt_embed.href = addCurrentTimeToURL(base_url_yt_embed);
if (elem_yt_embed) {
let base_url_yt_embed = elem_yt_embed.getAttribute('data-base-url');
elem_yt_embed.href = addCurrentTimeToURL(base_url_yt_embed);
}
// Invidious links
let domain = window.location.origin;
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 base_url_iv_embed = elem_iv_embed.getAttribute('data-base-url');
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);
if (elem_iv_other) {
let base_url_iv_other = elem_iv_other.getAttribute('data-base-url');
elem_iv_other.href = addCurrentTimeToURL(base_url_iv_other, domain);
}
});
@@ -351,7 +356,12 @@ if (video_data.params.save_player_pos) {
const rememberedTime = get_video_time();
let lastUpdated = 0;
if(!hasTimeParam) set_seconds_after_start(rememberedTime);
if(!hasTimeParam) {
if (rememberedTime >= video_data.length_seconds - 20)
set_seconds_after_start(0);
else
set_seconds_after_start(rememberedTime);
}
player.on('timeupdate', function () {
const raw = player.currentTime();
+3 -3
View File
@@ -6,7 +6,7 @@ function add_playlist_video(target) {
var select = target.parentNode.children[0].children[1];
var option = select.children[select.selectedIndex];
var url = '/playlist_ajax?action_add_video=1&redirect=false' +
var url = '/playlist_ajax?action=add_video&redirect=false' +
'&video_id=' + target.getAttribute('data-id') +
'&playlist_id=' + option.getAttribute('data-plid');
@@ -21,7 +21,7 @@ function add_playlist_item(target) {
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
tile.style.display = 'none';
var url = '/playlist_ajax?action_add_video=1&redirect=false' +
var url = '/playlist_ajax?action=add_video&redirect=false' +
'&video_id=' + target.getAttribute('data-id') +
'&playlist_id=' + target.getAttribute('data-plid');
@@ -36,7 +36,7 @@ function remove_playlist_item(target) {
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
tile.style.display = 'none';
var url = '/playlist_ajax?action_remove_video=1&redirect=false' +
var url = '/playlist_ajax?action=remove_video&redirect=false' +
'&set_video_id=' + target.getAttribute('data-index') +
'&playlist_id=' + target.getAttribute('data-plid');
+2 -2
View File
@@ -16,7 +16,7 @@ function subscribe() {
subscribe_button.onclick = unsubscribe;
subscribe_button.innerHTML = '<b>' + subscribe_data.unsubscribe_text + ' | ' + subscribe_data.sub_count_text + '</b>';
var url = '/subscription_ajax?action_create_subscription_to_channel=1&redirect=false' +
var url = '/subscription_ajax?action=create_subscription_to_channel&redirect=false' +
'&c=' + subscribe_data.ucid;
helpers.xhr('POST', url, {payload: payload, retries: 5, entity_name: 'subscribe request'}, {
@@ -32,7 +32,7 @@ function unsubscribe() {
subscribe_button.onclick = subscribe;
subscribe_button.innerHTML = '<b>' + subscribe_data.subscribe_text + ' | ' + subscribe_data.sub_count_text + '</b>';
var url = '/subscription_ajax?action_remove_subscriptions=1&redirect=false' +
var url = '/subscription_ajax?action=remove_subscriptions&redirect=false' +
'&c=' + subscribe_data.ucid;
helpers.xhr('POST', url, {payload: payload, retries: 5, entity_name: 'unsubscribe request'}, {
+4
View File
@@ -67,6 +67,10 @@ function get_playlist(plid) {
'&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'}, {
on200: function (response) {
playlist.innerHTML = response.playlistHtml;
+2 -2
View File
@@ -6,7 +6,7 @@ function mark_watched(target) {
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
tile.style.display = 'none';
var url = '/watch_ajax?action_mark_watched=1&redirect=false' +
var url = '/watch_ajax?action=mark_watched&redirect=false' +
'&id=' + target.getAttribute('data-id');
helpers.xhr('POST', url, {payload: payload}, {
@@ -22,7 +22,7 @@ function mark_unwatched(target) {
var count = document.getElementById('count');
count.textContent--;
var url = '/watch_ajax?action_mark_unwatched=1&redirect=false' +
var url = '/watch_ajax?action=mark_unwatched&redirect=false' +
'&id=' + target.getAttribute('data-id');
helpers.xhr('POST', url, {payload: payload}, {
+127 -18
View File
@@ -1,6 +1,6 @@
#########################################
#
# Database configuration
# Database and other external servers
#
#########################################
@@ -41,6 +41,66 @@ db:
#check_tables: false
##
## Path to an external signature resolver, used to emulate
## the Youtube client's Javascript. If no such server is
## available, some videos will not be playable.
##
## When this setting is commented out, no external
## resolver will be used.
##
## Accepted values: a path to a UNIX socket or "<IP>:<Port>"
## Default: <none>
##
#signature_server:
##
## 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 needs to be configured for the internal
## communication between the companion and Invidious.
## And public_url is the public URL from which companion is listening
## to the requests from the user(s).
##
## If you are using a reverse proxy then you will probably need to
## configure the public_url to be the same as the domain used for Invidious.
## Also apply when used from an external IP address (without a domain).
## Examples: https://MYINVIDIOUSDOMAIN or http://192.168.1.100:8282
##
## Both parameter can have identical URL when Invidious is hosted in
## an internal network or at home or locally (localhost).
##
## Accepted values: "http(s)://<IP-HOSTNAME>:<Port>"
## Default: <none>
##
#invidious_companion:
# - private_url: "http://localhost:8282"
# public_url: "http://localhost:8282"
##
## API key for Invidious companion, used for securing the communication
## between Invidious and Invidious companion.
## The key needs to be exactly 16 characters long.
##
## Note: This parameter is mandatory when Invidious companion is enabled
## and should be a random string.
## Such random string can be generated on linux with the following
## command: `pwgen 16 1`
##
## Accepted values: a string (of length 16)
## Default: <none>
##
#invidious_companion_key: "CHANGE_ME!!"
#########################################
#
@@ -117,6 +177,20 @@ https_only: false
##
#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)
@@ -160,6 +234,17 @@ https_only: false
##
#force_resolve:
##
## Configuration for using a HTTP proxy
##
## If unset, then no HTTP proxy will be used.
##
#http_proxy:
# user:
# password:
# host:
# port:
##
## Use Innertube's transcripts API instead of timedtext for closed captions
@@ -173,6 +258,18 @@ https_only: 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
@@ -197,6 +294,17 @@ https_only: false
##
#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
@@ -343,21 +451,6 @@ full_refresh: false
##
feed_threads: 1
##
## Enable/Disable the polling job that keeps the decryption
## function (for "secured" videos) up to date.
##
## Note: This part of the code generate a small amount of data every minute.
## This may not be desired if you have bandwidth limits set by your ISP.
##
## Note 2: This part of the code is currently broken, so changing
## this setting has no impact.
##
## Accepted values: true, false
## Default: false
##
#decrypt_polling: false
jobs:
@@ -697,6 +790,22 @@ default_user_preferences:
# 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.
##
@@ -749,9 +858,9 @@ default_user_preferences:
## Default video quality.
##
## Accepted values: dash, hd720, medium, small
## Default: hd720
## Default: dash
##
#quality: hd720
#quality: dash
##
## Default dash video quality.
+1 -3
View File
@@ -32,12 +32,10 @@ services:
# statistics_enabled: false
hmac_key: "CHANGE_ME!!"
healthcheck:
test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/comments/jNQXAC9IVRw || exit 1
test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/trending || exit 1
interval: 30s
timeout: 5s
retries: 2
depends_on:
- invidious-db
invidious-db:
image: docker.io/library/postgres:14
+4 -4
View File
@@ -1,4 +1,4 @@
FROM crystallang/crystal:1.8.2-alpine AS builder
FROM crystallang/crystal:1.16.3-alpine AS builder
RUN apk add --no-cache sqlite-static yaml-static
@@ -21,7 +21,7 @@ COPY ./videojs-dependencies.yml ./videojs-dependencies.yml
RUN crystal spec --warnings all \
--link-flags "-lxml2 -llzma"
RUN if [[ "${release}" == 1 ]] ; then \
RUN --mount=type=cache,target=/root/.cache/crystal if [[ "${release}" == 1 ]] ; then \
crystal build ./src/invidious.cr \
--release \
--static --warnings all \
@@ -32,8 +32,8 @@ RUN if [[ "${release}" == 1 ]] ; then \
--link-flags "-lxml2 -llzma"; \
fi
FROM alpine:3.18
RUN apk add --no-cache rsvg-convert ttf-opensans tini
FROM alpine:3.21
RUN apk add --no-cache rsvg-convert ttf-opensans tini tzdata
WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \
adduser -u 1000 -S invidious -G invidious
+6 -5
View File
@@ -1,5 +1,6 @@
FROM alpine:3.18 AS builder
RUN apk add --no-cache 'crystal=1.8.2-r0' shards sqlite-static yaml-static yaml-dev libxml2-static zlib-static openssl-libs-static openssl-dev musl-dev xz-static
FROM alpine:3.21 AS builder
RUN apk add --no-cache 'crystal=1.14.0-r0' shards sqlite-static yaml-static yaml-dev libxml2-static \
zlib-static openssl-libs-static openssl-dev musl-dev xz-static
ARG release
@@ -21,7 +22,7 @@ COPY ./videojs-dependencies.yml ./videojs-dependencies.yml
RUN crystal spec --warnings all \
--link-flags "-lxml2 -llzma"
RUN if [[ "${release}" == 1 ]] ; then \
RUN --mount=type=cache,target=/root/.cache/crystal if [[ "${release}" == 1 ]] ; then \
crystal build ./src/invidious.cr \
--release \
--static --warnings all \
@@ -32,8 +33,8 @@ RUN if [[ "${release}" == 1 ]] ; then \
--link-flags "-lxml2 -llzma"; \
fi
FROM alpine:3.18
RUN apk add --no-cache rsvg-convert ttf-opensans tini
FROM alpine:3.21
RUN apk add --no-cache rsvg-convert ttf-opensans tini tzdata
WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \
adduser -u 1000 -S invidious -G invidious
-1
View File
@@ -1 +0,0 @@
/charts/*.tgz
-6
View File
@@ -1,6 +0,0 @@
dependencies:
- name: postgresql
repository: https://charts.bitnami.com/bitnami/
version: 12.11.1
digest: sha256:3c10008175c4f5c1cec38782f5a7316154b89074c77ebbd9bcc4be4f5ff21122
generated: "2023-09-14T22:40:43.171275362Z"
-22
View File
@@ -1,22 +0,0 @@
apiVersion: v2
name: invidious
description: Invidious is an alternative front-end to YouTube
version: 1.1.1
appVersion: 0.20.1
keywords:
- youtube
- proxy
- video
- privacy
home: https://invidio.us/
icon: https://raw.githubusercontent.com/iv-org/invidious/05988c1c49851b7d0094fca16aeaf6382a7f64ab/assets/favicon-32x32.png
sources:
- https://github.com/iv-org/invidious
maintainers:
- name: Leon Klingele
email: mail@leonklingele.de
dependencies:
- name: postgresql
version: ~12.11.0
repository: "https://charts.bitnami.com/bitnami/"
engine: gotpl
+1 -41
View File
@@ -1,41 +1 @@
# Invidious Helm chart
Easily deploy Invidious to Kubernetes.
## Installing Helm chart
```sh
# Build Helm dependencies
$ helm dep build
# Add PostgreSQL init scripts
$ kubectl create configmap invidious-postgresql-init \
--from-file=../config/sql/channels.sql \
--from-file=../config/sql/videos.sql \
--from-file=../config/sql/channel_videos.sql \
--from-file=../config/sql/users.sql \
--from-file=../config/sql/session_ids.sql \
--from-file=../config/sql/nonces.sql \
--from-file=../config/sql/annotations.sql \
--from-file=../config/sql/playlists.sql \
--from-file=../config/sql/playlist_videos.sql
# Install Helm app to your Kubernetes cluster
$ helm install invidious ./
```
## Upgrading
```sh
# Upgrading is easy, too!
$ helm upgrade invidious ./
```
## Uninstall
```sh
# Get rid of everything (except database)
$ helm delete invidious
# To also delete the database, remove all invidious-postgresql PVCs
```
The Helm chart has moved to a dedicated GitHub repository: https://github.com/iv-org/invidious-helm-chart/tree/master/invidious
-16
View File
@@ -1,16 +0,0 @@
{{/* vim: set filetype=mustache: */}}
{{/*
Expand the name of the chart.
*/}}
{{- define "invidious.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
*/}}
{{- define "invidious.fullname" -}}
{{- $name := default .Chart.Name .Values.nameOverride -}}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
{{- end -}}
-11
View File
@@ -1,11 +0,0 @@
apiVersion: v1
kind: ConfigMap
metadata:
name: {{ template "invidious.fullname" . }}
labels:
app: {{ template "invidious.name" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: {{ .Release.Name }}
data:
INVIDIOUS_CONFIG: |
{{ toYaml .Values.config | indent 4 }}
-61
View File
@@ -1,61 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ template "invidious.fullname" . }}
labels:
app: {{ template "invidious.name" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: {{ .Release.Name }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app: {{ template "invidious.name" . }}
release: {{ .Release.Name }}
template:
metadata:
labels:
app: {{ template "invidious.name" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: {{ .Release.Name }}
spec:
securityContext:
runAsUser: {{ .Values.securityContext.runAsUser }}
runAsGroup: {{ .Values.securityContext.runAsGroup }}
fsGroup: {{ .Values.securityContext.fsGroup }}
initContainers:
- name: wait-for-postgresql
image: postgres
args:
- /bin/sh
- -c
- until pg_isready -h {{ .Values.config.db.host }} -p {{ .Values.config.db.port }} -U {{ .Values.config.db.user }}; do echo waiting for database; sleep 2; done;
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
ports:
- containerPort: 3000
env:
- name: INVIDIOUS_CONFIG
valueFrom:
configMapKeyRef:
key: INVIDIOUS_CONFIG
name: {{ template "invidious.fullname" . }}
securityContext:
allowPrivilegeEscalation: {{ .Values.securityContext.allowPrivilegeEscalation }}
capabilities:
drop:
- ALL
resources:
{{ toYaml .Values.resources | indent 10 }}
readinessProbe:
httpGet:
port: 3000
path: /
livenessProbe:
httpGet:
port: 3000
path: /
initialDelaySeconds: 15
restartPolicy: Always
-18
View File
@@ -1,18 +0,0 @@
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: {{ template "invidious.fullname" . }}
labels:
app: {{ template "invidious.name" . }}
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
release: {{ .Release.Name }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ template "invidious.fullname" . }}
minReplicas: {{ .Values.autoscaling.minReplicas }}
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
targetCPUUtilizationPercentage: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
{{- end }}
-20
View File
@@ -1,20 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: {{ template "invidious.fullname" . }}
labels:
app: {{ template "invidious.name" . }}
chart: {{ .Chart.Name }}
release: {{ .Release.Name }}
spec:
type: {{ .Values.service.type }}
ports:
- name: http
port: {{ .Values.service.port }}
targetPort: 3000
selector:
app: {{ template "invidious.name" . }}
release: {{ .Release.Name }}
{{- if .Values.service.loadBalancerIP }}
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
{{- end }}
-61
View File
@@ -1,61 +0,0 @@
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
feed_threads: 1
db:
user: kemal
password: kemal
host: invidious-postgresql
port: 5432
dbname: invidious
full_refresh: false
https_only: false
domain:
+26 -11
View File
@@ -15,13 +15,13 @@
"New password": "كلمة مرور جديدة",
"New passwords must match": "يَجبُ أن تكون كلمتا المرور متطابقتين",
"Authorize token?": "رمز التفويض؟",
"Authorize token for `x`?": "السماح بالرمز المميز ل 'x'؟",
"Authorize token for `x`?": "السماح بالرمز المميز ل `x`؟",
"Yes": "نعم",
"No": "لا",
"Import and Export Data": "اِستيراد البيانات وتصديرها",
"Import": "استيراد",
"Import Invidious data": "استيراد بيانات JSON Invidious",
"Import YouTube subscriptions": "استيراد اشتراكات YouTube/OPML",
"Import YouTube subscriptions": "استيراد الاشتراكات YouTube بتنسيق CSV أو OPML",
"Import FreeTube subscriptions (.db)": "استيراد اشتراكات فريتيوب (.db)",
"Import NewPipe subscriptions (.json)": "استيراد اشتراكات نيو بايب (.json)",
"Import NewPipe data (.zip)": "استيراد بيانات نيو بايب (.zip)",
@@ -41,7 +41,7 @@
"Time (h:mm:ss):": "الوقت (h:mm:ss):",
"Text CAPTCHA": "نص الكابتشا",
"Image CAPTCHA": "صورة الكابتشا",
"Sign In": "تسجيل الدخول",
"Sign In": "إنشاء حساب",
"Register": "التسجيل",
"E-mail": "البريد الإلكتروني",
"Preferences": "الإعدادات",
@@ -154,8 +154,8 @@
"View YouTube comments": "عرض تعليقات اليوتيوب",
"View more comments on Reddit": "عرض المزيد من التعليقات على\\من موقع ريديت",
"View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "عرض `x` تعليقات",
"": "عرض `x` تعليقات."
"([^.,0-9]|^)1([^.,0-9]|$)": "عرض `x` تعليق",
"": "عرض `x` تعليقات"
},
"View Reddit comments": "عرض تعليقات ريديت",
"Hide replies": "إخفاء الردود",
@@ -170,7 +170,7 @@
"Password cannot be empty": "لا يمكن أن تكون كلمة السر فارغة",
"Password cannot be longer than 55 characters": "يجب أن لا تتعدى كلمة السر 55 حرفًا",
"Please log in": "الرجاء تسجيل الدخول",
"Invidious Private Feed for `x`": "تغذية Invidious خاصة ل 'x'",
"Invidious Private Feed for `x`": "تغذية Invidious خاصة ل `x`",
"channel:`x`": "قناة:`x`",
"Deleted or invalid channel": "قناة ممسوحة او غير صالحة",
"This channel does not exist.": "هذه القناة غير موجودة.",
@@ -382,11 +382,11 @@
"videoinfo_watch_on_youTube": "مشاهدة على يوتيوب",
"videoinfo_youTube_embed_link": "مضمن",
"videoinfo_invidious_embed_link": "رابط مضمن",
"user_created_playlists": "'x' إنشاء قوائم التشغيل",
"user_saved_playlists": "قوائم التشغيل المحفوظة 'x'",
"user_created_playlists": "`x` إنشاء قوائم التشغيل",
"user_saved_playlists": "قوائم التشغيل المحفوظة `x`",
"Video unavailable": "الفيديو غير متوفر",
"search_filters_features_option_three_sixty": "360°",
"download_subtitles": "ترجمات - 'x' (.vtt)",
"download_subtitles": "ترجمات - `x` (.vtt)",
"invidious": "الخيالي",
"preferences_save_player_pos_label": "حفظ موضع التشغيل: ",
"crash_page_you_found_a_bug": "يبدو أنك قد وجدت خطأً برمجيًّا في Invidious!",
@@ -483,7 +483,7 @@
"comments_view_x_replies_3": "عرض رد {{count}}",
"comments_view_x_replies_4": "عرض الردود {{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_1": "نقطة واحدة",
"comments_points_count_2": "نقطتان",
@@ -554,5 +554,20 @@
"generic_channels_count_2": "{{count}} قناتان",
"generic_channels_count_3": "{{count}} قنوات",
"generic_channels_count_4": "{{count}} قنوات",
"generic_channels_count_5": "{{count}} قناة"
"generic_channels_count_5": "{{count}} قناة",
"Import YouTube watch history (.json)": "استيراد سجل مشاهدة YouTube بصيغة (.json)",
"toggle_theme": "تبديل الموضوع",
"Add to playlist": "أضف إلى قائمة التشغيل",
"Add to playlist: ": "أضف إلى قائمة التشغيل: ",
"Answer": "اجابة",
"Search for videos": "ابحث عن مقاطع الفيديو",
"The Popular feed has been disabled by the administrator.": "تم تعطيل الخلاصة الشائعة من قبل المسؤول.",
"carousel_slide": "الشريحة {{current}} من {{total}}",
"carousel_skip": "تخطي الكاروسيل",
"carousel_go_to": "انتقل إلى الشريحة `x`",
"preferences_preload_label": "التحميل المسبق لبيانات الفيديو: ",
"Filipino (auto-generated)": "الفلبينية (المولدة تلقائيًا)",
"channel_tab_courses_label": "الدورات",
"channel_tab_posts_label": "المنشورات",
"First page": "الصفحة الأولى"
}
+12 -2
View File
@@ -403,7 +403,7 @@
"comments_view_x_replies": "Виж {{count}} отговор",
"comments_view_x_replies_plural": "Виж {{count}} отговора",
"footer_original_source_code": "Оригинален изходен код",
"Import YouTube subscriptions": "Импортиране на YouTube/OPML абонаменти",
"Import YouTube subscriptions": "Импортиране на YouTube-CSV/OPML абонаменти",
"Lithuanian": "Литовски",
"Nyanja": "Нянджа",
"Updated `x` ago": "Актуализирано преди `x`",
@@ -486,5 +486,15 @@
"preferences_annotations_label": "Покажи анотаций по подразбиране: ",
"generic_views_count": "{{count}} гледане",
"generic_views_count_plural": "{{count}} гледания",
"Next page": "Следваща страница"
"Next page": "Следваща страница",
"Import YouTube watch history (.json)": "Импортиране на историята на гледане от YouTube (.json)",
"toggle_theme": "Смени темата",
"Add to playlist": "Добави към плейлист",
"Add to playlist: ": "Добави към плейлист: ",
"Answer": "Отговор",
"Search for videos": "Търсене на видеа",
"The Popular feed has been disabled by the administrator.": "Популярната страница е деактивирана от администратора.",
"Filipino (auto-generated)": "Филипински (автоматично генериран)",
"preferences_preload_label": "Предварително заредете видео данни: ",
"First page": "Първа страница"
}
+3 -1
View File
@@ -90,5 +90,7 @@
"preferences_quality_option_medium": "মধ্যম",
"preferences_quality_option_small": "ছোট",
"preferences_quality_dash_option_1080p": "১০৮০পি",
"preferences_quality_dash_option_720p": "৭২০পি"
"preferences_quality_dash_option_720p": "৭২০পি",
"Add to playlist": "প্লেলিস্টে যোগ করুন",
"Add to playlist: ": "প্লেলিস্টে যোগ করুন: "
}
+16 -2
View File
@@ -204,7 +204,7 @@
"View JavaScript license information.": "Consulta la informació de la llicència de JavaScript.",
"Playlist privacy": "Privacitat de la llista de reproducció",
"search_message_no_results": "No s'han trobat resultats.",
"search_message_use_another_instance": " També es pot <a href=\"`x`\">buscar en una altra instància</a>.",
"search_message_use_another_instance": "També es pot <a href=\"`x`\">cercar en una altra instància</a>.",
"Genre: ": "Gènere: ",
"Hidden field \"challenge\" is a required field": "El camp ocult \"repte\" és un camp obligatori",
"Burmese": "Birmà",
@@ -486,5 +486,19 @@
"generic_channels_count_plural": "{{count}} canals",
"generic_button_edit": "Edita",
"generic_button_rss": "RSS",
"generic_button_delete": "Suprimeix"
"generic_button_delete": "Suprimeix",
"Import YouTube watch history (.json)": "Importa l'historial de visualitzacions de YouTube (.json)",
"Answer": "Resposta",
"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ó"
}
+31 -16
View File
@@ -21,7 +21,7 @@
"Import and Export Data": "Import a export dat",
"Import": "Importovat",
"Import Invidious data": "Importovat JSON údaje Invidious",
"Import YouTube subscriptions": "Importovat odběry z YouTube/OPML",
"Import YouTube subscriptions": "Importovat odběry z YouTube CSV nebo OPML",
"Import FreeTube subscriptions (.db)": "Importovat odběry z FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importovat odběry z NewPipe (.json)",
"Import NewPipe data (.zip)": "Importovat údeje z NewPipe (.zip)",
@@ -137,7 +137,7 @@
"Family friendly? ": "Vhodné pro rodiny? ",
"Engagement: ": "Zapojení: ",
"English": "Angličtina",
"English (auto-generated)": "Angličtina (automaticky generováno)",
"English (auto-generated)": "Angličtina (vytvořeno automaticky)",
"Afrikaans": "Afrikánština",
"Albanian": "Albánština",
"Amharic": "Amharština",
@@ -294,8 +294,8 @@
"Chinese (China)": "Čínština (Čína)",
"Chinese (Hong Kong)": "Čínština (Hong Kong)",
"Chinese (Taiwan)": "Čínština (Taiwan)",
"Portuguese (auto-generated)": "Portugalština (automaticky generováno)",
"Spanish (auto-generated)": "Španělština (automaticky generováno)",
"Portuguese (auto-generated)": "Portugalština (vytvořeno automaticky)",
"Spanish (auto-generated)": "Španělština (vytvořeno automaticky)",
"Spanish (Mexico)": "Španělština (Mexiko)",
"Spanish (Spain)": "Španělština (Španělsko)",
"generic_count_years_0": "{{count}} rokem",
@@ -352,13 +352,13 @@
"comments_points_count_0": "{{count}} bod",
"comments_points_count_1": "{{count}} body",
"comments_points_count_2": "{{count}} bodů",
"German (auto-generated)": "Němčina (automaticky generováno)",
"Indonesian (auto-generated)": "Indonéština (automaticky generováno)",
"German (auto-generated)": "Němčina (vytvořeno automaticky)",
"Indonesian (auto-generated)": "Indonéština (vytvořeno automaticky)",
"Interlingue": "Interlingue",
"Italian (auto-generated)": "Italština (automaticky generováno)",
"Japanese (auto-generated)": "Japonština (automaticky generováno)",
"Korean (auto-generated)": "Korejština (automaticky generováno)",
"Russian (auto-generated)": "Ruština (automaticky generováno)",
"Italian (auto-generated)": "Italština (vytvořeno automaticky)",
"Japanese (auto-generated)": "Japonština (vytvořeno automaticky)",
"Korean (auto-generated)": "Korejština (vytvořeno automaticky)",
"Russian (auto-generated)": "Ruština (vytvořeno automaticky)",
"generic_count_months_0": "{{count}} měsícem",
"generic_count_months_1": "{{count}} měsíci",
"generic_count_months_2": "{{count}} měsíci",
@@ -371,7 +371,7 @@
"footer_documentation": "Dokumentace",
"next_steps_error_message_refresh": "Obnovit stránku",
"Chinese": "Čínština",
"Dutch (auto-generated)": "Nizozemština (automaticky generováno)",
"Dutch (auto-generated)": "Nizozemština (vytvořeno automaticky)",
"Erroneous token": "Chybný token",
"tokens_count_0": "{{count}} token",
"tokens_count_1": "{{count}} tokeny",
@@ -380,9 +380,9 @@
"Token is expired, please try again": "Token vypršel, zkuste to prosím znovu",
"English (United States)": "Angličtina (Spojené státy)",
"Cantonese (Hong Kong)": "Kantonština (Hong Kong)",
"French (auto-generated)": "Francouzština (automaticky generováno)",
"Turkish (auto-generated)": "Turečtina (automaticky generováno)",
"Vietnamese (auto-generated)": "Vietnamština (automaticky generováno)",
"French (auto-generated)": "Francouzština (vytvořeno automaticky)",
"Turkish (auto-generated)": "Turečtina (vytvořeno automaticky)",
"Vietnamese (auto-generated)": "Vietnamština (vytvořeno automaticky)",
"Current version: ": "Aktuální verze: ",
"next_steps_error_message": "Měli byste zkusit: ",
"footer_donate_page": "Přispět",
@@ -471,7 +471,7 @@
"search_filters_title": "Filtry",
"search_filters_duration_option_medium": "Střední (4 - 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_option_three_sixty": "360°",
"search_filters_features_option_vr180": "VR180",
@@ -503,5 +503,20 @@
"playlist_button_add_items": "Přidat videa",
"generic_channels_count_0": "{{count}} kanál",
"generic_channels_count_1": "{{count}} kanály",
"generic_channels_count_2": "{{count}} kanálů"
"generic_channels_count_2": "{{count}} kanálů",
"Import YouTube watch history (.json)": "Importovat historii sledování z YouTube (.json)",
"toggle_theme": "Přepnout motiv",
"Add to playlist": "Přidat do playlistu",
"Add to playlist: ": "Přidat do playlistu: ",
"Answer": "Odpověď",
"Search for videos": "Hledat videa",
"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_skip": "Přeskočit galerii",
"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"
}
+412
View File
@@ -0,0 +1,412 @@
{
"Time (h:mm:ss):": "Amser (h:mm:ss):",
"Password": "Cyfrinair",
"preferences_quality_dash_option_auto": "Awtomatig",
"preferences_quality_dash_option_best": "Gorau",
"preferences_quality_dash_option_worst": "Gwaethaf",
"preferences_quality_dash_option_360p": "360p",
"published": "dyddiad cyhoeddi",
"preferences_quality_dash_option_4320p": "4320p",
"preferences_quality_dash_option_480p": "480p",
"preferences_quality_dash_option_240p": "240p",
"preferences_quality_dash_option_144p": "144p",
"preferences_comments_label": "Ffynhonnell sylwadau: ",
"preferences_captions_label": "Isdeitlau rhagosodedig: ",
"youtube": "YouTube",
"reddit": "Reddit",
"Fallback captions: ": "Isdeitlau amgen: ",
"preferences_related_videos_label": "Dangos fideos perthnasol: ",
"dark": "tywyll",
"preferences_dark_mode_label": "Thema: ",
"light": "golau",
"preferences_sort_label": "Trefnu fideo yn ôl: ",
"Import/export data": "Mewnforio/allforio data",
"Delete account": "Dileu eich cyfrif",
"preferences_category_admin": "Hoffterau gweinyddu",
"playlist_button_add_items": "Ychwanegu fideos",
"Delete playlist": "Dileu'r rhestr chwarae",
"Create playlist": "Creu rhestr chwarae",
"Show less": "Dangos llai",
"Show more": "Dangos rhagor",
"Watch on YouTube": "Gwylio ar YouTube",
"search_message_no_results": "Dim canlyniadau.",
"search_message_change_filters_or_query": "Ceisiwch ehangu eich chwiliad ac/neu newid yr hidlyddion.",
"License: ": "Trwydded: ",
"Standard YouTube license": "Trwydded safonol YouTube",
"Family friendly? ": "Addas i bawb? ",
"Wilson score: ": "Sgôr Wilson: ",
"Show replies": "Dangos ymatebion",
"Music in this video": "Cerddoriaeth yn y fideo hwn",
"Artist: ": "Artist: ",
"Erroneous CAPTCHA": "CAPTCHA anghywir",
"This channel does not exist.": "Dyw'r sianel hon ddim yn bodoli.",
"Not a playlist.": "Ddim yn rhestr chwarae.",
"Could not fetch comments": "Wedi methu llwytho sylwadau",
"Playlist does not exist.": "Dyw'r rhestr chwarae ddim yn bodoli.",
"Erroneous challenge": "Her annilys",
"channel_tab_podcasts_label": "Podlediadau",
"channel_tab_playlists_label": "Rhestrau chwarae",
"channel_tab_streams_label": "Fideos byw",
"crash_page_read_the_faq": "darllen y <a href=\"`x`\">cwestiynau cyffredin</a>",
"crash_page_switch_instance": "ceisio <a href=\"`x`\">defnyddio gweinydd arall</a>",
"crash_page_refresh": "ceisio <a href=\"`x`\">ail-lwytho'r dudalen</a>",
"search_filters_features_option_four_k": "4K",
"search_filters_features_label": "Nodweddion",
"search_filters_duration_option_medium": "Canolig (4 - 20 munud)",
"search_filters_features_option_live": "Yn fyw",
"search_filters_duration_option_long": "Hir (> 20 munud)",
"search_filters_date_option_year": "Eleni",
"search_filters_type_label": "Math",
"search_filters_date_option_month": "Y mis hwn",
"generic_views_count_0": "{{count}} o wyliadau",
"generic_views_count_1": "{{count}} gwyliad",
"generic_views_count_2": "{{count}} wyliad",
"generic_views_count_3": "{{count}} o wyliadau",
"generic_views_count_4": "{{count}} o wyliadau",
"generic_views_count_5": "{{count}} o wyliadau",
"Answer": "Ateb",
"Add to playlist: ": "Ychwanegu at y rhestr chwarae: ",
"Add to playlist": "Ychwanegu at y rhestr chwarae",
"generic_button_cancel": "Diddymu",
"generic_button_rss": "RSS",
"LIVE": "YN FYW",
"Import YouTube watch history (.json)": "Mewnforio hanes gwylio YouTube (.json)",
"generic_videos_count_0": "{{count}} fideo",
"generic_videos_count_1": "{{count}} fideo",
"generic_videos_count_2": "{{count}} fideo",
"generic_videos_count_3": "{{count}} fideo",
"generic_videos_count_4": "{{count}} fideo",
"generic_videos_count_5": "{{count}} fideo",
"generic_subscribers_count_0": "{{count}} tanysgrifiwr",
"generic_subscribers_count_1": "{{count}} tanysgrifiwr",
"generic_subscribers_count_2": "{{count}} danysgrifiwr",
"generic_subscribers_count_3": "{{count}} thanysgrifiwr",
"generic_subscribers_count_4": "{{count}} o danysgrifwyr",
"generic_subscribers_count_5": "{{count}} o danysgrifwyr",
"Authorize token?": "Awdurdodi'r tocyn?",
"Authorize token for `x`?": "Awdurdodi'r tocyn ar gyfer `x`?",
"English": "Saesneg",
"English (United Kingdom)": "Saesneg (Y Deyrnas Unedig)",
"English (United States)": "Saesneg (Yr Unol Daleithiau)",
"Afrikaans": "Affricaneg",
"English (auto-generated)": "Saesneg (awtomatig)",
"Amharic": "Amhareg",
"Albanian": "Albaneg",
"Arabic": "Arabeg",
"crash_page_report_issue": "Os nad yw'r awgrymiadau uchod wedi helpu, <a href=\"`x`\">codwch 'issue' newydd ar Github </a> (yn Saesneg, gorau oll) a chynnwys y testun canlynol yn eich neges (peidiwch â chyfieithu'r testun hwn):",
"Search for videos": "Chwilio am fideos",
"The Popular feed has been disabled by the administrator.": "Mae'r ffrwd fideos poblogaidd wedi ei hanalluogi gan y gweinyddwr.",
"generic_channels_count_0": "{{count}} sianel",
"generic_channels_count_1": "{{count}} sianel",
"generic_channels_count_2": "{{count}} sianel",
"generic_channels_count_3": "{{count}} sianel",
"generic_channels_count_4": "{{count}} sianel",
"generic_channels_count_5": "{{count}} sianel",
"generic_button_delete": "Dileu",
"generic_button_edit": "Golygu",
"generic_button_save": "Cadw",
"Shared `x` ago": "Rhannwyd `x` yn ôl",
"Unsubscribe": "Dad-danysgrifio",
"Subscribe": "Tanysgrifio",
"View channel on YouTube": "Gweld y sianel ar YouTube",
"View playlist on YouTube": "Gweld y rhestr chwarae ar YouTube",
"newest": "diweddaraf",
"oldest": "hynaf",
"popular": "poblogaidd",
"Next page": "Tudalen nesaf",
"Previous page": "Tudalen flaenorol",
"Clear watch history?": "Clirio'ch hanes gwylio?",
"New password": "Cyfrinair newydd",
"Import and Export Data": "Mewnforio ac allforio data",
"Import": "Mewnforio",
"Import Invidious data": "Mewnforio data JSON Invidious",
"Import YouTube subscriptions": "Mewnforio tanysgrifiadau YouTube ar fformat CSV neu OPML",
"Import YouTube playlist (.csv)": "Mewnforio rhestr chwarae YouTube (.csv)",
"Export": "Allforio",
"Export data as JSON": "Allforio data Invidious ar fformat JSON",
"Delete account?": "Ydych chi'n siŵr yr hoffech chi ddileu eich cyfrif?",
"History": "Hanes",
"JavaScript license information": "Gwybodaeth am y drwydded JavaScript",
"generic_subscriptions_count_0": "{{count}} tanysgrifiad",
"generic_subscriptions_count_1": "{{count}} tanysgrifiad",
"generic_subscriptions_count_2": "{{count}} danysgrifiad",
"generic_subscriptions_count_3": "{{count}} thanysgrifiad",
"generic_subscriptions_count_4": "{{count}} o danysgrifiadau",
"generic_subscriptions_count_5": "{{count}} o danysgrifiadau",
"Yes": "Iawn",
"No": "Na",
"Import FreeTube subscriptions (.db)": "Mewnforio tanysgrifiadau FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Mewnforio tanysgrifiadau NewPipe (.json)",
"Import NewPipe data (.zip)": "Mewnforio data NewPipe (.zip)",
"An alternative front-end to YouTube": "Pen blaen amgen i YouTube",
"source": "ffynhonnell",
"Log in": "Mewngofnodi",
"Log in/register": "Mewngofnodi/cofrestru",
"User ID": "Enw defnyddiwr",
"preferences_quality_option_dash": "DASH (ansawdd addasol)",
"Sign In": "Mewngofnodi",
"Register": "Cofrestru",
"E-mail": "Ebost",
"Preferences": "Hoffterau",
"preferences_category_player": "Hoffterau'r chwaraeydd",
"preferences_autoplay_label": "Chwarae'n awtomatig: ",
"preferences_local_label": "Llwytho fideos drwy ddirprwy weinydd: ",
"preferences_watch_history_label": "Galluogi hanes gwylio: ",
"preferences_speed_label": "Cyflymder rhagosodedig: ",
"preferences_quality_label": "Ansawdd fideos: ",
"preferences_quality_option_hd720": "HD720",
"preferences_quality_option_medium": "Canolig",
"preferences_quality_option_small": "Bach",
"preferences_quality_dash_option_2160p": "2160p",
"preferences_quality_dash_option_1440p": "1440p",
"preferences_quality_dash_option_1080p": "1080p",
"preferences_quality_dash_option_720p": "720p",
"invidious": "Invidious",
"Text CAPTCHA": "CAPTCHA testun",
"Image CAPTCHA": "CAPTCHA delwedd",
"preferences_continue_label": "Chwarae'r fideo nesaf fel rhagosodiad: ",
"preferences_continue_autoplay_label": "Chwarae'r fideo nesaf yn awtomatig: ",
"preferences_listen_label": "Sain yn unig: ",
"preferences_quality_dash_label": "Ansawdd fideos DASH a ffefrir: ",
"preferences_volume_label": "Uchder sain y chwaraeydd: ",
"preferences_category_visual": "Hoffterau'r wefan",
"preferences_region_label": "Gwlad y cynnwys: ",
"preferences_player_style_label": "Arddull y chwaraeydd: ",
"Dark mode: ": "Modd tywyll: ",
"preferences_thin_mode_label": "Modd tenau: ",
"preferences_category_misc": "Hoffterau amrywiol",
"preferences_category_subscription": "Hoffterau tanysgrifio",
"preferences_max_results_label": "Nifer o fideos a ddangosir yn eich ffrwd: ",
"alphabetically": "yr wyddor",
"alphabetically - reverse": "yr wyddor - am yn ôl",
"published - reverse": "dyddiad cyhoeddi - am yn ôl",
"channel name": "enw'r sianel",
"channel name - reverse": "enw'r sianel - am yn ôl",
"Only show latest video from channel: ": "Dangos fideo diweddaraf y sianeli rydych chi'n tanysgrifio iddynt: ",
"Only show latest unwatched video from channel: ": "Dangos fideo heb ei wylio diweddaraf y sianeli rydych chi'n tanysgrifio iddynt: ",
"Enable web notifications": "Galluogi hysbysiadau gwe",
"`x` uploaded a video": "uwchlwythodd `x` fideo",
"`x` is live": "mae `x` yn darlledu'n fyw",
"preferences_category_data": "Hoffterau data",
"Clear watch history": "Clirio'ch hanes gwylio",
"Change password": "Newid eich cyfrinair",
"Manage subscriptions": "Rheoli tanysgrifiadau",
"Manage tokens": "Rheoli tocynnau",
"Watch history": "Hanes gwylio",
"preferences_default_home_label": "Hafan ragosodedig: ",
"preferences_show_nick_label": "Dangos eich enw defnyddiwr ar frig y dudalen: ",
"preferences_annotations_label": "Dangos nodiadau fel rhagosodiad: ",
"preferences_unseen_only_label": "Dangos fideos heb eu gwylio yn unig: ",
"preferences_notifications_only_label": "Dangos hysbysiadau yn unig (os oes unrhyw rai): ",
"Token manager": "Rheolydd tocynnau",
"Token": "Tocyn",
"unsubscribe": "dad-danysgrifio",
"Subscriptions": "Tanysgrifiadau",
"Import/export": "Mewngofnodi/allgofnodi",
"search": "chwilio",
"Log out": "Allgofnodi",
"View privacy policy.": "Polisi preifatrwydd",
"Trending": "Pynciau llosg",
"Public": "Cyhoeddus",
"Private": "Preifat",
"Updated `x` ago": "Diweddarwyd `x` yn ôl",
"Delete playlist `x`?": "Ydych chi'n siŵr yr hoffech chi ddileu'r rhestr chwarae `x`?",
"Title": "Teitl",
"Playlist privacy": "Preifatrwydd y rhestr chwarae",
"search_message_use_another_instance": " Gallwch hefyd <a href=\"`x`\">chwilio ar weinydd arall</a>.",
"Popular enabled: ": "Tudalen fideos poblogaidd wedi'i galluogi: ",
"CAPTCHA enabled: ": "CAPTCHA wedi'i alluogi: ",
"Registration enabled: ": "Cofrestru wedi'i alluogi: ",
"Save preferences": "Cadw'r hoffterau",
"Subscription manager": "Rheolydd tanysgrifio",
"revoke": "tynnu",
"subscriptions_unseen_notifs_count_0": "{{count}} hysbysiad heb ei weld",
"subscriptions_unseen_notifs_count_1": "{{count}} hysbysiad heb ei weld",
"subscriptions_unseen_notifs_count_2": "{{count}} hysbysiad heb eu gweld",
"subscriptions_unseen_notifs_count_3": "{{count}} hysbysiad heb eu gweld",
"subscriptions_unseen_notifs_count_4": "{{count}} hysbysiad heb eu gweld",
"subscriptions_unseen_notifs_count_5": "{{count}} hysbysiad heb eu gweld",
"Released under the AGPLv3 on Github.": "Cyhoeddwyd dan drwydded AGPLv3 ar GitHub",
"Unlisted": "Heb ei restru",
"Switch Invidious Instance": "Newid gweinydd Invidious",
"Report statistics: ": "Galluogi ystadegau'r gweinydd: ",
"View all playlists": "Gweld pob rhestr chwarae",
"Editing playlist `x`": "Yn golygu'r rhestr chwarae `x`",
"Whitelisted regions: ": "Rhanbarthau a ganiateir: ",
"Blacklisted regions: ": "Rhanbarthau a rwystrir: ",
"Song: ": "Cân: ",
"Album: ": "Albwm: ",
"Shared `x`": "Rhannwyd `x`",
"View YouTube comments": "Dangos sylwadau YouTube",
"View more comments on Reddit": "Dangos rhagor o sylwadau ar Reddit",
"View Reddit comments": "Dangos sylwadau Reddit",
"Hide replies": "Cuddio ymatebion",
"Incorrect password": "Cyfrinair anghywir",
"Wrong answer": "Ateb anghywir",
"CAPTCHA is a required field": "Rhaid rhoi'r CAPTCHA",
"User ID is a required field": "Rhaid rhoi enw defnyddiwr",
"Password is a required field": "Rhaid rhoi cyfrinair",
"Wrong username or password": "Enw defnyddiwr neu gyfrinair anghywir",
"Password cannot be empty": "All y cyfrinair ddim bod yn wag",
"Password cannot be longer than 55 characters": "All y cyfrinair ddim bod yn hirach na 55 nod",
"Please log in": "Mewngofnodwch",
"channel:`x`": "sianel: `x`",
"Deleted or invalid channel": "Sianel wedi'i dileu neu'n annilys",
"Could not get channel info.": "Wedi methu llwytho gwybodaeth y sianel.",
"`x` ago": "`x` yn ôl",
"Load more": "Llwytho rhagor",
"Empty playlist": "Rhestr chwarae wag",
"Hide annotations": "Cuddio nodiadau",
"Show annotations": "Dangos nodiadau",
"Premieres in `x`": "Yn dechrau mewn `x`",
"Premieres `x`": "Yn dechrau `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.": "Helo! Mae'n ymddangos eich bod wedi diffodd JavaScript. Cliciwch yma i weld sylwadau, ond cofiwch y gall gymryd mwy o amser i'w llwytho.",
"View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "Gweld `x` sylw",
"": "Gweld `x` sylw"
},
"Could not create mix.": "Wedi methu creu'r cymysgiad hwn.",
"Erroneous token": "Tocyn annilys",
"No such user": "Dyw'r defnyddiwr hwn ddim yn bodoli",
"Token is expired, please try again": "Mae'r tocyn hwn wedi dod i ben, ceisiwch eto",
"Bangla": "Bangleg",
"Basque": "Basgeg",
"Bulgarian": "Bwlgareg",
"Catalan": "Catalaneg",
"Chinese": "Tsieineeg",
"Chinese (China)": "Tsieineeg (Tsieina)",
"Chinese (Hong Kong)": "Tsieineeg (Hong Kong)",
"Chinese (Taiwan)": "Tsieineeg (Taiwan)",
"Danish": "Daneg",
"Dutch": "Iseldireg",
"Esperanto": "Esperanteg",
"Finnish": "Ffinneg",
"French": "Ffrangeg",
"German": "Almaeneg",
"Greek": "Groeg",
"Could not pull trending pages.": "Wedi methu llwytho tudalennau pynciau llosg.",
"Hidden field \"challenge\" is a required field": "Mae'r maes cudd \"her\" yn ofynnol",
"Hidden field \"token\" is a required field": "Mae'r maes cudd \"tocyn\" yn ofynnol",
"Hebrew": "Hebraeg",
"Hungarian": "Hwngareg",
"Irish": "Gwyddeleg",
"Italian": "Eidaleg",
"Welsh": "Cymraeg",
"generic_count_hours_0": "{{count}} awr",
"generic_count_hours_1": "{{count}} awr",
"generic_count_hours_2": "{{count}} awr",
"generic_count_hours_3": "{{count}} awr",
"generic_count_hours_4": "{{count}} awr",
"generic_count_hours_5": "{{count}} awr",
"generic_count_minutes_0": "{{count}} munud",
"generic_count_minutes_1": "{{count}} munud",
"generic_count_minutes_2": "{{count}} funud",
"generic_count_minutes_3": "{{count}} munud",
"generic_count_minutes_4": "{{count}} o funudau",
"generic_count_minutes_5": "{{count}} o funudau",
"generic_count_weeks_0": "{{count}} wythnos",
"generic_count_weeks_1": "{{count}} wythnos",
"generic_count_weeks_2": "{{count}} wythnos",
"generic_count_weeks_3": "{{count}} wythnos",
"generic_count_weeks_4": "{{count}} wythnos",
"generic_count_weeks_5": "{{count}} wythnos",
"generic_count_seconds_0": "{{count}} eiliad",
"generic_count_seconds_1": "{{count}} eiliad",
"generic_count_seconds_2": "{{count}} eiliad",
"generic_count_seconds_3": "{{count}} eiliad",
"generic_count_seconds_4": "{{count}} o eiliadau",
"generic_count_seconds_5": "{{count}} o eiliadau",
"Fallback comments: ": "Sylwadau amgen: ",
"Popular": "Poblogaidd",
"preferences_locale_label": "Iaith: ",
"About": "Ynghylch",
"Search": "Chwilio",
"search_filters_features_option_c_commons": "Comin Creu",
"search_filters_features_option_subtitles": "Isdeitlau (CC)",
"search_filters_features_option_hd": "HD",
"permalink": "dolen barhaol",
"search_filters_duration_option_short": "Byr (< 4 munud)",
"search_filters_duration_option_none": "Unrhyw hyd",
"search_filters_duration_label": "Hyd",
"search_filters_type_option_show": "Rhaglen",
"search_filters_type_option_movie": "Ffilm",
"search_filters_type_option_playlist": "Rhestr chwarae",
"search_filters_type_option_channel": "Sianel",
"search_filters_type_option_video": "Fideo",
"search_filters_type_option_all": "Unrhyw fath",
"search_filters_date_option_week": "Yr wythnos hon",
"search_filters_date_option_today": "Heddiw",
"search_filters_date_option_hour": "Yr awr ddiwethaf",
"search_filters_date_option_none": "Unrhyw ddyddiad",
"search_filters_date_label": "Dyddiad uwchlwytho",
"search_filters_title": "Hidlyddion",
"Playlists": "Rhestrau chwarae",
"Video mode": "Modd fideo",
"Audio mode": "Modd sain",
"Channel Sponsor": "Noddwr y sianel",
"(edited)": "(golygwyd)",
"Download": "Islwytho",
"Movies": "Ffilmiau",
"News": "Newyddion",
"Gaming": "Gemau",
"Music": "Cerddoriaeth",
"Download is disabled": "Mae islwytho wedi'i analluogi",
"Download as: ": "Islwytho fel: ",
"View as playlist": "Gweld fel rhestr chwarae",
"Default": "Rhagosodiad",
"YouTube comment permalink": "Dolen barhaol i'r sylw ar YouTube",
"crash_page_before_reporting": "Cyn adrodd nam, sicrhewch eich bod wedi:",
"crash_page_search_issue": "<a href=\"`x`\">chwilio am y nam ar GitHub</a>",
"videoinfo_watch_on_youTube": "Gwylio ar YouTube",
"videoinfo_started_streaming_x_ago": "Yn ffrydio'n fyw ers `x` o funudau",
"videoinfo_invidious_embed_link": "Dolen mewnblannu",
"footer_documentation": "Dogfennaeth",
"footer_donate_page": "Rhoddi",
"Current version: ": "Fersiwn gyfredol: ",
"search_filters_apply_button": "Rhoi'r hidlyddion ar waith",
"search_filters_sort_option_date": "Dyddiad uwchlwytho",
"search_filters_sort_option_relevance": "Perthnasedd",
"search_filters_sort_label": "Trefnu yn ôl",
"search_filters_features_option_location": "Lleoliad",
"search_filters_features_option_hdr": "HDR",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_vr180": "VR180",
"search_filters_features_option_three_sixty": "360°",
"videoinfo_youTube_embed_link": "Mewnblannu",
"download_subtitles": "Isdeitlau - `x` (.vtt)",
"user_created_playlists": "`x` rhestr chwarae wedi'u creu",
"user_saved_playlists": "`x` rhestr chwarae wedi'u cadw",
"Video unavailable": "Fideo ddim ar gael",
"crash_page_you_found_a_bug": "Mae'n debyg eich bod wedi dod o hyd i nam yn Invidious!",
"channel_tab_channels_label": "Sianeli",
"channel_tab_community_label": "Cymuned",
"channel_tab_shorts_label": "Fideos byrion",
"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."
}
+38 -3
View File
@@ -165,12 +165,12 @@
"Password cannot be empty": "Adgangskoden må ikke være tom",
"Password cannot be longer than 55 characters": "Adgangskoden må ikke være længere end 55 tegn",
"Please log in": "Venligst log ind",
"channel:`x`": "kanal: 'x'",
"channel:`x`": "kanal: `x`",
"Deleted or invalid channel": "Slettet eller invalid kanal",
"This channel does not exist.": "Denne kanal eksisterer ikke.",
"Could not get channel info.": "Kunne ikke hente kanal info.",
"Could not fetch comments": "Kunne ikke hente kommentarer",
"`x` ago": "'x' siden",
"`x` ago": "`x` siden",
"Load more": "Hent flere",
"Could not create mix.": "Kunne ikke skabe blanding.",
"Empty playlist": "Tom playliste",
@@ -452,5 +452,40 @@
"crash_page_you_found_a_bug": "Det ser ud til, at du har fundet en fejl i Invidious!",
"crash_page_read_the_faq": "læs <a href=\"`x`\">Ofte stillede spørgsmål (FAQ)</a>",
"crash_page_search_issue": "søgte efter <a href=\"`x`\">eksisterende problemer på GitHub</a>",
"search_filters_title": "Filter"
"search_filters_title": "Filter",
"playlist_button_add_items": "Tilføj videoer",
"search_message_no_results": "Ingen resultater fundet.",
"Import YouTube watch history (.json)": "Importer YouTube afspilningshistorik (.json)",
"search_message_change_filters_or_query": "Prøv at udvide din søgeforspørgsel og/eller ændre filtrene.",
"search_message_use_another_instance": " Du kan også <a href=\"`x`\">søge på en anden instans</a>.",
"Music in this video": "Musik i denne video",
"search_filters_date_option_none": "Enhver dato",
"search_filters_type_option_all": "Enhver type",
"search_filters_duration_option_none": "Enhver varighed",
"search_filters_duration_option_medium": "Medium (4 - 20 minutter)",
"search_filters_features_option_vr180": "VR180",
"generic_channels_count": "{{count}} kanal",
"generic_channels_count_plural": "{{count}} kanaler",
"Import YouTube playlist (.csv)": "Importer YouTube playliste (.csv)",
"Standard YouTube license": "Standard Youtube-licens",
"Album: ": "Album: ",
"Channel Sponsor": "Kanal-sponsor",
"Song: ": "Sang: ",
"channel_tab_playlists_label": "Playlister",
"channel_tab_channels_label": "Kanaler",
"Artist: ": "Kunstner: ",
"search_filters_date_label": "Uploaddato",
"generic_button_delete": "Slet",
"generic_button_edit": "Rediger",
"generic_button_save": "Gem",
"generic_button_cancel": "Afbryd",
"generic_button_rss": "RSS",
"Popular enabled: ": "Populær aktiveret: ",
"search_filters_apply_button": "Anvend udvalgte filtre",
"channel_tab_shorts_label": "Shorts",
"channel_tab_streams_label": "Livestreams",
"channel_tab_podcasts_label": "Podcasts",
"channel_tab_releases_label": "Udgivelser",
"Download is disabled": "Download er slået fra",
"error_video_not_in_playlist": "Den ønskede video findes ikke i denne playliste. <a href=\"`x`\">Klik her for playlistens startside.</a>"
}
+20 -5
View File
@@ -11,6 +11,7 @@
"last": "neueste",
"Next page": "Nächste Seite",
"Previous page": "Vorherige Seite",
"First page": "Erste Seite",
"Clear watch history?": "Verlauf löschen?",
"New password": "Neues Passwort",
"New passwords must match": "Neue Passwörter müssen übereinstimmen",
@@ -21,7 +22,7 @@
"Import and Export Data": "Daten importieren und exportieren",
"Import": "Importieren",
"Import Invidious data": "Invidious-JSON-Daten importieren",
"Import YouTube subscriptions": "YouTube-/OPML-Abonnements importieren",
"Import YouTube subscriptions": "YouTube-CSV/OPML-Abonnements importieren",
"Import FreeTube subscriptions (.db)": "FreeTube Abonnements importieren (.db)",
"Import NewPipe subscriptions (.json)": "NewPipe Abonnements importieren (.json)",
"Import NewPipe data (.zip)": "NewPipe Daten importieren (.zip)",
@@ -47,6 +48,7 @@
"Preferences": "Einstellungen",
"preferences_category_player": "Wiedergabeeinstellungen",
"preferences_video_loop_label": "Immer wiederholen: ",
"preferences_preload_label": "Videodaten vorladen: ",
"preferences_autoplay_label": "Automatisch abspielen: ",
"preferences_continue_label": "Immer automatisch nächstes Video abspielen: ",
"preferences_continue_autoplay_label": "Nächstes Video automatisch abspielen: ",
@@ -148,7 +150,7 @@
"Whitelisted regions: ": "Erlaubte Regionen: ",
"Blacklisted regions: ": "Unerlaubte Regionen: ",
"Shared `x`": "Geteilt `x`",
"Premieres in `x`": "Zuerst gesehen in `x`",
"Premieres in `x`": "Premiere in `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 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",
@@ -322,7 +324,7 @@
"channel_tab_community_label": "Gemeinschaft",
"search_filters_sort_option_relevance": "Relevanz",
"search_filters_sort_option_rating": "Bewertung",
"search_filters_sort_option_date": "Datum",
"search_filters_sort_option_date": "Hochladedatum",
"search_filters_sort_option_views": "Aufrufe",
"search_filters_type_label": "Inhaltstyp",
"search_filters_duration_label": "Dauer",
@@ -454,7 +456,7 @@
"Portuguese (auto-generated)": "Portugiesisch (automatisch generiert)",
"search_filters_title": "Filtern",
"search_message_change_filters_or_query": "Versuchen Sie, Ihre Suchanfrage zu erweitern und/oder die Filter zu ändern.",
"search_message_use_another_instance": " Sie können 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: ",
"search_message_no_results": "Keine Ergebnisse gefunden.",
"search_filters_duration_option_medium": "Mittel (4 - 20 Minuten)",
@@ -486,5 +488,18 @@
"channel_tab_podcasts_label": "Podcasts",
"channel_tab_releases_label": "Veröffentlichungen",
"generic_channels_count": "{{count}} Kanal",
"generic_channels_count_plural": "{{count}} Kanäle"
"generic_channels_count_plural": "{{count}} Kanäle",
"Import YouTube watch history (.json)": "YouTube Wiedergabeverlauf importieren (.json)",
"Answer": "Antwort",
"The Popular feed has been disabled by the administrator.": "Der Feed für beliebte Inhalte wurde vom Administrator deaktiviert.",
"Add to playlist": "Einer Wiedergabeliste hinzufügen",
"Search for videos": "Nach Videos suchen",
"toggle_theme": "Thema wechseln",
"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"
}
+18 -3
View File
@@ -21,7 +21,7 @@
"Import and Export Data": "Εισαγωγή και Εξαγωγή Δεδομένων",
"Import": "Εισαγωγή",
"Import Invidious data": "Εsαγωγή δεδομένων Invidious JSON",
"Import YouTube subscriptions": "Εισαγωγή συνδρομών YouTube/OPML",
"Import YouTube subscriptions": "Εισαγωγή συνδρομών YouTube απο CVS/OPML",
"Import FreeTube subscriptions (.db)": "Εισαγωγή συνδρομών FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Εισαγωγή συνδρομών NewPipe (.json)",
"Import NewPipe data (.zip)": "Εισαγωγή δεδομένων NewPipe (.zip)",
@@ -455,7 +455,7 @@
"channel_tab_streams_label": "Ζωντανή μετάδοση",
"playlist_button_add_items": "Προσθήκη βίντεο",
"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_cancel": "Ακύρωση",
"subscriptions_unseen_notifs_count": "{{count}} μη αναγνωσμένη ειδοποίηση",
@@ -486,5 +486,20 @@
"Switch Invidious Instance": "Αλλαγή Instance Invidious",
"Standard YouTube license": "Τυπική άδεια YouTube",
"search_filters_duration_option_medium": "Μεσαία (4 - 20 λεπτά)",
"search_filters_date_label": "Ημερομηνία αναφόρτωσης"
"search_filters_date_label": "Ημερομηνία αναφόρτωσης",
"Search for videos": "Αναζήτηση βίντεο",
"The Popular feed has been disabled by the administrator.": "Η δημοφιλής ροή έχει απενεργοποιηθεί από τον διαχειριστή.",
"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": "Δημοσιεύσεις"
}
+22 -7
View File
@@ -1,4 +1,9 @@
{
"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.",
"generic_channels_count": "{{count}} channel",
"generic_channels_count_plural": "{{count}} channels",
"generic_views_count": "{{count}} view",
@@ -28,6 +33,7 @@
"last": "last",
"Next page": "Next page",
"Previous page": "Previous page",
"First page": "First page",
"Clear watch history?": "Clear watch history?",
"New password": "New password",
"New passwords must match": "New passwords must match",
@@ -38,7 +44,7 @@
"Import and Export Data": "Import and Export Data",
"Import": "Import",
"Import Invidious data": "Import Invidious JSON data",
"Import YouTube subscriptions": "Import YouTube/OPML subscriptions",
"Import YouTube subscriptions": "Import YouTube CSV or OPML subscriptions",
"Import YouTube playlist (.csv)": "Import YouTube playlist (.csv)",
"Import YouTube watch history (.json)": "Import YouTube watch history (.json)",
"Import FreeTube subscriptions (.db)": "Import FreeTube subscriptions (.db)",
@@ -58,14 +64,13 @@
"User ID": "User ID",
"Password": "Password",
"Time (h:mm:ss):": "Time (h:mm:ss):",
"Text CAPTCHA": "Text CAPTCHA",
"Image CAPTCHA": "Image CAPTCHA",
"Sign In": "Sign In",
"Register": "Register",
"E-mail": "E-mail",
"Preferences": "Preferences",
"preferences_category_player": "Player preferences",
"preferences_video_loop_label": "Always loop: ",
"preferences_preload_label": "Preload video data: ",
"preferences_autoplay_label": "Autoplay: ",
"preferences_continue_label": "Play next by default: ",
"preferences_continue_autoplay_label": "Autoplay next video: ",
@@ -185,7 +190,7 @@
"Switch Invidious Instance": "Switch Invidious Instance",
"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_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",
"Show annotations": "Show annotations",
"Genre: ": "Genre: ",
@@ -280,6 +285,7 @@
"Esperanto": "Esperanto",
"Estonian": "Estonian",
"Filipino": "Filipino",
"Filipino (auto-generated)": "Filipino (auto-generated)",
"Finnish": "Finnish",
"French": "French",
"French (auto-generated)": "French (auto-generated)",
@@ -417,7 +423,7 @@
"search_filters_title": "Filters",
"search_filters_date_label": "Upload 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_week": "This week",
"search_filters_date_option_month": "This month",
@@ -449,7 +455,7 @@
"search_filters_sort_label": "Sort By",
"search_filters_sort_option_relevance": "Relevance",
"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_apply_button": "Apply selected filters",
"Current version: ": "Current version: ",
@@ -485,7 +491,16 @@
"channel_tab_streams_label": "Livestreams",
"channel_tab_podcasts_label": "Podcasts",
"channel_tab_releases_label": "Releases",
"channel_tab_courses_label": "Courses",
"channel_tab_playlists_label": "Playlists",
"channel_tab_community_label": "Community",
"channel_tab_channels_label": "Channels"
"channel_tab_posts_label": "Posts",
"channel_tab_channels_label": "Channels",
"toggle_theme": "Toggle Theme",
"carousel_slide": "Slide {{current}} of {{total}}",
"carousel_skip": "Skip the Carousel",
"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"
}
+85 -53
View File
@@ -21,7 +21,7 @@
"Import and Export Data": "Importación y exportación de datos",
"Import": "Importar",
"Import Invidious data": "Importar datos JSON de Invidious",
"Import YouTube subscriptions": "Importar suscripciones de YouTube/OPML",
"Import YouTube subscriptions": "Importar suscripciones CSV u OPML de YouTube",
"Import FreeTube subscriptions (.db)": "Importar suscripciones de FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importar suscripciones de NewPipe (.json)",
"Import NewPipe data (.zip)": "Importar datos de NewPipe (.zip)",
@@ -90,7 +90,7 @@
"preferences_notifications_only_label": "Mostrar solo notificaciones (si hay alguna): ",
"Enable web notifications": "Habilitar notificaciones web",
"`x` uploaded a video": "`x` subió un video",
"`x` is live": "`x` esta en vivo",
"`x` is live": "`x` está en directo",
"preferences_category_data": "Preferencias de los datos",
"Clear watch history": "Borrar el historial de reproducción",
"Import/export data": "Importar/Exportar datos",
@@ -102,7 +102,7 @@
"preferences_category_admin": "Preferencias de administrador",
"preferences_default_home_label": "Página de inicio por defecto: ",
"preferences_feed_menu_label": "Menú de fuentes: ",
"preferences_show_nick_label": "Mostrar nombre de usuario arriba: ",
"preferences_show_nick_label": "Mostrar nombre de usuario encima: ",
"Top enabled: ": "¿Habilitar los destacados? ",
"CAPTCHA enabled: ": "¿Habilitar los CAPTCHA? ",
"Login enabled: ": "¿Habilitar el inicio de sesión? ",
@@ -133,7 +133,7 @@
"Create playlist": "Crear lista de reproducción",
"Title": "Título",
"Playlist privacy": "Privacidad de la lista de reproducción",
"Editing playlist `x`": "Editando la lista de reproducción 'x'",
"Editing playlist `x`": "Editando la lista de reproducción `x`",
"Show more": "Mostrar más",
"Show less": "Mostrar menos",
"Watch on YouTube": "Ver en YouTube",
@@ -144,13 +144,13 @@
"License: ": "Licencia: ",
"Family friendly? ": "¿Filtrar contenidos? ",
"Wilson score: ": "Puntuación Wilson: ",
"Engagement: ": "Compromiso: ",
"Engagement: ": "Retención: ",
"Whitelisted regions: ": "Regiones permitidas: ",
"Blacklisted regions: ": "Regiones bloqueadas: ",
"Shared `x`": "Compartido `x`",
"Premieres in `x`": "Se estrena en `x`",
"Premieres `x`": "Estrenos `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.": "¡Hola! Parece que tienes JavaScript desactivado. Haz clic aquí para ver los comentarios, pero tengas en cuenta que pueden tardar un poco más en cargarse.",
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "¡Hola! Parece que tienes JavaScript desactivado. Haz clic aquí para ver los comentarios, ten en cuenta que pueden tardar un poco más en cargar.",
"View YouTube comments": "Ver los comentarios de YouTube",
"View more comments on Reddit": "Ver más comentarios en Reddit",
"View `x` comments": {
@@ -187,10 +187,10 @@
"Hidden field \"token\" is a required field": "El campo oculto «símbolo» es un campo obligatorio",
"Erroneous challenge": "Desafío no válido",
"Erroneous token": "Símbolo no válido",
"No such user": "Usuario no existe",
"No such user": "El usuario no existe",
"Token is expired, please try again": "El símbolo ha caducado, inténtelo de nuevo",
"English": "Inglés",
"English (auto-generated)": "Inglés (generado automáticamente)",
"English (auto-generated)": "Inglés (generados automáticamente)",
"Afrikaans": "Afrikáans",
"Albanian": "Albanés",
"Amharic": "Amárico",
@@ -276,7 +276,7 @@
"Somali": "Somalí",
"Southern Sotho": "Sesoto",
"Spanish": "Español",
"Spanish (Latin America)": "Español (Hispanoamérica)",
"Spanish (Latin America)": "Español (Latinoamérica)",
"Sundanese": "Sondanés",
"Swahili": "Suajili",
"Swedish": "Sueco",
@@ -312,7 +312,7 @@
"Download as: ": "Descargar como: ",
"%A %B %-d, %Y": "%A %B %-d, %Y",
"(edited)": "(editado)",
"YouTube comment permalink": "Enlace permanente de YouTube del comentario",
"YouTube comment permalink": "Enlace permanente de comentario de YouTube",
"permalink": "enlace permanente",
"`x` marked it with a ❤": "`x` lo ha marcado con un ❤",
"Audio mode": "Modo de audio",
@@ -324,10 +324,10 @@
"search_filters_sort_option_rating": "Valoración",
"search_filters_sort_option_date": "Fecha de subida",
"search_filters_sort_option_views": "Visualizaciones",
"search_filters_type_label": "tipo de contenido",
"search_filters_duration_label": "duración",
"search_filters_features_label": "funcionalidades",
"search_filters_sort_label": "ordenar",
"search_filters_type_label": "Tipo de contenido",
"search_filters_duration_label": "Duración",
"search_filters_features_label": "Funcionalidades",
"search_filters_sort_label": "Ordenar",
"search_filters_date_option_hour": "Última hora",
"search_filters_date_option_today": "Hoy",
"search_filters_date_option_week": "Esta semana",
@@ -390,43 +390,58 @@
"search_filters_features_option_three_sixty": "360°",
"videoinfo_watch_on_youTube": "Ver en YouTube",
"preferences_save_player_pos_label": "Guardar posición de reproducción: ",
"generic_views_count": "{{count}} visualización",
"generic_views_count_plural": "{{count}} visualizaciones",
"generic_subscribers_count": "{{count}} suscriptor",
"generic_subscribers_count_plural": "{{count}} suscriptores",
"generic_subscriptions_count": "{{count}} suscripción",
"generic_subscriptions_count_plural": "{{count}} suscripciones",
"subscriptions_unseen_notifs_count": "{{count}} notificación no vista",
"subscriptions_unseen_notifs_count_plural": "{{count}} notificaciones no vistas",
"generic_count_days": "{{count}} día",
"generic_count_days_plural": "{{count}} días",
"comments_view_x_replies": "Ver {{count}} respuesta",
"comments_view_x_replies_plural": "Ver {{count}} respuestas",
"generic_count_weeks": "{{count}} semana",
"generic_count_weeks_plural": "{{count}} semanas",
"generic_playlists_count": "{{count}} lista de reproducción",
"generic_playlists_count_plural": "{{count}} listas de reproducciones",
"generic_videos_count": "{{count}} video",
"generic_videos_count_plural": "{{count}} video",
"generic_count_months": "{{count}} mes",
"generic_count_months_plural": "{{count}} meses",
"comments_points_count": "{{count}} punto",
"comments_points_count_plural": "{{count}} puntos",
"generic_count_years": "{{count}} año",
"generic_count_years_plural": "{{count}} años",
"generic_count_hours": "{{count}} hora",
"generic_count_hours_plural": "{{count}} horas",
"generic_count_minutes": "{{count}} minuto",
"generic_count_minutes_plural": "{{count}} minutos",
"generic_count_seconds": "{{count}} segundo",
"generic_count_seconds_plural": "{{count}} segundos",
"generic_views_count_0": "{{count}} visualización",
"generic_views_count_1": "{{count}} visualizaciones",
"generic_views_count_2": "{{count}} visualizaciones",
"generic_subscribers_count_0": "{{count}} suscriptor",
"generic_subscribers_count_1": "{{count}} suscriptores",
"generic_subscribers_count_2": "{{count}} suscriptores",
"generic_subscriptions_count_0": "{{count}} suscripción",
"generic_subscriptions_count_1": "{{count}} suscripciones",
"generic_subscriptions_count_2": "{{count}} suscripciones",
"subscriptions_unseen_notifs_count_0": "{{count}} notificación sin ver",
"subscriptions_unseen_notifs_count_1": "{{count}} notificaciones sin ver",
"subscriptions_unseen_notifs_count_2": "{{count}} notificaciones sin ver",
"generic_count_days_0": "{{count}} a",
"generic_count_days_1": "{{count}} as",
"generic_count_days_2": "{{count}} días",
"comments_view_x_replies_0": "Ver {{count}} respuesta",
"comments_view_x_replies_1": "Ver {{count}} respuestas",
"comments_view_x_replies_2": "Ver {{count}} respuestas",
"generic_count_weeks_0": "{{count}} semana",
"generic_count_weeks_1": "{{count}} semanas",
"generic_count_weeks_2": "{{count}} semanas",
"generic_playlists_count_0": "{{count}} lista de reproducción",
"generic_playlists_count_1": "{{count}} listas de reproducción",
"generic_playlists_count_2": "{{count}} listas de reproducción",
"generic_videos_count_0": "{{count}} video",
"generic_videos_count_1": "{{count}} videos",
"generic_videos_count_2": "{{count}} videos",
"generic_count_months_0": "{{count}} mes",
"generic_count_months_1": "{{count}} meses",
"generic_count_months_2": "{{count}} meses",
"comments_points_count_0": "{{count}} punto",
"comments_points_count_1": "{{count}} puntos",
"comments_points_count_2": "{{count}} puntos",
"generic_count_years_0": "{{count}} año",
"generic_count_years_1": "{{count}} años",
"generic_count_years_2": "{{count}} años",
"generic_count_hours_0": "{{count}} hora",
"generic_count_hours_1": "{{count}} horas",
"generic_count_hours_2": "{{count}} horas",
"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",
"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_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_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_report_issue": "Si nada de lo anterior ha sido de ayuda, por favor, <a href=\"`x`\">abre una nueva incidencia en GitHub</a> (preferiblemente en inglés) e incluye verbatim el siguiente texto en tu mensaje:",
"crash_page_report_issue": "Si nada de lo anterior ha sido de ayuda, por favor, <a href=\"`x`\">abre una nueva incidencia en GitHub</a> (preferiblemente en inglés) e incluye el siguiente texto en tu mensaje (NO traduzcas este texto):",
"English (United States)": "Inglés (Estados Unidos)",
"Cantonese (Hong Kong)": "Cantonés (Hong Kong)",
"Dutch (auto-generated)": "Neerlandés (generados automáticamente)",
@@ -448,21 +463,22 @@
"Chinese (Hong Kong)": "Chino (Hong Kong)",
"Chinese (China)": "Chino (China)",
"Korean (auto-generated)": "Coreano (generados automáticamente)",
"Spanish (Mexico)": "Español (Méjico)",
"Spanish (Mexico)": "Español (México)",
"Spanish (auto-generated)": "Español (generados automáticamente)",
"preferences_watch_history_label": "Habilitar historial de reproducciones: ",
"search_message_no_results": "No se han encontrado resultados.",
"search_message_change_filters_or_query": "Pruebe ampliar la consulta de búsqueda y/o a cambiar los filtros.",
"search_filters_title": "Filtros",
"search_filters_date_label": "fecha de subida",
"search_filters_date_label": "Fecha de subida",
"search_filters_date_option_none": "Cualquier fecha",
"search_filters_type_option_all": "Cualquier tipo",
"search_filters_duration_option_none": "Cualquier duración",
"search_filters_features_option_vr180": "VR180",
"search_filters_apply_button": "Aplicar filtros",
"tokens_count": "{{count}} token",
"tokens_count_plural": "{{count}} tokens",
"search_message_use_another_instance": " También puede <a href=\"`x`\">buscar en otra instancia</a>.",
"tokens_count_0": "{{count}} token",
"tokens_count_1": "{{count}} tokens",
"tokens_count_2": "{{count}} tokens",
"search_message_use_another_instance": "También puedes <a href=\"`x`\">buscar en otra instancia</a>.",
"Popular enabled: ": "¿Habilitar la sección popular? ",
"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",
@@ -484,7 +500,23 @@
"generic_button_cancel": "Cancelar",
"generic_button_rss": "RSS",
"channel_tab_podcasts_label": "Podcasts",
"channel_tab_releases_label": "Publicaciones",
"generic_channels_count": "{{count}} canal",
"generic_channels_count_plural": "{{count}} canales"
"channel_tab_releases_label": "Lanzamientos",
"generic_channels_count_0": "{{count}} canal",
"generic_channels_count_1": "{{count}} canales",
"generic_channels_count_2": "{{count}} canales",
"Import YouTube watch history (.json)": "Importar el historial de las visualizaciones de YouTube (.json)",
"toggle_theme": "Alternar tema",
"Add to playlist: ": "Añadir a la lista de reproducción: ",
"Add to playlist": "Añadir a la lista de reproducción",
"Answer": "Respuesta",
"Search for videos": "Buscar por vídeos",
"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_skip": "Saltar el carrusel",
"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"
}
+11 -11
View File
@@ -161,13 +161,13 @@
"Source available here.": "Iturburua hemen eskura.",
"View JavaScript license information.": "JavaScriptaren lizentzi adierazpena ikusi.",
"Blacklisted regions: ": "zerrenda beltzaren zonaldeak: ",
"Premieres `x`": "'x' estrenaldiak",
"Premieres `x`": "`x` estrenaldiak",
"Wrong answer": "Erantzun ez zuzena",
"Password is a required field": "Pasahitza beharrezkoa da",
"Wrong username or password": "Pasahitza edo ezizena gaizki",
"Password cannot be longer than 55 characters": "Pasahitza 55 karaktere baino luzeagoa ezin da izan",
"This channel does not exist.": "Kanal hau ez dago.",
"`x` ago": "duela 'x'",
"`x` ago": "duela `x`",
"Czech": "Txekiera",
"preferences_region_label": "Herrialdeko edukiera: ",
"preferences_sort_label": "Bideoak ordenatu: ",
@@ -207,24 +207,24 @@
"Public": "Orokorra",
"Unlisted": "Ez zerrendatua",
"Subscription manager": "Harpidetzen kudeatzailea",
"Updated `x` ago": "Duela 'x' eguneratua",
"Updated `x` ago": "Duela `x` eguneratua",
"Hide replies": "Erantzunak izkutatu",
"preferences_thin_mode_label": "Urri eran: ",
"Show replies": "Erantzunak erakutsi",
"Watch on YouTube": "YouTuben ikusi",
"Premieres in `x`": "'x'eko estrenaldiak",
"Delete playlist `x`?": "'x' zerrenda ezabatu nahi?",
"Premieres in `x`": "`x`eko estrenaldiak",
"Delete playlist `x`?": "`x` zerrenda ezabatu nahi?",
"Token is expired, please try again": "Token kadukatua, saiatu berriro",
"CAPTCHA enabled: ": "CAPTCHA gaitu: ",
"Released under the AGPLv3 on Github.": "GitHubeko AGPLv3pean argitaratuta.",
"channel:`x`": "Kanal: 'x'",
"channel:`x`": "Kanal: `x`",
"Georgian": "Georgiera",
"Incorrect password": "Pasahitza gaizki",
"Playlist does not exist.": "Zerrenda ez da existitzen.",
"preferences_category_misc": "Askotariko lehentasunak",
"View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "'x' iruzkina ikusi",
"": "'x' iruzkinak ikusi"
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` iruzkina ikusi",
"": "`x` iruzkinak ikusi"
},
"Report statistics: ": "Estatistikak adierazi: ",
"preferences_max_results_label": "Jotzeko bideo zerrendaren luzera: ",
@@ -237,7 +237,7 @@
"Hidden field \"challenge\" is a required field": "\"challenge\" eremu ezkutua beharrezkoa da",
"German": "Alemaniarra",
"View YouTube comments": "YouTubeko iruzkinak ikusi",
"`x` is live": "'x' bizirik darrai",
"`x` is live": "`x` bizirik darrai",
"Password cannot be empty": "Pasahitza ezin da hutsik utzi",
"preferences_video_loop_label": "Beti begiztatu: ",
"Only show latest unwatched video from channel: ": "kanalaren azken bideo ezikusia erakutsi soilik ",
@@ -261,9 +261,9 @@
"Hide annotations": "Oharrak izkutatu",
"Title": "Titulua",
"channel name": "Kanalaren izena",
"Authorize token for `x`?": "Baimendu tokena 'x'tzako?",
"Authorize token for `x`?": "Baimendu tokena `x`tzako?",
"Private": "Pribatua",
"Editing playlist `x`": "'x' zerrenda editatu",
"Editing playlist `x`": "`x` zerrenda editatu",
"Could not pull trending pages.": "Ezin ekarri orri arrakastatsuak.",
"crash_page_read_the_faq": "Bide <a href=\"`x`\"> (FAQ) ohiko galderak</a>"
}
+75 -23
View File
@@ -1,9 +1,14 @@
{
"generic_views_count_0": "{{count}} بازدید",
"generic_videos_count_0": "{{count}} ویدئو",
"generic_playlists_count_0": "{{count}} فهرست پخش",
"generic_subscribers_count_0": "{{count}} دنبال کننده",
"generic_subscriptions_count_0": "{{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_subscriptions_count": "{{count}} اشتراک",
"generic_subscriptions_count_plural": "{{count}} اشتراک",
"LIVE": "زنده",
"Shared `x` ago": "`x` پیش به اشتراک گذاشته شده",
"Unsubscribe": "لغو اشتراک",
@@ -12,7 +17,7 @@
"View playlist on YouTube": "دیدن فهرست پخش در یوتیوب",
"newest": "تازه‌ترین",
"oldest": "کهنه‌ترین",
"popular": "محبوب",
"popular": "پرطرفدار",
"last": "آخرین",
"Next page": "صفحه بعد",
"Previous page": "صفحه قبل",
@@ -26,7 +31,7 @@
"Import and Export Data": "درون‌برد و برون‌برد داده",
"Import": "درون‌برد",
"Import Invidious data": "وارد کردن داده JSON اینویدیوس",
"Import YouTube subscriptions": "وارد کردن اشتراک OPML/ یوتیوب",
"Import YouTube subscriptions": "وارد کردن فایل CSV یا OPML سابسکرایب های یوتیوب",
"Import FreeTube subscriptions (.db)": "درون‌برد اشتراک‌های فری‌تیوب (.db)",
"Import NewPipe subscriptions (.json)": "درون‌برد اشتراک‌های نیوپایپ (.json)",
"Import NewPipe data (.zip)": "درون‌برد داده نیوپایپ (.zip)",
@@ -117,13 +122,15 @@
"Subscription manager": "مدیریت اشتراک",
"Token manager": "مدیر توکن",
"Token": "توکن",
"tokens_count_0": "{{count}} توکن ها",
"tokens_count": "{{count}} توکن",
"tokens_count_plural": "{{count}} توکن",
"Import/export": "وارد کردن/خارج کردن",
"unsubscribe": "لغو اشتراک",
"revoke": "ابطال",
"Subscriptions": "اشتراک ها",
"subscriptions_unseen_notifs_count_0": "{{count}} اعلان نادیده",
"search": "جستجو",
"subscriptions_unseen_notifs_count": "{{count}} اعلان نادیده",
"subscriptions_unseen_notifs_count_plural": "{{count}} اعلان نادیده",
"search": "جست و جو",
"Log out": "خروج",
"Released under the AGPLv3 on Github.": "منتشر شده تحت پروانه AGPLv3 روی گیت‌هاب.",
"Source available here.": "منبع اینجا دردسترس است.",
@@ -183,10 +190,12 @@
"This channel does not exist.": "این کانال وجود ندارد.",
"Could not get channel info.": "نمیتوان اطلاعات کانال را دریافت کرد.",
"Could not fetch comments": "نمیتوان نظرات را دریافت کرد",
"comments_view_x_replies_0": "نمایش {{count}} پاسخ ها",
"comments_view_x_replies": "نمایش {{count}} پاسخ",
"comments_view_x_replies_plural": "نمایش {{count}} پاسخ",
"`x` ago": "`x` پیش",
"Load more": "بارگذاری بیشتر",
"comments_points_count_0": "{{count}} نقطه ها",
"comments_points_count": "{{count}} نقطه",
"comments_points_count_plural": "{{count}} نقطه",
"Could not create mix.": "نمیتوان میکس ساخت.",
"Empty playlist": "سیاههٔ پخش خالی",
"Not a playlist.": "یک سیاههٔ پخش نیست.",
@@ -304,16 +313,23 @@
"Yiddish": "ییدیش",
"Yoruba": "یوروبایی",
"Zulu": "زولو",
"generic_count_years_0": "{{count}} سال",
"generic_count_months_0": "{{count}} ماه",
"generic_count_weeks_0": "{{count}} هفته",
"generic_count_days_0": "{{count}} روز",
"generic_count_hours_0": "{{count}} ساعت",
"generic_count_minutes_0": "{{count}} دقیقه",
"generic_count_seconds_0": "{{count}} ثانیه",
"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}} ساعت",
"generic_count_minutes": "{{count}} دقیقه",
"generic_count_minutes_plural": "{{count}} دقیقه",
"generic_count_seconds": "{{count}} ثانیه",
"generic_count_seconds_plural": "{{count}} ثانیه",
"Fallback comments: ": "نظرات عقب گرد: ",
"Popular": "محبوب",
"Search": "جستجو",
"Popular": "پربیننده",
"Search": "جست و جو",
"Top": "بالا",
"About": "درباره",
"Rating: ": "رتبه دهی: ",
@@ -344,7 +360,7 @@
"search_filters_duration_label": "مدت",
"search_filters_features_label": "ویژگی‌ها",
"search_filters_sort_label": "به ترتیب",
"search_filters_date_option_hour": "یک ساعت گذشته",
"search_filters_date_option_hour": "ساعت گذشته",
"search_filters_date_option_today": "امروز",
"search_filters_date_option_week": "این هفته",
"search_filters_date_option_month": "این ماه",
@@ -445,5 +461,41 @@
"Song: ": "آهنگ: ",
"Channel Sponsor": "اسپانسر کانال",
"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": "دریافت غیرفعال است",
"crash_page_before_reporting": "پیش از گزارش ایراد، مطمئنید شوید که:",
"playlist_button_add_items": "افزودن ویدیو",
"user_saved_playlists": "فهرست‌های پخش ذخیره شده",
"crash_page_refresh": "که صفحه را <a href=\"`x`\">بازنشانی</a> کرده‌اید",
"generic_button_save": "ذخیره",
"generic_button_cancel": "لغو",
"generic_channels_count": "{{count}} کانال",
"generic_channels_count_plural": "{{count}} کانال",
"generic_button_edit": "ویرایش",
"crash_page_switch_instance": "که تلاش کرده‌اید <a href=\"`x`\">از یک نمونهٔ دیگر</a> استفاده کنید",
"generic_button_rss": "خوراک RSS",
"crash_page_read_the_faq": "که <a href=\"`x`\">سوالات بیشتر پرسیده شده (FAQ)</a> را خوانده‌اید",
"generic_button_delete": "حذف",
"Import YouTube playlist (.csv)": "واردکردن فهرست‌پخش YouTube (.csv)",
"Import YouTube watch history (.json)": "وارد کردن فهرست پخش YouTube (.json)",
"crash_page_you_found_a_bug": "به نظر می‌رسد که ایرادی در Invidious پیدا کرده‌اید!",
"channel_tab_podcasts_label": "پادکست‌ها",
"channel_tab_streams_label": "پخش زنده‌ها",
"channel_tab_shorts_label": "Shortها",
"channel_tab_playlists_label": "فهرست‌های پخش",
"channel_tab_channels_label": "کانال‌ها",
"error_video_not_in_playlist": "ویدیوی درخواستی معلق به این فهرست پخش نیست. <a href=\"`x`\">کلیک کنید تا به صفحهٔ اصلی فهرست پخش بروید.</a>",
"Add to playlist": "به لیست پخش افزوده شود",
"Answer": "پاسخ",
"Search for videos": "جست و جو برای ویدیوها",
"Add to playlist: ": "افزودن به لیست پخش ",
"The Popular feed has been disabled by the administrator.": "بخش ویدیوهای پرطرفدار توسط مدیر غیرفعال شده است.",
"carousel_slide": "اسلاید {{current}} از {{total}}",
"carousel_skip": "رد شدن از گرداننده",
"carousel_go_to": "به اسلاید `x` برو",
"crash_page_search_issue": "دنبال <a href=\"`x`\"> گشتیم بین مشکلات در گیت هاب </a>",
"crash_page_report_issue": "اگر هیچ یک از روش های بالا کمکی نکردند لطفا <a href=\"`x`\"> (ترجیحا به انگلیسی) یک سوال جدید در گیت هاب بپرسید و </a> طوری که سوالتون شامل متن زیر باشه:",
"channel_tab_releases_label": "آثار",
"toggle_theme": "تغییر وضعیت تم",
"preferences_preload_label": "پیش بار کردن داده‌های ویدیو: "
}
+79 -46
View File
@@ -14,7 +14,7 @@
"Clear watch history?": "Tyhjennä katseluhistoria?",
"New password": "Uusi salasana",
"New passwords must match": "Uusien salasanojen täytyy täsmätä",
"Authorize token?": "Valuutetaanko tunnus?",
"Authorize token?": "Valtuutetaanko tunnus?",
"Authorize token for `x`?": "Valtuutetaanko tunnus `x`:lle?",
"Yes": "Kyllä",
"No": "Ei",
@@ -28,7 +28,7 @@
"Export": "Vie",
"Export subscriptions as OPML": "Vie tilaukset OPML-muodossa",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Vie tilaukset OPML-muodossa (NewPipe & FreeTube)",
"Export data as JSON": "Vie Invidious-data JSON-muodossa",
"Export data as JSON": "Vie Invidiousin tiedot JSON-muodossa",
"Delete account?": "Poista tili?",
"History": "Historia",
"An alternative front-end to YouTube": "Vaihtoehtoinen front-end YouTubelle",
@@ -46,12 +46,12 @@
"E-mail": "Sähköposti",
"Preferences": "Asetukset",
"preferences_category_player": "Soittimen asetukset",
"preferences_video_loop_label": "Toista jatkuvasti aina: ",
"preferences_autoplay_label": "Automaattinen toisto: ",
"preferences_video_loop_label": "Toista aina uudelleen: ",
"preferences_autoplay_label": "Automaattinen toiston aloitus: ",
"preferences_continue_label": "Toista seuraava oletuksena: ",
"preferences_continue_autoplay_label": "Toista seuraava video automaattisesti: ",
"preferences_continue_autoplay_label": "Aloita seuraava video automaattisesti: ",
"preferences_listen_label": "Kuuntele oletuksena: ",
"preferences_local_label": "Proxytä videot: ",
"preferences_local_label": "Videot välityspalvelimen kautta: ",
"preferences_speed_label": "Oletusnopeus: ",
"preferences_quality_label": "Ensisijainen videon laatu: ",
"preferences_volume_label": "Soittimen äänenvoimakkuus: ",
@@ -63,7 +63,7 @@
"preferences_related_videos_label": "Näytä aiheeseen liittyviä videoita: ",
"preferences_annotations_label": "Näytä huomautukset oletuksena: ",
"preferences_extend_desc_label": "Laajenna automaattisesti videon kuvausta: ",
"preferences_vr_mode_label": "Interaktiiviset 360-asteiset videot (vaatii WebGL:n): ",
"preferences_vr_mode_label": "Interaktiiviset 360-videot (vaatii WebGL:n): ",
"preferences_category_visual": "Visuaaliset asetukset",
"preferences_player_style_label": "Soittimen tyyli: ",
"Dark mode: ": "Tumma tila: ",
@@ -137,9 +137,9 @@
"Show less": "Näytä vähemmän",
"Watch on YouTube": "Katso YouTubessa",
"Switch Invidious Instance": "Vaihda Invidious-instanssia",
"Hide annotations": "Piilota merkkaukset",
"Show annotations": "Näytä merkkaukset",
"Genre: ": "Genre: ",
"Hide annotations": "Piilota huomautukset",
"Show annotations": "Näytä huomautukset",
"Genre: ": "Tyylilaji: ",
"License: ": "Lisenssi: ",
"Family friendly? ": "Kaiken ikäisille sopiva? ",
"Wilson score: ": "Wilson-pistemäärä: ",
@@ -168,7 +168,7 @@
"Wrong username or password": "Väärä käyttäjänimi tai salasana",
"Password cannot be empty": "Salasana ei voi olla tyhjä",
"Password cannot be longer than 55 characters": "Salasana ei voi olla yli 55 merkkiä pitkä",
"Please log in": "Kirjaudu sisään, ole hyvä",
"Please log in": "Kirjaudu sisään",
"Invidious Private Feed for `x`": "Invidiousin yksityinen syöte `x`:lle",
"channel:`x`": "kanava:`x`",
"Deleted or invalid channel": "Poistettu tai virheellinen kanava",
@@ -178,7 +178,7 @@
"`x` ago": "`x` sitten",
"Load more": "Lataa lisää",
"Could not create mix.": "Sekoituksen luominen epäonnistui.",
"Empty playlist": "Tyhjennä soittolista",
"Empty playlist": "Tyhjä soittolista",
"Not a playlist.": "Ei ole soittolista.",
"Playlist does not exist.": "Soittolistaa ei ole olemassa.",
"Could not pull trending pages.": "Nousussa olevien sivujen lataus epäonnistui.",
@@ -216,11 +216,11 @@
"Filipino": "filipino",
"Finnish": "suomi",
"French": "ranska",
"Galician": "galego",
"Galician": "galicia",
"Georgian": "georgia",
"German": "saksa",
"Greek": "kreikka",
"Gujarati": "gujarati",
"Gujarati": "guarati",
"Haitian Creole": "haitinkreoli",
"Hausa": "hausa",
"Hawaiian": "havaiji",
@@ -327,11 +327,11 @@
"search_filters_duration_label": "Kesto",
"search_filters_features_label": "Ominaisuudet",
"search_filters_sort_label": "Luokittele",
"search_filters_date_option_hour": "Viimeisin tunti",
"search_filters_date_option_hour": "Tunnin sisään",
"search_filters_date_option_today": "Tänään",
"search_filters_date_option_week": "Tämä viikko",
"search_filters_date_option_month": "Tämä kuukausi",
"search_filters_date_option_year": "Tämä vuosi",
"search_filters_date_option_week": "Tällä viikolla",
"search_filters_date_option_month": "Tässä kuussa",
"search_filters_date_option_year": "Tänä vuonna",
"search_filters_type_option_video": "Video",
"search_filters_type_option_channel": "Kanava",
"search_filters_type_option_playlist": "Soittolista",
@@ -346,7 +346,7 @@
"search_filters_features_option_location": "Sijainti",
"search_filters_features_option_hdr": "HDR",
"Current version: ": "Tämänhetkinen versio: ",
"next_steps_error_message": "Sinun tulisi kokeilla seuraavia: ",
"next_steps_error_message": "Kokeile seuraavia: ",
"next_steps_error_message_refresh": "Päivitä",
"next_steps_error_message_go_to_youtube": "Siirry YouTubeen",
"generic_count_hours": "{{count}} tunti",
@@ -391,7 +391,7 @@
"subscriptions_unseen_notifs_count": "{{count}} näkemätön ilmoitus",
"subscriptions_unseen_notifs_count_plural": "{{count}} näkemätöntä ilmoitusta",
"crash_page_switch_instance": "yrittänyt <a href=\"`x`\">käyttää toista instassia</a>",
"videoinfo_invidious_embed_link": "Upotuslinkki",
"videoinfo_invidious_embed_link": "Upotettava linkki",
"user_saved_playlists": "`x` tallennetua soittolistaa",
"crash_page_report_issue": "Jos mikään näistä ei auttanut, <a href=\"`x`\">avaathan uuden issuen GitHubissa</a> (mieluiten englanniksi) ja sisällytät seuraavan tekstin viestissäsi (ÄLÄ käännä tätä tekstiä):",
"preferences_quality_option_hd720": "HD720",
@@ -410,7 +410,7 @@
"preferences_quality_dash_option_auto": "Auto",
"preferences_quality_dash_option_best": "Paras",
"preferences_quality_option_dash": "DASH (mukautuva laatu)",
"preferences_quality_dash_label": "Haluttava DASH-videolaatu: ",
"preferences_quality_dash_label": "Ensisijainen DASH-videolaatu: ",
"generic_count_years": "{{count}} vuosi",
"generic_count_years_plural": "{{count}} vuotta",
"search_filters_features_option_purchased": "Ostettu",
@@ -421,48 +421,81 @@
"preferences_save_player_pos_label": "Tallenna toistokohta: ",
"footer_donate_page": "Lahjoita",
"footer_source_code": "Lähdekoodi",
"adminprefs_modified_source_code_url_label": "URL muokattuun lähdekoodirepositoryyn",
"Released under the AGPLv3 on Github.": "Julkaistu AGPLv3-lisenssin alla GitHubissa.",
"adminprefs_modified_source_code_url_label": "URL muokatun lähdekoodin repositorioon",
"Released under the AGPLv3 on Github.": "Julkaistu AGPLv3-lisenssillä GitHubissa.",
"search_filters_duration_option_short": "Lyhyt (< 4 minuuttia)",
"search_filters_duration_option_long": "Pitkä (> 20 minuuttia)",
"footer_documentation": "Dokumentaatio",
"footer_original_source_code": "Alkuperäinen lähdekoodi",
"footer_modfied_source_code": "Muokattu lähdekoodi",
"Japanese (auto-generated)": "Japani (automaattisesti luotu)",
"German (auto-generated)": "Saksa (automaattisesti luotu)",
"Japanese (auto-generated)": "japani (automaattisesti luotu)",
"German (auto-generated)": "saksa (automaattisesti luotu)",
"Portuguese (auto-generated)": "portugali (automaattisesti luotu)",
"Russian (auto-generated)": "Venäjä (automaattisesti luotu)",
"preferences_watch_history_label": "Ota katseluhistoria käyttöön: ",
"English (United Kingdom)": "Englanti (Iso-Britannia)",
"English (United States)": "Englanti (Yhdysvallat)",
"Cantonese (Hong Kong)": "Kantoninkiina (Hong Kong)",
"Chinese": "Kiina",
"Chinese (China)": "Kiina (Kiina)",
"Chinese (Hong Kong)": "Kiina (Hong Kong)",
"Chinese (Taiwan)": "Kiina (Taiwan)",
"Dutch (auto-generated)": "Hollanti (automaattisesti luotu)",
"French (auto-generated)": "Ranska (automaattisesti luotu)",
"Indonesian (auto-generated)": "Indonesia (automaattisesti luotu)",
"Interlingue": "Interlingue",
"English (United Kingdom)": "englanti (Iso-Britannia)",
"English (United States)": "englanti (Yhdysvallat)",
"Cantonese (Hong Kong)": "kantoninkiina (Hongkong)",
"Chinese": "kiina",
"Chinese (China)": "kiina (Kiina)",
"Chinese (Hong Kong)": "kiina (Hongkong)",
"Chinese (Taiwan)": "kiina (Taiwan)",
"Dutch (auto-generated)": "hollanti (automaattisesti luotu)",
"French (auto-generated)": "ranska (automaattisesti luotu)",
"Indonesian (auto-generated)": "indonesia (automaattisesti luotu)",
"Interlingue": "interlingue",
"Italian (auto-generated)": "Italia (automaattisesti luotu)",
"Korean (auto-generated)": "Korea (automaattisesti luotu)",
"Korean (auto-generated)": "korea (automaattisesti luotu)",
"Portuguese (Brazil)": "portugali (Brasilia)",
"Spanish (auto-generated)": "Espanja (automaattisesti luotu)",
"Spanish (Mexico)": "Espanja (Meksiko)",
"Spanish (Spain)": "Espanja (Espanja)",
"Turkish (auto-generated)": "Turkki (automaattisesti luotu)",
"Vietnamese (auto-generated)": "Vietnam (automaattisesti luotu)",
"search_filters_title": "Suodatin",
"search_message_no_results": "Ei tuloksia löydetty.",
"Spanish (auto-generated)": "espanja (automaattisesti luotu)",
"Spanish (Mexico)": "espanja (Meksiko)",
"Spanish (Spain)": "espanja (Espanja)",
"Turkish (auto-generated)": "turkki (automaattisesti luotu)",
"Vietnamese (auto-generated)": "vietnam (automaattisesti luotu)",
"search_filters_title": "Suodattimet",
"search_message_no_results": "Tuloksia ei löytynyt.",
"search_message_change_filters_or_query": "Yritä hakukyselysi laajentamista ja/tai suodattimien muuttamista.",
"search_filters_duration_option_none": "Mikä tahansa kesto",
"search_filters_features_option_vr180": "VR180",
"search_filters_apply_button": "Ota valitut suodattimet käyttöön",
"search_filters_date_label": "Latausaika",
"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_type_option_all": "Mikä tahansa tyyppi",
"Popular enabled: ": "Suosittu käytössä: ",
"error_video_not_in_playlist": "Pyydettyä videota ei löydy tästä soittolistasta. <a href=\"`x`\">Klikkaa tähän päästäksesi soittolistan etusivulle.</a>"
"error_video_not_in_playlist": "Pyydettyä videota ei ole tässä soittolistassa. <a href=\"`x`\">Klikkaa tästä päästäksesi soittolistan kotisivulle.</a>",
"Import YouTube playlist (.csv)": "Tuo YouTube-soittolista (.csv)",
"Music in this video": "Musiikki tässä videossa",
"Add to playlist": "Lisää soittolistaan",
"Add to playlist: ": "Lisää soittolistaan: ",
"Search for videos": "Etsi videoita",
"generic_button_rss": "RSS",
"Answer": "Vastaus",
"Standard YouTube license": "Vakio YouTube-lisenssi",
"Song: ": "Kappale: ",
"Album: ": "Albumi: ",
"Download is disabled": "Lataus on poistettu käytöstä",
"Channel Sponsor": "Kanavan sponsori",
"channel_tab_podcasts_label": "Podcastit",
"channel_tab_releases_label": "Julkaisut",
"channel_tab_shorts_label": "Shorts-videot",
"carousel_slide": "Dia {{current}}/{{total}}",
"carousel_skip": "Ohita karuselli",
"carousel_go_to": "Siirry diaan `x`",
"channel_tab_playlists_label": "Soittolistat",
"channel_tab_channels_label": "Kanavat",
"generic_button_delete": "Poista",
"generic_button_edit": "Muokkaa",
"generic_button_save": "Tallenna",
"generic_button_cancel": "Peru",
"playlist_button_add_items": "Lisää videoita",
"Artist: ": "Esittäjä: ",
"channel_tab_streams_label": "Suoratoistot",
"generic_channels_count": "{{count}} kanava",
"generic_channels_count_plural": "{{count}} kanavaa",
"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)",
"toggle_theme": "Vaihda teemaa",
"preferences_preload_label": "Esilataa video data. "
}
+19 -4
View File
@@ -18,7 +18,7 @@
"generic_subscriptions_count_1": "{{count}} d'abonnements",
"generic_subscriptions_count_2": "{{count}} abonnements",
"generic_button_delete": "Supprimer",
"generic_button_edit": "Editer",
"generic_button_edit": "Modifier",
"generic_button_save": "Enregistrer",
"generic_button_cancel": "Annuler",
"generic_button_rss": "RSS",
@@ -44,7 +44,7 @@
"Import and Export Data": "Importer et exporter des données",
"Import": "Importer",
"Import Invidious data": "Importer des données Invidious au format JSON",
"Import YouTube subscriptions": "Importer des abonnements YouTube/OPML",
"Import YouTube subscriptions": "Importer des abonnements YouTube aux formats OPML/CSV",
"Import FreeTube subscriptions (.db)": "Importer des abonnements FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importer des abonnements NewPipe (.json)",
"Import NewPipe data (.zip)": "Importer des données NewPipe (.zip)",
@@ -484,7 +484,7 @@
"search_filters_duration_option_medium": "Moyenne (de 4 à 20 minutes)",
"search_filters_apply_button": "Appliquer les filtres",
"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_date_label": "Date d'ajout",
"search_filters_features_option_vr180": "VR180",
@@ -503,5 +503,20 @@
"Download is disabled": "Le téléchargement est désactivé",
"Import YouTube playlist (.csv)": "Importer des listes de lecture de Youtube (.csv)",
"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)",
"Add to playlist: ": "Ajouter à la playlist : ",
"Add to playlist": "Ajouter à la playlist",
"Answer": "Répondre",
"Search for videos": "Rechercher des vidéos",
"The Popular feed has been disabled by the administrator.": "Le flux populaire a été désactivé par l'administrateur.",
"carousel_skip": "Passez le carrousel",
"carousel_slide": "Diapositive {{current}} sur {{total}}",
"carousel_go_to": "Aller à la diapositive `x`",
"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"
}
+15 -3
View File
@@ -62,7 +62,7 @@
"Import and Export Data": "डेटा को आयात और निर्यात करें",
"Import": "आयात करें",
"Import Invidious data": "Invidious JSON डेटा आयात करें",
"Import YouTube subscriptions": "YouTube/OPML सदस्यताएँ आयात करें",
"Import YouTube subscriptions": "YouTube CSV या OPML सदस्यताएँ आयात करें",
"Import FreeTube subscriptions (.db)": "FreeTube सदस्यताएँ आयात करें (.db)",
"Import NewPipe subscriptions (.json)": "NewPipe सदस्यताएँ आयात करें (.json)",
"Import NewPipe data (.zip)": "NewPipe डेटा आयात करें (.zip)",
@@ -476,7 +476,7 @@
"generic_button_cancel": "रद्द करें",
"generic_button_rss": "आरएसएस",
"generic_button_edit": "संपादित करें",
"generic_button_delete": "मिटाएं",
"generic_button_delete": "टाएं",
"playlist_button_add_items": "वीडियो जोड़ें",
"Song: ": "गाना: ",
"channel_tab_podcasts_label": "पाॅडकास्ट",
@@ -484,5 +484,17 @@
"Import YouTube playlist (.csv)": "YouTube प्लेलिस्ट (.csv) आयात करें",
"Standard YouTube license": "मानक यूट्यूब लाइसेंस",
"Channel Sponsor": "चैनल प्रायोजक",
"Download is disabled": "डाउनलोड करना अक्षम है"
"Download is disabled": "डाउनलोड करना अक्षम है",
"generic_channels_count": "{{count}} चैनल",
"generic_channels_count_plural": "{{count}} चैनल",
"Import YouTube watch history (.json)": "YouTube पर देखने का इतिहास आयात करें (.json)",
"Add to playlist": "प्लेलिस्ट में जोड़ें",
"Answer": "जवाब",
"The Popular feed has been disabled by the administrator.": "लोकप्रिय फ़ीड व्यवस्थापक द्वारा अक्षम कर दिया गया है।",
"toggle_theme": "थीम टॉगल करें",
"carousel_slide": "{{total}} में से स्लाइड {{current}}",
"carousel_skip": "कैरोसेल छोड़ें",
"Add to playlist: ": "प्लेलिस्ट में जोड़ें: ",
"Search for videos": "वीडियो खोजें",
"carousel_go_to": "स्लाइड `x` पर जाएँ"
}
+27 -15
View File
@@ -21,7 +21,7 @@
"Import and Export Data": "Uvezi i izvezi podatke",
"Import": "Uvezi",
"Import Invidious data": "Uvezi Invidious JSON podatke",
"Import YouTube subscriptions": "Uvezi YouTube/OPML pretplate",
"Import YouTube subscriptions": "Uvezi YouTube CSV ili OPML pretplate",
"Import FreeTube subscriptions (.db)": "Uvezi FreeTube pretplate (.db)",
"Import NewPipe subscriptions (.json)": "Uvezi NewPipe pretplate (.json)",
"Import NewPipe data (.zip)": "Uvezi NewPipe podatke (.zip)",
@@ -449,30 +449,30 @@
"Cantonese (Hong Kong)": "Kantonski (Hong Kong)",
"Chinese": "Kineski",
"Chinese (Taiwan)": "Kineski (Tajvan)",
"Dutch (auto-generated)": "Nizozemski (automatski generiran)",
"French (auto-generated)": "Francuski (automatski generiran)",
"Indonesian (auto-generated)": "Indonezijski (automatski generiran)",
"Dutch (auto-generated)": "Nizozemski (automatski generirano)",
"French (auto-generated)": "Francuski (automatski generirano)",
"Indonesian (auto-generated)": "Indonezijski (automatski generirano)",
"Interlingue": "Interlingua",
"Japanese (auto-generated)": "Japanski (automatski generiran)",
"Russian (auto-generated)": "Ruski (automatski generiran)",
"Turkish (auto-generated)": "Turski (automatski generiran)",
"Vietnamese (auto-generated)": "Vijetnamski (automatski generiran)",
"Japanese (auto-generated)": "Japanski (automatski generirano)",
"Russian (auto-generated)": "Ruski (automatski generirano)",
"Turkish (auto-generated)": "Turski (automatski generirano)",
"Vietnamese (auto-generated)": "Vijetnamski (automatski generirano)",
"Spanish (Spain)": "Španjolski (Španjolska)",
"Italian (auto-generated)": "Talijanski (automatski generiran)",
"Italian (auto-generated)": "Talijanski (automatski generirano)",
"Portuguese (Brazil)": "Portugalski (Brazil)",
"Spanish (Mexico)": "Španjolski (Meksiko)",
"German (auto-generated)": "Njemački (automatski generiran)",
"German (auto-generated)": "Njemački (automatski generirano)",
"Chinese (China)": "Kineski (Kina)",
"Chinese (Hong Kong)": "Kineski (Hong Kong)",
"Korean (auto-generated)": "Korejski (automatski generiran)",
"Portuguese (auto-generated)": "Portugalski (automatski generiran)",
"Spanish (auto-generated)": "Španjolski (automatski generiran)",
"Korean (auto-generated)": "Korejski (automatski generirano)",
"Portuguese (auto-generated)": "Portugalski (automatski generirano)",
"Spanish (auto-generated)": "Španjolski (automatski generirano)",
"preferences_watch_history_label": "Aktiviraj povijest gledanja: ",
"search_filters_title": "Filtri",
"search_filters_date_option_none": "Bilo koji datum",
"search_filters_date_label": "Datum prijenosa",
"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_filters_features_option_vr180": "VR180",
"search_filters_duration_option_none": "Bilo koje duljine",
@@ -503,5 +503,17 @@
"channel_tab_releases_label": "Izdanja",
"generic_channels_count_0": "{{count}} kanal",
"generic_channels_count_1": "{{count}} kanala",
"generic_channels_count_2": "{{count}} kanala"
"generic_channels_count_2": "{{count}} kanala",
"Import YouTube watch history (.json)": "Uvezi YouTube povijest gledanja (.json)",
"Add to playlist": "Dodaj u zbirku",
"Add to playlist: ": "Dodaj u zbirku: ",
"Answer": "Odgovor",
"Search for videos": "Traži videa",
"The Popular feed has been disabled by the administrator.": "Popularni feed je administrator deaktivirao.",
"toggle_theme": "Uklj./Isklj. temu",
"carousel_slide": "Kadar {{current}} od {{total}}",
"carousel_go_to": "Idi na kadar `x`",
"carousel_skip": "Preskoči vrtuljak",
"Filipino (auto-generated)": "Filipinski (automatski generirano)",
"preferences_preload_label": "Unaprijed učitaj podatke videa: "
}
+19 -1
View File
@@ -464,5 +464,23 @@
"search_filters_features_option_vr180": "180°-os virtuális valóság",
"search_filters_apply_button": "Keresés a megadott szűrőkkel",
"Popular enabled: ": "Népszerű engedélyezve ",
"error_video_not_in_playlist": "A lejátszási listában keresett videó nem létezik. <a href=\"`x`\">Kattintson ide a lejátszási listához jutáshoz.</a>"
"error_video_not_in_playlist": "A lejátszási listában keresett videó nem létezik. <a href=\"`x`\">Kattintson ide a lejátszási listához jutáshoz.</a>",
"generic_button_delete": "Törlés",
"generic_button_rss": "RSS",
"Import YouTube playlist (.csv)": "Youtube lejátszási lista (.csv) importálása",
"Standard YouTube license": "Alap YouTube-licensz",
"Add to playlist": "Hozzáadás lejátszási listához",
"Add to playlist: ": "Hozzáadás a lejátszási listához: ",
"Answer": "Válasz",
"Search for videos": "Keresés videókhoz",
"generic_channels_count": "{{count}} csatorna",
"generic_channels_count_plural": "{{count}} csatornák",
"generic_button_edit": "Szerkesztés",
"generic_button_save": "Mentés",
"generic_button_cancel": "Mégsem",
"playlist_button_add_items": "Videók hozzáadása",
"Music in this video": "Zene ezen videóban",
"Song: ": "Dal: ",
"Album: ": "Album: ",
"Import YouTube watch history (.json)": "Youtube megtekintési előzmények (.json) importálása"
}
+45
View File
@@ -0,0 +1,45 @@
{
"New password": "Nove contrasigno",
"preferences_player_style_label": "Stylo de reproductor: ",
"preferences_region_label": "Pais de contento: ",
"oldest": "plus ancian",
"published": "data de publication",
"invidious": "Invidious",
"Image CAPTCHA": "Imagine CAPTCHA",
"newest": "plus nove",
"generic_button_save": "Salveguardar",
"Dark mode: ": "Modo obscur: ",
"preferences_dark_mode_label": "Thema: ",
"preferences_category_subscription": "Preferentias de subscription",
"last": "ultime",
"generic_button_cancel": "Cancellar",
"popular": "popular",
"Time (h:mm:ss):": "Tempore (h:mm:ss):",
"preferences_autoplay_label": "Reproduction automatic: ",
"Sign In": "Aperir le session",
"Log in": "Initiar le session",
"preferences_speed_label": "Velocitate per predefinition: ",
"preferences_comments_label": "Commentos predefinite: ",
"light": "clar",
"No": "Non",
"youtube": "YouTube",
"LIVE": "IN DIRECTO",
"reddit": "Reddit",
"preferences_category_player": "Preferentias de reproductor",
"Preferences": "Preferentias",
"preferences_quality_dash_option_auto": "Automatic",
"dark": "obscur",
"generic_button_rss": "RSS",
"Export": "Exportar",
"History": "Chronologia",
"Password": "Contrasigno",
"User ID": "ID de usator",
"E-mail": "E-mail",
"Delete account?": "Deler conto?",
"preferences_volume_label": "Volumine del reproductor: ",
"preferences_sort_label": "Ordinar le videos per: ",
"Next page": "Pagina sequente",
"Previous page": "Pagina previe",
"Yes": "Si",
"Import": "Importar"
}
+2 -1
View File
@@ -469,5 +469,6 @@
"error_video_not_in_playlist": "Video yang diminta tidak ada dalam daftar putar ini. <a href=\"`x`\">Klik di sini untuk halaman beranda daftar putar.</a>",
"generic_button_delete": "Hapus",
"Import YouTube playlist (.csv)": "Impor daftar putar YouTube (.csv)",
"Standard YouTube license": "Lisensi YouTube standar"
"Standard YouTube license": "Lisensi YouTube standar",
"Import YouTube watch history (.json)": "Impor riwayat tontonan YouTube (.json)"
}
+257 -67
View File
@@ -1,79 +1,79 @@
{
"LIVE": "BEINT",
"Shared `x` ago": "Deilt `x` síðan",
"Shared `x` ago": "Deilt fyrir `x` síðan",
"Unsubscribe": "Afskrá",
"Subscribe": "Áskrifa",
"Subscribe": "Setja í áskrift",
"View channel on YouTube": "Skoða rás á YouTube",
"View playlist on YouTube": "Skoða spilunarlisti á YouTube",
"View playlist on YouTube": "Skoða spilunarlista á YouTube",
"newest": "nýjasta",
"oldest": "elsta",
"popular": "vinsælt",
"last": "síðast",
"Next page": "Næsta síða",
"Previous page": "Fyrri síða",
"Clear watch history?": "Hreinsa áhorfssögu?",
"Clear watch history?": "Hreinsa áhorfsferil?",
"New password": "Nýtt lykilorð",
"New passwords must match": "Nýtt lykilorð verður að passa",
"Authorize token?": "Leyfa tákn?",
"Authorize token for `x`?": "Leyfa tákn fyrir `x`?",
"Authorize token?": "Auðkenna teikn?",
"Authorize token for `x`?": "Auðkenna teikn fyrir `x`?",
"Yes": "Já",
"No": "Nei",
"Import and Export Data": "Innflutningur og Útflutningur Gagna",
"Import and Export Data": "Inn- og útflutningur gagna",
"Import": "Flytja inn",
"Import Invidious data": "Flytja inn Invidious gögn",
"Import YouTube subscriptions": "Flytja inn YouTube áskriftir",
"Import Invidious data": "Flytja inn Invidious JSON-gögn",
"Import YouTube subscriptions": "Flytja inn YouTube CSV eða OPML-áskriftir",
"Import FreeTube subscriptions (.db)": "Flytja inn FreeTube áskriftir (.db)",
"Import NewPipe subscriptions (.json)": "Flytja inn NewPipe áskriftir (.json)",
"Import NewPipe data (.zip)": "Flytja inn NewPipe gögn (.zip)",
"Export": "Flytja út",
"Export subscriptions as OPML": "Flytja út áskriftir sem OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Flytja út áskriftir sem OPML (fyrir NewPipe & FreeTube)",
"Export data as JSON": "Flytja út gögn sem JSON",
"Export data as JSON": "Flytja út Invidious-gögn sem JSON",
"Delete account?": "Eyða reikningi?",
"History": "Saga",
"An alternative front-end to YouTube": "Önnur framhlið fyrir YouTube",
"JavaScript license information": "JavaScript leyfi upplýsingar",
"source": "uppspretta",
"History": "Ferill",
"An alternative front-end to YouTube": "Annað viðmót fyrir YouTube",
"JavaScript license information": "Upplýsingar um notkunarleyfi JavaScript",
"source": "uppruni",
"Log in": "Skrá inn",
"Log in/register": "Innskráning/nýskráning",
"User ID": "Notandakenni",
"User ID": "Auðkenni notanda",
"Password": "Lykilorð",
"Time (h:mm:ss):": "Tími (h:mm: ss):",
"Text CAPTCHA": "Texta CAPTCHA",
"Image CAPTCHA": "Mynd CAPTCHA",
"Text CAPTCHA": "CAPTCHA-texti",
"Image CAPTCHA": "CAPTCHA-mynd",
"Sign In": "Skrá inn",
"Register": "Nýskrá",
"E-mail": "Tölvupóstur",
"Preferences": "Kjörstillingar",
"preferences_category_player": "Kjörstillingar spilara",
"preferences_video_loop_label": "Alltaf lykkja: ",
"preferences_autoplay_label": "Spila sjálfkrafa: ",
"preferences_video_loop_label": "Alltaf endurtaka: ",
"preferences_autoplay_label": "Sjálfvirk spilun: ",
"preferences_continue_label": "Spila næst sjálfgefið: ",
"preferences_continue_autoplay_label": "Spila næst sjálfkrafa: ",
"preferences_continue_autoplay_label": "Spila næsta myndskeið sjálfkrafa: ",
"preferences_listen_label": "Hlusta sjálfgefið: ",
"preferences_local_label": "Proxy myndbönd? ",
"preferences_local_label": "Milliþjónn fyrir myndskeið: ",
"preferences_speed_label": "Sjálfgefinn hraði: ",
"preferences_quality_label": "Æskilegt myndbands gæði: ",
"preferences_quality_label": "Æskileg gæði myndmerkis: ",
"preferences_volume_label": "Spilara hljóðstyrkur: ",
"preferences_comments_label": "Sjálfgefin ummæli: ",
"youtube": "YouTube",
"reddit": "reddit",
"reddit": "Reddit",
"preferences_captions_label": "Sjálfgefin texti: ",
"Fallback captions: ": "Varatextar: ",
"preferences_related_videos_label": "Sýna tengd myndbönd? ",
"preferences_related_videos_label": "Sýna tengd myndskeið? ",
"preferences_annotations_label": "Á að sýna glósur sjálfgefið? ",
"preferences_category_visual": "Sjónrænar stillingar",
"preferences_player_style_label": "Spilara stíl: ",
"Dark mode: ": "Myrkur ham: ",
"preferences_player_style_label": "Stíll spilara: ",
"Dark mode: ": "Dökkur hamur: ",
"preferences_dark_mode_label": "Þema: ",
"dark": "dimmt",
"dark": "dökkt",
"light": "ljóst",
"preferences_thin_mode_label": "Þunnt ham: ",
"preferences_thin_mode_label": "Grannur hamur: ",
"preferences_category_subscription": "Áskriftarstillingar",
"preferences_annotations_subscribed_label": "Á að sýna glósur sjálfgefið fyrir áskriftarrásir? ",
"Redirect homepage to feed: ": "Endurbeina heimasíðu að straumi: ",
"preferences_max_results_label": "Fjöldi myndbanda sem sýndir eru í straumi: ",
"preferences_sort_label": "Raða myndbönd eftir: ",
"Redirect homepage to feed: ": "Endurbeina heimasíðu að streymi: ",
"preferences_max_results_label": "Fjöldi myndskeiða sem sýnd eru í streymi: ",
"preferences_sort_label": "Raða myndskeiðum eftir: ",
"published": "birt",
"published - reverse": "birt - afturábak",
"alphabetically": "í stafrófsröð",
@@ -85,34 +85,34 @@
"preferences_unseen_only_label": "Sýna aðeins óséð: ",
"preferences_notifications_only_label": "Sýna aðeins tilkynningar (ef einhverjar eru): ",
"Enable web notifications": "Virkja veftilkynningar",
"`x` uploaded a video": "`x` hlóð upp myndband",
"`x` uploaded a video": "`x` sendi inn myndskeið",
"`x` is live": "`x` er í beinni",
"preferences_category_data": "Gagnastillingar",
"Clear watch history": "Hreinsa áhorfssögu",
"Clear watch history": "Hreinsa áhorfsferil",
"Import/export data": "Flytja inn/út gögn",
"Change password": "Breyta lykilorði",
"Manage subscriptions": "Stjórna áskriftum",
"Manage tokens": "Stjórna tákn",
"Watch history": "Áhorfssögu",
"Manage subscriptions": "Sýsla með áskriftir",
"Manage tokens": "Sýsla með teikn",
"Watch history": "Áhorfsferill",
"Delete account": "Eyða reikningi",
"preferences_category_admin": "Kjörstillingar stjórnanda",
"preferences_default_home_label": "Sjálfgefin heimasíða: ",
"preferences_feed_menu_label": "Straum valmynd: ",
"Top enabled: ": "Toppur virkur? ",
"preferences_feed_menu_label": "Streymisvalmynd: ",
"Top enabled: ": "Vinsælast virkt? ",
"CAPTCHA enabled: ": "CAPTCHA virk? ",
"Login enabled: ": "Innskráning virk? ",
"Registration enabled: ": "Nýskráning virkjuð? ",
"Report statistics: ": "Skrá talnagögn? ",
"Report statistics: ": "Skrá tölfræði? ",
"Save preferences": "Vista stillingar",
"Subscription manager": "Áskriftarstjóri",
"Token manager": "Táknstjóri",
"Token": "Tákn",
"Subscription manager": "Áskriftastýring",
"Token manager": "Teiknastýring",
"Token": "Teikn",
"Import/export": "Flytja inn/út",
"unsubscribe": "afskrá",
"revoke": "afturkalla",
"Subscriptions": "Áskriftir",
"search": "leita",
"Log out": "Útskrá",
"Log out": "Skrá út",
"Source available here.": "Frumkóði aðgengilegur hér.",
"View JavaScript license information.": "Skoða JavaScript leyfisupplýsingar.",
"View privacy policy.": "Skoða meðferð persónuupplýsinga.",
@@ -122,13 +122,13 @@
"Private": "Einka",
"View all playlists": "Skoða alla spilunarlista",
"Updated `x` ago": "Uppfært `x` síðann",
"Delete playlist `x`?": "Eiða spilunarlista `x`?",
"Delete playlist": "Eiða spilunarlista",
"Delete playlist `x`?": "Eyða spilunarlista `x`?",
"Delete playlist": "Eyða spilunarlista",
"Create playlist": "Búa til spilunarlista",
"Title": "Titill",
"Playlist privacy": "Spilunarlista opinberri",
"Editing playlist `x`": "Að breyta spilunarlista `x`",
"Watch on YouTube": "Horfa á YouTube",
"Playlist privacy": "Friðhelgi spilunarlista",
"Editing playlist `x`": "Breyti spilunarlista `x`",
"Watch on YouTube": "Skoða á YouTube",
"Hide annotations": "Fela glósur",
"Show annotations": "Sýna glósur",
"Genre: ": "Tegund: ",
@@ -160,26 +160,26 @@
"Wrong username or password": "Rangt notandanafn eða lykilorð",
"Password cannot be empty": "Lykilorð má ekki vera autt",
"Password cannot be longer than 55 characters": "Lykilorð má ekki vera lengra en 55 stafir",
"Please log in": "Vinsamlegast skráðu þig inn",
"Invidious Private Feed for `x`": "Invidious Persónulegur Straumur fyrir `x`",
"Please log in": "Skráðu þig inn",
"Invidious Private Feed for `x`": "Persónulegt Invidious-streymi fyrir `x`",
"channel:`x`": "rás:`x`",
"Deleted or invalid channel": "Eytt eða ógild rás",
"This channel does not exist.": "Þessi rás er ekki til.",
"Could not get channel info.": "Ekki tókst að fá rásarupplýsingar.",
"Could not get channel info.": "Ekki tókst að fá upplýsingar um rásina.",
"Could not fetch comments": "Ekki tókst að sækja ummæli",
"`x` ago": "`x` síðan",
"Load more": "Hlaða meira",
"Could not create mix.": "Ekki tókst að búa til blöndu.",
"Empty playlist": "Tómur spilunarlisti",
"Not a playlist.": "Ekki spilunarlisti.",
"Not a playlist.": "Er ekki spilunarlisti.",
"Playlist does not exist.": "Spilunarlisti er ekki til.",
"Could not pull trending pages.": "Ekki tókst að draga vinsælar síður.",
"Hidden field \"challenge\" is a required field": "Falinn reitur \"áskorun\" er nauðsynlegur reitur",
"Hidden field \"token\" is a required field": "Falinn reitur \"tákn\" er nauðsynlegur reitur",
"Hidden field \"token\" is a required field": "Falinn reitur \"teikn\" er nauðsynlegur reitur",
"Erroneous challenge": "Röng áskorun",
"Erroneous token": "Rangt tákn",
"Erroneous token": "Rangt teikn",
"No such user": "Enginn slíkur notandi",
"Token is expired, please try again": "Tákn er útrunnið, vinsamlegast reyndu aftur",
"Token is expired, please try again": "Teiknið er útrunnið, reyndu aftur",
"English": "Enska",
"English (auto-generated)": "Enska (sjálfkrafa)",
"Afrikaans": "Afríkanska",
@@ -233,7 +233,7 @@
"Korean": "Kóreska",
"Kurdish": "Kúrdíska",
"Kyrgyz": "Kirgisíska",
"Lao": "Laó",
"Lao": "Laóska",
"Latin": "Latína",
"Latvian": "Lettneska",
"Lithuanian": "Litháíska",
@@ -267,14 +267,14 @@
"Somali": "Sómalska",
"Southern Sotho": "Suður Sótó",
"Spanish": "Spænska",
"Spanish (Latin America)": "Spænska (Rómönsku Ameríka)",
"Spanish (Latin America)": "Spænska (Rómanska Ameríka)",
"Sundanese": "Sundaneska",
"Swahili": "Svahílí",
"Swedish": "Sænska",
"Tajik": "Tadsikíska",
"Tamil": "Tamílska",
"Telugu": "Telúgú",
"Thai": "Tlenska",
"Thai": "Tælenska",
"Turkish": "Tyrkneska",
"Ukrainian": "Úkraníska",
"Urdu": "Úrdú",
@@ -286,30 +286,220 @@
"Yiddish": "Jiddíska",
"Yoruba": "Jórúba",
"Zulu": "Zúlú",
"Fallback comments: ": "Vara ummæli: ",
"Fallback comments: ": "Ummæli til vara: ",
"Popular": "Vinsælt",
"Top": "Topp",
"Top": "Vinsælast",
"About": "Um",
"Rating: ": "Einkunn: ",
"preferences_locale_label": "Tungumál: ",
"View as playlist": "Skoða sem spilunarlista",
"Default": "Sjálfgefið",
"Music": "Tónlist",
"Gaming": "Tólvuleikja",
"Gaming": "Spilun leikja",
"News": "Fréttir",
"Movies": "Kvikmyndir",
"Download": "Niðurhal",
"Download as: ": "Niðurhala sem: ",
"Download as: ": "Sækja sem: ",
"%A %B %-d, %Y": "%A %B %-d, %Y",
"(edited)": "(breytt)",
"YouTube comment permalink": "YouTube ummæli varanlegur tengill",
"YouTube comment permalink": "Varanlegur tengill á YouTube-ummæli",
"permalink": "Varanlegur tengill",
"`x` marked it with a ❤": "`x` merkti það með ❤",
"Audio mode": "Hljóð ham",
"Video mode": "Myndband ham",
"channel_tab_videos_label": "Myndbönd",
"Audio mode": "Hljóðhamur",
"Video mode": "Myndhamur",
"channel_tab_videos_label": "Myndskeið",
"Playlists": "Spilunarlistar",
"channel_tab_community_label": "Samfélag",
"Current version: ": "Núverandi útgáfa: ",
"preferences_watch_history_label": "Virkja áhorfssögu: "
"preferences_watch_history_label": "Virkja áhorfsferil: ",
"Chinese (China)": "Kínverska (Kína)",
"Turkish (auto-generated)": "Tyrkneska (sjálfvirkt útbúið)",
"Search": "Leita",
"preferences_save_player_pos_label": "Vista staðsetningu í afspilun: ",
"Popular enabled: ": "Vinsælt virkjað: ",
"search_filters_features_option_purchased": "Keypt",
"Standard YouTube license": "Staðlað YouTube-notkunarleyfi",
"French (auto-generated)": "Franska (sjálfvirkt útbúið)",
"Spanish (Spain)": "Spænska (Spánn)",
"search_filters_title": "Síur",
"search_filters_date_label": "Dags. innsendingar",
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_hd": "HD",
"crash_page_read_the_faq": "lesið <a href=\"`x`\">Algengar spurningar (FAQ)</a>",
"Add to playlist": "Bæta á spilunarlista",
"Add to playlist: ": "Bæta á spilunarlista: ",
"Answer": "Svar",
"Search for videos": "Leita að myndskeiðum",
"generic_channels_count": "{{count}} rás",
"generic_channels_count_plural": "{{count}} rásir",
"generic_videos_count": "{{count}} myndskeið",
"generic_videos_count_plural": "{{count}} myndskeið",
"The Popular feed has been disabled by the administrator.": "Kerfisstjórinn hefur gert Vinsælt-streymið óvirkt.",
"generic_playlists_count": "{{count}} spilunarlisti",
"generic_playlists_count_plural": "{{count}} spilunarlistar",
"generic_subscribers_count": "{{count}} áskrifandi",
"generic_subscribers_count_plural": "{{count}} áskrifendur",
"generic_subscriptions_count": "{{count}} áskrift",
"generic_subscriptions_count_plural": "{{count}} áskriftir",
"generic_button_delete": "Eyða",
"Import YouTube watch history (.json)": "Flytja inn YouTube áhorfsferil (.json)",
"preferences_vr_mode_label": "Gagnvirk 360 gráðu myndskeið (krefst WebGL): ",
"preferences_quality_dash_option_auto": "Sjálfvirkt",
"preferences_quality_dash_option_best": "Best",
"preferences_quality_dash_option_worst": "Verst",
"preferences_quality_dash_label": "Æskileg DASH-gæði myndmerkis: ",
"preferences_extend_desc_label": "Sjálfvirkt útvíkka lýsingu á myndskeiði: ",
"preferences_region_label": "Land efnis: ",
"preferences_show_nick_label": "Birta gælunafn efst: ",
"tokens_count": "{{count}} teikn",
"tokens_count_plural": "{{count}} teikn",
"subscriptions_unseen_notifs_count": "{{count}} óskoðuð tilkynning",
"subscriptions_unseen_notifs_count_plural": "{{count}} óskoðaðar tilkynningar",
"Released under the AGPLv3 on Github.": "Gefið út með AGPLv3-notkunarleyfi á GitHub.",
"Music in this video": "Tónlist í þessu myndskeiði",
"Artist: ": "Flytjandi: ",
"Album: ": "Hljómplata: ",
"comments_view_x_replies": "Skoða {{count}} svar",
"comments_view_x_replies_plural": "Skoða {{count}} svör",
"comments_points_count": "{{count}} punktur",
"comments_points_count_plural": "{{count}} punktar",
"Cantonese (Hong Kong)": "Kantónska (Hong Kong)",
"Chinese": "Kínverska",
"Chinese (Hong Kong)": "Kínverska (Hong Kong)",
"Chinese (Taiwan)": "Kínverska (Taívan)",
"Japanese (auto-generated)": "Japanska (sjálfvirkt útbúið)",
"generic_count_minutes": "{{count}} mínúta",
"generic_count_minutes_plural": "{{count}} mínútur",
"generic_count_seconds": "{{count}} sekúnda",
"generic_count_seconds_plural": "{{count}} sekúndur",
"search_filters_date_option_hour": "Síðustu klukkustund",
"search_filters_apply_button": "Virkja valdar síur",
"next_steps_error_message_go_to_youtube": "Fara á YouTube",
"footer_original_source_code": "Upprunalegur grunnkóði",
"videoinfo_started_streaming_x_ago": "Byrjaði streymi fyrir `x` síðan",
"next_steps_error_message": "Á eftir þessu ættirðu að prófa: ",
"videoinfo_invidious_embed_link": "Ívefja tengil",
"download_subtitles": "Skjátextar - `x` (.vtt)",
"user_created_playlists": "`x` útbjó spilunarlista",
"user_saved_playlists": "`x` vistaði spilunarlista",
"Video unavailable": "Myndskeið ekki tiltækt",
"videoinfo_watch_on_youTube": "Skoða á YouTube",
"crash_page_you_found_a_bug": "Það lítur út eins og þú hafir fundið galla í Invidious!",
"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_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",
"carousel_slide": "Skyggna {{current}} af {{total}}",
"carousel_go_to": "Fara á skyggnu `x`",
"channel_tab_streams_label": "Bein streymi",
"channel_tab_playlists_label": "Spilunarlistar",
"toggle_theme": "Víxla þema",
"carousel_skip": "Sleppa hringekjunni",
"preferences_quality_option_medium": "Miðlungs",
"search_message_use_another_instance": "Þú getur líka <a href=\"`x`\">leitað á öðrum netþjóni</a>.",
"footer_source_code": "Grunnkóði",
"English (United Kingdom)": "Enska (Bretland)",
"English (United States)": "Enska (Bandarísk)",
"Vietnamese (auto-generated)": "Víetnamska (sjálfvirkt útbúið)",
"generic_count_months": "{{count}} mánuði",
"generic_count_months_plural": "{{count}} mánuðum",
"search_filters_sort_option_rating": "Einkunn",
"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>",
"generic_views_count": "{{count}} áhorf",
"generic_views_count_plural": "{{count}} áhorf",
"playlist_button_add_items": "Bæta við myndskeiðum",
"Show more": "Sýna meira",
"Show less": "Sýna minna",
"Song: ": "Lag: ",
"channel_tab_podcasts_label": "Hlaðvörp (podcasts)",
"channel_tab_releases_label": "Útgáfur",
"Download is disabled": "Niðurhal er óvirkt",
"search_filters_features_option_location": "Staðsetning",
"preferences_quality_dash_option_720p": "720p",
"Switch Invidious Instance": "Skipta um Invidious-tilvik",
"search_message_no_results": "Engar niðurstöður fundust.",
"search_message_change_filters_or_query": "Reyndu að víkka leitarsviðið og/eða breyta síunum.",
"Dutch (auto-generated)": "Hollenska (sjálfvirkt útbúið)",
"German (auto-generated)": "Þýska (sjálfvirkt útbúið)",
"Indonesian (auto-generated)": "Indónesíska (sjálfvirkt útbúið)",
"Interlingue": "Interlingue",
"Italian (auto-generated)": "Ítalska (sjálfvirkt útbúið)",
"Russian (auto-generated)": "Rússneska (sjálfvirkt útbúið)",
"Spanish (auto-generated)": "Spænska (sjálfvirkt útbúið)",
"Spanish (Mexico)": "Spænska (Mexíkó)",
"generic_count_hours": "{{count}} klukkustund",
"generic_count_hours_plural": "{{count}} klukkustundum",
"generic_count_years": "{{count}} ári",
"generic_count_years_plural": "{{count}} árum",
"generic_count_weeks": "{{count}} viku",
"generic_count_weeks_plural": "{{count}} vikum",
"search_filters_date_option_none": "Hvaða dagsetning sem er",
"Channel Sponsor": "Styrktaraðili rásar",
"search_filters_date_option_week": "Í þessari viku",
"search_filters_date_option_month": "Í þessum mánuði",
"search_filters_date_option_year": "Á þessu ári",
"search_filters_type_option_playlist": "Spilunarlisti",
"search_filters_type_option_show": "Þáttur",
"search_filters_duration_label": "Tímalengd",
"search_filters_duration_option_long": "Langt (> 20 mínútur)",
"search_filters_features_option_live": "Beint",
"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_sort_label": "Raða eftir",
"search_filters_sort_option_relevance": "Samsvörun",
"footer_donate_page": "Styrkja",
"footer_modfied_source_code": "Breyttur grunnkóði",
"crash_page_refresh": "reynt að <a href=\"`x`\">endurlesa síðuna</a>",
"crash_page_search_issue": "leitað að <a href=\"`x`\">fyrirliggjandi villum á GitHub</a>",
"none": "ekkert",
"adminprefs_modified_source_code_url_label": "Slóð á gagnasafn með breyttum grunnkóða",
"preferences_quality_option_hd720": "HD720",
"preferences_quality_option_small": "Lítið",
"preferences_category_misc": "Ýmsar kjörstillingar",
"preferences_automatic_instance_redirect_label": "Sjálfvirk endurbeining tilvika (farið til vara á redirect.invidious.io): ",
"Portuguese (auto-generated)": "Portúgalska (sjálfvirkt útbúið)",
"Portuguese (Brazil)": "Portúgalska (Brasilía)",
"generic_button_edit": "Breyta",
"generic_button_save": "Vista",
"generic_button_cancel": "Hætta við",
"generic_button_rss": "RSS",
"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_480p": "480p",
"preferences_quality_dash_option_360p": "360p",
"preferences_quality_dash_option_240p": "240p",
"preferences_quality_dash_option_144p": "144p",
"invidious": "Invidious",
"Korean (auto-generated)": "Kóreska (sjálfvirkt útbúið)",
"generic_count_days": "{{count}} degi",
"generic_count_days_plural": "{{count}} dögum",
"search_filters_date_option_today": "Í dag",
"search_filters_type_label": "Tegund",
"search_filters_type_option_all": "Hvaða tegund sem er",
"search_filters_type_option_video": "Myndskeið",
"search_filters_type_option_channel": "Rás",
"search_filters_type_option_movie": "Kvikmynd",
"search_filters_duration_option_none": "Hvaða lengd sem er",
"search_filters_duration_option_short": "Stutt (< 4 mínútur)",
"search_filters_duration_option_medium": "Miðlungs (4 - 20 mínútur)",
"search_filters_features_label": "Eiginleikar",
"search_filters_features_option_subtitles": "Skjátextar/CC",
"search_filters_features_option_c_commons": "Creative Commons",
"search_filters_sort_option_date": "Dags. innsendingar",
"search_filters_sort_option_views": "Fjöldi áhorfa",
"next_steps_error_message_refresh": "Endurlesa",
"footer_documentation": "Leiðbeiningar",
"channel_tab_channels_label": "Rásir",
"Import YouTube playlist (.csv)": "Flytja inn YouTube spilunarlista (.csv)",
"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"
}
+20 -5
View File
@@ -30,7 +30,7 @@
"Import and Export Data": "Importazione ed esportazione dati",
"Import": "Importa",
"Import Invidious data": "Importa dati Invidious in formato JSON",
"Import YouTube subscriptions": "Importa le iscrizioni da YouTube/OPML",
"Import YouTube subscriptions": "Importa iscrizioni in CSV o OPML di YouTube",
"Import FreeTube subscriptions (.db)": "Importa le iscrizioni da FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importa le iscrizioni da NewPipe (.json)",
"Import NewPipe data (.zip)": "Importa i dati di NewPipe (.zip)",
@@ -449,7 +449,7 @@
"Portuguese (Brazil)": "Portoghese (Brasile)",
"preferences_watch_history_label": "Attiva cronologia di riproduzione: ",
"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_change_filters_or_query": "Prova ad ampliare la ricerca e/o modificare i filtri.",
"English (United States)": "Inglese (Stati Uniti)",
@@ -469,8 +469,8 @@
"Spanish (auto-generated)": "Spagnolo (generati automaticamente)",
"Spanish (Mexico)": "Spagnolo (Messico)",
"Spanish (Spain)": "Spagnolo (Spagna)",
"Turkish (auto-generated)": "Turco (auto-generato)",
"Vietnamese (auto-generated)": "Vietnamita (auto-generato)",
"Turkish (auto-generated)": "Turco (generati automaticamente)",
"Vietnamese (auto-generated)": "Vietnamita (generati automaticamente)",
"search_filters_date_label": "Data caricamento",
"search_filters_date_option_none": "Qualunque data",
"search_filters_type_option_all": "Qualunque tipo",
@@ -503,5 +503,20 @@
"channel_tab_podcasts_label": "Podcast",
"generic_channels_count_0": "{{count}} canale",
"generic_channels_count_1": "{{count}} canali",
"generic_channels_count_2": "{{count}} canali"
"generic_channels_count_2": "{{count}} canali",
"Import YouTube watch history (.json)": "Importa la cronologia delle visualizzazioni di YouTube (.json)",
"Answer": "Risposta",
"toggle_theme": "Cambia Tema",
"Add to playlist": "Aggiungi alla playlist",
"Add to playlist: ": "Aggiungi alla playlist ",
"Search for videos": "Cerca dei video",
"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_skip": "Salta la galleria",
"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"
}
+34 -19
View File
@@ -25,7 +25,7 @@
"No": "いいえ",
"Import and Export Data": "データのインポートとエクスポート",
"Import": "インポート",
"Import Invidious data": "Invidious JSONデータをインポート",
"Import Invidious data": "Invidious JSON データをインポート",
"Import YouTube subscriptions": "YouTube/OPML 登録チャンネルをインポート",
"Import FreeTube subscriptions (.db)": "FreeTube 登録チャンネルをインポート (.db)",
"Import NewPipe subscriptions (.json)": "NewPipe 登録チャンネルをインポート (.json)",
@@ -53,7 +53,7 @@
"preferences_category_player": "プレイヤーの設定",
"preferences_video_loop_label": "常にループ: ",
"preferences_autoplay_label": "自動再生: ",
"preferences_continue_label": "次の動画を自動再生: ",
"preferences_continue_label": "次の動画に移動: ",
"preferences_continue_autoplay_label": "次の動画を自動再生: ",
"preferences_listen_label": "音声モードを使用: ",
"preferences_local_label": "動画視聴にプロキシを経由: ",
@@ -68,7 +68,7 @@
"preferences_related_videos_label": "関連動画を表示: ",
"preferences_annotations_label": "最初からアノテーションを表示: ",
"preferences_extend_desc_label": "動画の説明文を自動的に拡張: ",
"preferences_vr_mode_label": "対話的な360°動画 (WebGL が必要): ",
"preferences_vr_mode_label": "対話的な 360° 動画 (WebGL が必要): ",
"preferences_category_visual": "外観設定",
"preferences_player_style_label": "プレイヤーのスタイル: ",
"Dark mode: ": "ダークモード: ",
@@ -77,7 +77,7 @@
"light": "ライト",
"preferences_thin_mode_label": "最小モード: ",
"preferences_category_misc": "ほかの設定",
"preferences_automatic_instance_redirect_label": "インスタンスの自動転送 (redirect.invidious.ioにフォールバック): ",
"preferences_automatic_instance_redirect_label": "インスタンスの自動転送 (redirect.invidious.io にフォールバック): ",
"preferences_category_subscription": "登録チャンネル設定",
"preferences_annotations_subscribed_label": "最初から登録チャンネルのアノテーションを表示 ",
"Redirect homepage to feed: ": "ホームからフィードにリダイレクト: ",
@@ -127,7 +127,7 @@
"Log out": "ログアウト",
"Released under the AGPLv3 on Github.": "GitHub 上で AGPLv3 の元で公開",
"Source available here.": "ソースはここで閲覧可能です。",
"View JavaScript license information.": "JavaScript ライセンス情報",
"View JavaScript license information.": "JavaScriptライセンス情報",
"View privacy policy.": "個人情報保護方針",
"Trending": "急上昇",
"Public": "公開",
@@ -143,7 +143,7 @@
"Editing playlist `x`": "再生リスト `x` を編集中",
"Show more": "もっと見る",
"Show less": "表示を少なく",
"Watch on YouTube": "YouTubeで視聴",
"Watch on YouTube": "YouTube で視聴",
"Switch Invidious Instance": "Invidious インスタンスの変更",
"Hide annotations": "アノテーションを隠す",
"Show annotations": "アノテーションを表示",
@@ -330,7 +330,7 @@
"(edited)": "(編集済み)",
"YouTube comment permalink": "YouTube コメントのパーマリンク",
"permalink": "パーマリンク",
"`x` marked it with a ❤": "`x` がを送りました",
"`x` marked it with a ❤": "`x` がを送りました",
"Audio mode": "音声モード",
"Video mode": "動画モード",
"channel_tab_videos_label": "動画",
@@ -343,7 +343,7 @@
"search_filters_type_label": "種類",
"search_filters_duration_label": "再生時間",
"search_filters_features_label": "特徴",
"search_filters_sort_label": "順番",
"search_filters_sort_label": "並べ替え",
"search_filters_date_option_hour": "1時間以内",
"search_filters_date_option_today": "今日",
"search_filters_date_option_week": "今週",
@@ -363,15 +363,15 @@
"search_filters_features_option_location": "場所",
"search_filters_features_option_hdr": "HDR",
"Current version: ": "現在のバージョン: ",
"next_steps_error_message": "下記のものを試して下さい ",
"next_steps_error_message_refresh": "再読",
"next_steps_error_message_go_to_youtube": "YouTube",
"next_steps_error_message": "以下をお試しください: ",
"next_steps_error_message_refresh": "再読み込み",
"next_steps_error_message_go_to_youtube": "YouTube を開く",
"search_filters_duration_option_short": "4分未満",
"footer_documentation": "説明書",
"footer_source_code": "ソースコード",
"footer_original_source_code": "元のソースコード",
"footer_modfied_source_code": "改変し使用",
"adminprefs_modified_source_code_url_label": "改変されたソースコードのレポジトリのURL",
"footer_modfied_source_code": "改変し使用",
"adminprefs_modified_source_code_url_label": "改変されたソースコードのレポジトリの URL",
"search_filters_duration_option_long": "20分以上",
"preferences_region_label": "地域: ",
"footer_donate_page": "寄付する",
@@ -396,10 +396,10 @@
"download_subtitles": "字幕 - `x` (.vtt)",
"search_filters_features_option_purchased": "購入済み",
"preferences_quality_option_dash": "DASH (適応的画質)",
"preferences_quality_dash_option_worst": "最",
"preferences_quality_dash_option_worst": "最",
"preferences_quality_dash_option_best": "最高",
"videoinfo_started_streaming_x_ago": "`x`前に配信を開始",
"videoinfo_watch_on_youTube": "YouTubeで視聴",
"videoinfo_watch_on_youTube": "YouTube で視聴",
"user_created_playlists": "`x`個の作成した再生リスト",
"Video unavailable": "動画は利用できません",
"Chinese": "中国語",
@@ -434,7 +434,7 @@
"crash_page_switch_instance": "<a href=\"`x`\">別のインスタンスを使用</a>を試す",
"crash_page_read_the_faq": "<a href=\"`x`\">よくある質問 (FAQ)</a> を読む",
"Popular enabled: ": "人気動画を有効化 ",
"search_message_use_another_instance": " <a href=\"`x`\">別のインスタンス上での検索</a>も可能です。",
"search_message_use_another_instance": "<a href=\"`x`\">別のインスタンス上での検索</a>も可能です。",
"search_filters_apply_button": "選択したフィルターを適用",
"user_saved_playlists": "`x`個の保存済みの再生リスト",
"crash_page_you_found_a_bug": "Invidious のバグのようです!",
@@ -446,7 +446,7 @@
"search_filters_duration_option_medium": "4 20分",
"preferences_save_player_pos_label": "再生位置を保存: ",
"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> を検索",
"channel_tab_streams_label": "ライブ",
"channel_tab_playlists_label": "再生リスト",
@@ -459,7 +459,7 @@
"Song: ": "曲: ",
"Channel Sponsor": "チャンネルのスポンサー",
"Standard YouTube license": "標準 Youtube ライセンス",
"Download is disabled": "ダウンロード: このインスタンスは未対応",
"Download is disabled": "ダウンロード: このインスタンスは未対応",
"Import YouTube playlist (.csv)": "YouTube 再生リストをインポート (.csv)",
"generic_button_delete": "削除",
"generic_button_cancel": "キャンセル",
@@ -469,5 +469,20 @@
"generic_button_save": "保存",
"generic_button_rss": "RSS",
"playlist_button_add_items": "動画を追加",
"generic_channels_count_0": "{{count}}個のチャンネル"
"generic_channels_count_0": "{{count}}個のチャンネル",
"Import YouTube watch history (.json)": "YouTube 視聴履歴をインポート (.json)",
"Add to playlist": "再生リストに追加",
"Add to playlist: ": "再生リストに追加: ",
"Answer": "回答",
"Search for videos": "動画を検索",
"The Popular feed has been disabled by the administrator.": "人気の動画のページは管理者によって無効にされています。",
"carousel_go_to": "スライド`x`を表示",
"carousel_slide": "スライド{{current}} / 全{{total}}個中",
"carousel_skip": "画像のスライド表示をスキップ",
"toggle_theme": "テーマの切り替え",
"preferences_preload_label": "動画データを事前に読み込む: ",
"Filipino (auto-generated)": "フィリピノ語 (自動生成)",
"First page": "最初のページ",
"channel_tab_posts_label": "投稿",
"channel_tab_courses_label": "コース"
}
+29 -14
View File
@@ -12,8 +12,8 @@
"Dark mode: ": "다크 모드: ",
"preferences_player_style_label": "플레이어 스타일: ",
"preferences_category_visual": "환경 설정",
"preferences_vr_mode_label": "VR 영상 활성화(WebGL 필요): ",
"preferences_extend_desc_label": "자동으로 비디오 설명을 확장: ",
"preferences_vr_mode_label": "360도 영상 활성화 (WebGL 필요): ",
"preferences_extend_desc_label": "자동으로 비디오 설명 펼치기: ",
"preferences_annotations_label": "기본으로 주석 표시: ",
"preferences_related_videos_label": "관련 동영상 보기: ",
"Fallback captions: ": "대체 자막: ",
@@ -46,9 +46,9 @@
"source": "출처",
"JavaScript license information": "자바스크립트 라이선스 정보",
"An alternative front-end to YouTube": "유튜브의 프론트엔드 대안",
"History": "역사",
"History": "시청 기록",
"Delete account?": "계정을 삭제 하시겠습니까?",
"Export data as JSON": "JSON으로 데이터 내보내기",
"Export data as JSON": "인비디어스 데이터 내보내기 (.json)",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "OPML로 구독 내보내기 (뉴파이프 및 프리튜브)",
"Export subscriptions as OPML": "OPML로 구독 내보내기",
"Export": "내보내기",
@@ -65,13 +65,13 @@
"Authorize token?": "토큰을 승인하시겠습니까?",
"New passwords must match": "새 비밀번호는 일치해야 합니다",
"New password": "새 비밀번호",
"Clear watch history?": "재생 기록을 삭제 하시겠습니까?",
"Clear watch history?": "시청 기록을 지우시겠습니까?",
"Previous page": "이전 페이지",
"Next page": "다음 페이지",
"last": "마지막",
"Shared `x` ago": "`x` 전",
"popular": "인기",
"oldest": "오래된순",
"popular": "인기",
"oldest": "과거순",
"newest": "최신순",
"View playlist on YouTube": "유튜브에서 재생목록 보기",
"View channel on YouTube": "유튜브에서 채널 보기",
@@ -123,7 +123,7 @@
"Create playlist": "재생목록 생성",
"Trending": "급상승",
"Delete playlist": "재생목록 삭제",
"Delete playlist `x`?": "재생목록 `x` 를 삭제 하시겠습니까?",
"Delete playlist `x`?": "재생목록 `x` 를 삭제하시겠습니까?",
"Updated `x` ago": "`x` 전에 업데이트됨",
"Released under the AGPLv3 on Github.": "깃허브에 AGPLv3 으로 배포됩니다.",
"View all playlists": "모든 재생목록 보기",
@@ -267,7 +267,7 @@
"Bulgarian": "불가리아어",
"Bosnian": "보스니아어",
"Belarusian": "벨라루스어",
"View more comments on Reddit": "레딧에서 더 많은 댓글 보기",
"View more comments on Reddit": "레딧에서 댓글 보기",
"View YouTube comments": "유튜브 댓글 보기",
"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` 업로드",
@@ -351,7 +351,7 @@
"News": "뉴스",
"Gaming": "게임",
"Music": "음악",
"Default": "디폴트",
"Default": "전체",
"Rating: ": "평점: ",
"About": "정보",
"Top": "최고",
@@ -419,7 +419,7 @@
"Portuguese (Brazil)": "포르투갈어 (브라질)",
"search_message_no_results": "결과가 없습니다.",
"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)": "영어 (미국)",
"Chinese": "중국어",
"Chinese (China)": "중국어 (중국)",
@@ -460,7 +460,7 @@
"Music in this video": "동영상 속 음악",
"Artist: ": "아티스트: ",
"Download is disabled": "다운로드가 비활성화 되어있음",
"Import YouTube playlist (.csv)": "유튜브 플레이리스트 가져오기 (.csv)",
"Import YouTube playlist (.csv)": "유튜브 재생목록 가져오기 (.csv)",
"playlist_button_add_items": "동영상 추가",
"channel_tab_podcasts_label": "팟캐스트",
"generic_button_delete": "삭제",
@@ -468,6 +468,21 @@
"generic_button_save": "저장",
"generic_button_cancel": "취소",
"generic_button_rss": "RSS",
"channel_tab_releases_label": "출시",
"generic_channels_count_0": "{{count}} 채널"
"channel_tab_releases_label": "발매",
"generic_channels_count_0": "{{count}} 채널",
"Import YouTube watch history (.json)": "유튜브 시청 기록 가져오기 (.json)",
"Add to playlist": "재생목록에 추가",
"Add to playlist: ": "재생목록에 추가: ",
"Answer": "답",
"The Popular feed has been disabled by the administrator.": "관리자가 인기 피드를 비활성화했습니다.",
"carousel_skip": "캐러셀 건너뛰기",
"carousel_go_to": "`x` 슬라이드로 이동",
"Search for videos": "비디오 검색",
"toggle_theme": "테마 전환",
"carousel_slide": "{{total}}의 슬라이드 {{current}}",
"preferences_preload_label": "비디오 데이터 사전 로드: ",
"First page": "첫 페이지",
"Filipino (auto-generated)": "Filipino (auto-generated)",
"channel_tab_posts_label": "게시글",
"channel_tab_courses_label": "코스"
}
+232
View File
@@ -0,0 +1,232 @@
{
"Add to playlist": "Giont a la playlist",
"generic_button_edit": "Modifega",
"generic_button_save": "Salva",
"LIVE": "EN DÌRETT",
"Shared `x` ago": "Compartiss `x` fa",
"View channel on YouTube": "Varda el canal sul YouTube",
"newest": "plù nöeuf",
"oldest": "plù végh",
"Search for videos": "Càuta dei video",
"The Popular feed has been disabled by the administrator.": "la seziùn Pupular la è stada disabilidada par l'amministratòr.",
"generic_channels_count": "{{count}} canal",
"generic_channels_count_plural": "{{count}} canai",
"popular": "pupular",
"generic_views_count": "{{count}} visualisazión",
"generic_views_count_plural": "{{count}} visualisazióni",
"generic_videos_count": "{{count}} video",
"generic_videos_count_plural": "{{count}} video",
"generic_playlists_count": "{{count}} playlist",
"generic_playlists_count_plural": "{{count}} playlist",
"generic_subscriptions_count": "{{count}} inscrizion",
"generic_subscriptions_count_plural": "{{count}} inscrizioni",
"generic_button_cancel": "Cançéla",
"generic_button_delete": "Scassa via",
"Unsubscribe": "Disinscriviti",
"Next page": "Pagina siguènt",
"Previous page": "Pagina indrèe",
"Clear watch history?": "Cançélar la istoria dei video vardàa?",
"New password": "Nöeva password",
"Import and Export Data": "Importazion ed esportazion dei dat",
"Import": "Importa",
"Import Invidious data": "Importa i dat de l'Invidious en el formàt JSON",
"Import YouTube subscriptions": "Importa le inscrizioni dal YouTube/OPML",
"Import YouTube playlist (.csv)": "Importa le playlist dal YouTube (.csv)",
"Import YouTube watch history (.json)": "Importa la istoria de visualizazzion dal YouTube (.json)",
"Import FreeTube subscriptions (.db)": "Importa le inscrizioni dal FreeTube (.db)",
"Import NewPipe data (.zip)": "importa i dat del NewPipe (.zip)",
"Export": "Esporta",
"Export subscriptions as OPML": "Esporta inscrizioni com OPML",
"Export data as JSON": "Esporta i dat de l'Invidious com JSON",
"Delete account?": "Eliminà 'l profil?",
"History": "Istoria",
"An alternative front-end to YouTube": "Una interfacia alternatif al YouTube",
"JavaScript license information": "Informaziòn su la licensa JavaScript",
"source": "font",
"Log in": "Và dent",
"Text CAPTCHA": "Tèst del CAPTCHA",
"Image CAPTCHA": "Imàgen del CAPTCHA",
"Sign In": "Ven denter",
"Register": "Registres",
"E-mail": "E-mail",
"Preferences": "Priferenze",
"preferences_category_player": "Priferenze del riprodutòr",
"preferences_quality_option_dash": "DASH (qualità adatif)",
"preferences_quality_option_hd720": "HD720",
"preferences_quality_option_medium": "Media",
"preferences_quality_option_small": "Picinina",
"preferences_quality_dash_option_auto": "Auto",
"preferences_quality_dash_option_best": "Meglior",
"preferences_quality_dash_option_worst": "Peggior",
"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",
"reddit": "Reddit",
"invidious": "Invidious",
"light": "ciar",
"dark": "scur",
"preferences_category_misc": "Priferenze varie",
"preferences_category_subscription": "Priferenze de le inscrizioni",
"published": "data de publicazion",
"published - reverse": "data de publicazion - invertì",
"alphabetically": "orden alfabetegh",
"channel name": "nòm del canal",
"channel name - reverse": "nòm del canal - invertì",
"Enable web notifications": "Empisa le notifeghe da la red",
"`x` uploaded a video": "`x` la ghàa cargà un video",
"`x` is live": "`x` l'è 'n dirétt adés",
"preferences_category_data": "Priferenze dei dat",
"Import/export data": "Importa/esporta i dat",
"Change password": "Cambia la parola ciav",
"Manage subscriptions": "Organisa le inscrizioni",
"Manage tokens": "Organisa i tokens",
"Watch history": "Istoria dei video vardà",
"Delete account": "Cançéla 'l profil",
"Save preferences": "Salva priferenze",
"Subscription manager": "Manegia le inscrizioni",
"Token": "Token",
"tokens_count": "{{count}} token",
"tokens_count_plural": "{{count}} token",
"Import/export": "Importa/esporta",
"unsubscribe": "disinscriviti",
"subscriptions_unseen_notifs_count": "{{count}} notifega mia visualisada",
"subscriptions_unseen_notifs_count_plural": "{{count}} notifeghe mia visualisade",
"Log out": "Sortiss",
"Released under the AGPLv3 on Github.": "Publicà en el GitHub suta licenza AGPLv3.",
"Source available here.": "Codegh de la font disponivel chì.",
"View privacy policy.": "Varda la pulitega de la privacy.",
"Trending": "De moda",
"Public": "Publico",
"Unlisted": "Non en lista",
"Private": "Privàt",
"View all playlists": "Varda tute le playlist",
"Updated `x` ago": "Giurnà `x` fa",
"Delete playlist `x`?": "Cançéla la playlist `x`?",
"Delete playlist": "Cançéla playlist",
"Create playlist": "Crea playlist",
"Title": "Titel",
"Playlist privacy": "Privacy de la playlist",
"Editing playlist `x`": "Modifega playlist `x`",
"playlist_button_add_items": "Gionta video",
"Show more": "Varda plù",
"Show less": "Varda mèn",
"Watch on YouTube": "Varda sul YouTube",
"Switch Invidious Instance": "Cambia la instanza del Invidious",
"search_message_no_results": "Non è stat truvà nigun resultat.",
"Cebuano": "Cebuano",
"Chinese (Traditional)": "Cines (Tradizional)",
"Corsican": "Còrso",
"Croatian": "Cruat",
"Georgian": "Georgian",
"Gujarati": "Gujarati",
"Hawaiian": "Hawaiian",
"Kurdish": "Curd",
"Latin": "Latin",
"Latvian": "Letton",
"Lithuanian": "Lituan",
"Malay": "Males",
"Maltese": "Maltes",
"Mongolian": "móngol",
"Persian": "Persian",
"Polish": "Polacch",
"Portuguese": "Portoghes",
"Romanian": "Romen",
"Scottish Gaelic": "Gaelich Scusses",
"Spanish (Latin America)": "Spagnöl (America do Sùd)",
"Thai": "Thai",
"Western Frisian": "Frisian do ponente",
"Basque": "Basco",
"Chinese (Simplified)": "Cines (Semplificà)",
"Haitian Creole": "Creolo de Haiti",
"Galician": "Galiçian",
"Hebrew": "Ebraich",
"Korean": "Corean",
"View playlist on YouTube": "Varda la playlist sul YouTube",
"Southern Sotho": "Sotho do Sùd",
"generic_button_rss": "RSS",
"Welsh": "Galés",
"Answer": "Resposta",
"New passwords must match": "Le nöeve password la deven esere uguai",
"Authorize token?": "Autorisà 'l token?",
"Authorize token for `x`?": "Autorisà 'l token par `x`?",
"Yes": "Sì",
"No": "No",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Esporta inscrizioni com OPML (par 'l NewPipe e 'l FreeTube)",
"Log in/register": "Va dent/Registres",
"User ID": "ID utent",
"Password": "Parola ciav",
"Time (h:mm:ss):": "Temp (h:mm:ss):",
"Import NewPipe subscriptions (.json)": "importa le inscrizioni dal NewPipe (.json)",
"youtube": "YouTube",
"alphabetically - reverse": "orden alfabetegh - invertì",
"preferences_category_visual": "Priferenze grafeghe",
"Clear watch history": "Scompartiss la istoria dei video vardà",
"preferences_category_admin": "Priferenze de l'amministratòr",
"Token manager": "Manegia i token",
"Subscriptions": "Inscrizioni",
"search": "cerca",
"View JavaScript license information.": "Varda le informazion su la licenza JavaScript.",
"search_message_change_filters_or_query": "Ti pödi pruà a slargà la reçerca e/or a cangià i filter.",
"generic_subscribers_count": "{{count}} inscritt",
"generic_subscribers_count_plural": "{{count}} inscriti",
"Subscribe": "Inscriviti",
"last": "ùltim",
"Add to playlist: ": "Giont a la playlist: ",
"preferences_autoplay_label": "Reproduzion automatega: ",
"preferences_continue_label": "Reproduzion seguént preimpostà: ",
"preferences_continue_autoplay_label": "Fa partì en automatico el video seguént: ",
"preferences_listen_label": "Modalità de sól audio preimpostà: ",
"preferences_local_label": "Proxy par i video: ",
"preferences_watch_history_label": "Ativà la istoria de reproduzion: ",
"preferences_speed_label": "Velocità preimpostà: ",
"preferences_volume_label": "Volume del reprodutòr: ",
"preferences_region_label": "Nazion del contenut: ",
"Dark mode: ": "Tema scur ",
"preferences_dark_mode_label": "Tema: ",
"preferences_thin_mode_label": "Modalità legera: ",
"preferences_automatic_instance_redirect_label": "Reindirizazzion automatega de la instansa (rivèrt a redirect.invidious.io): ",
"Hide annotations": "Piaca le notazioni",
"Show annotations": "Mostra le notazioni",
"Family friendly? ": "Adàt a tüti? ",
"Whitelisted regions: ": "Regioni en lista bianca: ",
"Blacklisted regions: ": "Regioni en lista negher ",
"Artist: ": "Artista: ",
"Song: ": "Cansòn ",
"Album: ": "Album: ",
"View YouTube comments": "Varda i comment dal YouTube",
"Password cannot be empty": "La parola ciav la no po miga esser voeut",
"channel:`x`": "Canal:`x`",
"Bangla": "Bengales",
"Hausa": "Hausa",
"Hindi": "Hindi",
"Hmong": "Hmong",
"Igbo": "Igbo",
"Javanese": "Javanese",
"Kannada": "Kannada",
"Kazakh": "Kazach",
"Khmer": "Khmer",
"Kyrgyz": "Kirghiz",
"Lao": "Lao",
"Luxembourgish": "Lussemburghes",
"Macedonian": "Macedon",
"Malagasy": "Malagascio",
"Malayalam": "Malayalam",
"Maori": "Maori",
"Marathi": "Marati",
"Nepali": "Nepales",
"Nyanja": "Nyanja",
"Pashto": "Pashtu",
"Punjabi": "Punjabi",
"Samoan": "Samoan",
"Standard YouTube license": "licensa predefinida de Youtube",
"License: ": "Licensa: ",
"Music in this video": "Musica en sto video",
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Ué! Sembra che ti la g'hà desabilitàa el JavaScript. Schisa chì para vardà i comment, ma cunsidera che peul vörse 'n po plu de temp a cargà.",
"preferences_video_loop_label": "Reproduci sèmper: "
}
+69
View File
@@ -0,0 +1,69 @@
{
"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ē"
}
+16 -5
View File
@@ -21,7 +21,7 @@
"Import and Export Data": "Importer- og eksporter data",
"Import": "Importer",
"Import Invidious data": "Importer Invidious-JSON-data",
"Import YouTube subscriptions": "Importer YouTube/OPML-abonnementer",
"Import YouTube subscriptions": "Importer YouTube CSV eller OPML-abonnementer",
"Import FreeTube subscriptions (.db)": "Importer FreeTube-abonnementer (.db)",
"Import NewPipe subscriptions (.json)": "Importer NewPipe-abonnementer (.json)",
"Import NewPipe data (.zip)": "Importer NewPipe-data (.zip)",
@@ -322,13 +322,13 @@
"channel_tab_community_label": "Gemenskap",
"search_filters_sort_option_relevance": "relevans",
"search_filters_sort_option_rating": "vurdering",
"search_filters_sort_option_date": "dato",
"search_filters_sort_option_date": "Opplastingsdato",
"search_filters_sort_option_views": "visninger",
"search_filters_type_label": "innholdstype",
"search_filters_duration_label": "varighet",
"search_filters_features_label": "funksjoner",
"search_filters_sort_label": "sorter",
"search_filters_date_option_hour": "time",
"search_filters_date_option_hour": "Siste time",
"search_filters_date_option_today": "i dag",
"search_filters_date_option_week": "uke",
"search_filters_date_option_month": "måned",
@@ -459,7 +459,7 @@
"search_message_no_results": "Resultatløst.",
"search_filters_type_option_all": "Alle typer",
"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_apply_button": "Bruk valgte filtre",
"search_filters_date_option_none": "Siden begynnelsen",
@@ -486,5 +486,16 @@
"generic_button_rss": "RSS",
"playlist_button_add_items": "Legg til videoer",
"generic_channels_count": "{{count}} kanal",
"generic_channels_count_plural": "{{count}} kanaler"
"generic_channels_count_plural": "{{count}} kanaler",
"Import YouTube watch history (.json)": "Importere YouTube visningshistorikk (.json)",
"carousel_go_to": "Gå til lysark `x`",
"Search for videos": "Søk i videoer",
"Answer": "Svar",
"carousel_slide": "Lysark {{current}} av {{total}}",
"carousel_skip": "Hopp over karusellen",
"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: "
}
+62 -23
View File
@@ -21,7 +21,7 @@
"Import and Export Data": "Gegevens im- en exporteren",
"Import": "Importeren",
"Import Invidious data": "JSON-gegevens Invidious importeren",
"Import YouTube subscriptions": "YouTube-/OPML-abonnementen importeren",
"Import YouTube subscriptions": "YouTube CVS of OPML-abonnementen importeren",
"Import FreeTube subscriptions (.db)": "FreeTube-abonnementen importeren (.db)",
"Import NewPipe subscriptions (.json)": "NewPipe-abonnementen importeren (.json)",
"Import NewPipe data (.zip)": "NewPipe-gegevens importeren (.zip)",
@@ -86,7 +86,7 @@
"Only show latest unwatched video from channel: ": "Alleen nieuwste niet-bekeken video van kanaal tonen: ",
"preferences_unseen_only_label": "Alleen niet-bekeken videos tonen: ",
"preferences_notifications_only_label": "Alleen meldingen tonen (als die er zijn): ",
"Enable web notifications": "Systemmeldingen inschakelen",
"Enable web notifications": "Systeemmeldingen inschakelen",
"`x` uploaded a video": "`x` heeft een video geüpload",
"`x` is live": "`x` zendt nu live uit",
"preferences_category_data": "Gegevensinstellingen",
@@ -107,10 +107,10 @@
"Report statistics: ": "Statistieken bijhouden? ",
"Save preferences": "Instellingen opslaan",
"Subscription manager": "Abonnementen beheren",
"Token manager": "Toegangssleutels beheren",
"Token manager": "Toegangssleutelbeheerder",
"Token": "Toegangssleutel",
"Import/export": "Importeren/Exporteren",
"unsubscribe": "Deabonneren",
"unsubscribe": "deabonneren",
"revoke": "Intrekken",
"Subscriptions": "Abonnementen",
"search": "zoeken",
@@ -192,15 +192,15 @@
"Arabic": "Arabisch",
"Armenian": "Armeens",
"Azerbaijani": "Azerbeidzjaans",
"Bangla": "Bangla",
"Bangla": "Bengaals",
"Basque": "Baskisch",
"Belarusian": "Wit-Rrussisch",
"Belarusian": "Wit-Russisch",
"Bosnian": "Bosnisch",
"Bulgarian": "Bulgaars",
"Burmese": "Birmaans",
"Catalan": "Catalaans",
"Cebuano": "Cebuano",
"Chinese (Simplified)": "Chinees (Veereenvoudigd)",
"Cebuano": "Cebuaans",
"Chinese (Simplified)": "Chinees (Vereenvoudigd)",
"Chinese (Traditional)": "Chinees (Traditioneel)",
"Corsican": "Corsicaans",
"Croatian": "Kroatisch",
@@ -217,23 +217,23 @@
"German": "Duits",
"Greek": "Grieks",
"Gujarati": "Gujarati",
"Haitian Creole": "Creools",
"Haitian Creole": "Haïtiaans Creools",
"Hausa": "Hausa",
"Hawaiian": "Hawaïaans",
"Hebrew": "Heebreeuws",
"Hebrew": "Hebreeuws",
"Hindi": "Hindi",
"Hmong": "Hmong",
"Hungarian": "Hongaars",
"Icelandic": "IJslands",
"Igbo": "Igbo",
"Igbo": "Ikbo",
"Indonesian": "Indonesisch",
"Irish": "Iers",
"Italian": "Italiaans",
"Japanese": "Japans",
"Javanese": "Javaans",
"Kannada": "Kannada",
"Kannada": "Kannada-taal",
"Kazakh": "Kazachs",
"Khmer": "Khmer",
"Khmer": "Khmer-taal",
"Korean": "Koreaans",
"Kurdish": "Koerdisch",
"Kyrgyz": "Kirgizisch",
@@ -245,10 +245,10 @@
"Macedonian": "Macedonisch",
"Malagasy": "Malagassisch",
"Malay": "Maleisisch",
"Malayalam": "Malayalam",
"Malayalam": "Malayalam-taal",
"Maltese": "Maltees",
"Maori": "Maorisch",
"Marathi": "Marathi",
"Marathi": "Marathi-taal",
"Mongolian": "Mongools",
"Nepali": "Nepalees",
"Norwegian Bokmål": "Noors (Bokmål)",
@@ -309,7 +309,7 @@
"(edited)": "(bewerkt)",
"YouTube comment permalink": "Link naar YouTube-reactie",
"permalink": "permalink",
"`x` marked it with a ❤": "`x` heeft dit gemarkeerd met ❤",
"`x` marked it with a ❤": "`x` heeft dit gemarkeerd met een ❤",
"Audio mode": "Audiomodus",
"Video mode": "Videomodus",
"channel_tab_videos_label": "Video's",
@@ -317,13 +317,13 @@
"channel_tab_community_label": "Gemeenschap",
"search_filters_sort_option_relevance": "relevantie",
"search_filters_sort_option_rating": "beoordeling",
"search_filters_sort_option_date": "datum",
"search_filters_sort_option_date": "Upload datum",
"search_filters_sort_option_views": "keren bekeken",
"search_filters_type_label": "Type inhoud",
"search_filters_duration_label": "duur",
"search_filters_features_label": "eigenschappen",
"search_filters_sort_label": "sorteren",
"search_filters_date_option_hour": "uur",
"search_filters_date_option_hour": "Laatste uur",
"search_filters_date_option_today": "vandaag",
"search_filters_date_option_week": "week",
"search_filters_date_option_month": "maand",
@@ -357,7 +357,7 @@
"footer_original_source_code": "Originele bron-code",
"footer_modfied_source_code": "Gewijzigde bron-code",
"adminprefs_modified_source_code_url_label": "URL naar gewijzigde bron-code-opslagplaats",
"next_steps_error_message": "Waarna u moet proberen om: ",
"next_steps_error_message": "Waarna u zou kunnen proberen om: ",
"footer_source_code": "Bron-code",
"search_filters_duration_option_long": "Lang (> 20 minuten)",
"preferences_quality_option_dash": "DASH (adaptieve kwaliteit)",
@@ -396,7 +396,7 @@
"Dutch (auto-generated)": "Nederlands (automatisch gegenereerd)",
"tokens_count": "{{count}} token",
"tokens_count_plural": "{{count}} tokens",
"generic_count_seconds": "{{count}} second",
"generic_count_seconds": "{{count}} seconde",
"generic_count_seconds_plural": "{{count}} seconden",
"generic_count_weeks": "{{count}} week",
"generic_count_weeks_plural": "{{count}} weken",
@@ -449,8 +449,8 @@
"generic_playlists_count_plural": "{{count}} afspeellijsten",
"Chinese (Hong Kong)": "Chinees (Hongkong)",
"Korean (auto-generated)": "Koreaans (automatisch gegenereerd)",
"search_filters_apply_button": "Geselecteerd filters toepassen",
"search_message_use_another_instance": " Je kan ook <a href=\"`x`\">zoeken op een andere instantie</a>.",
"search_filters_apply_button": "Geselecteerde filters toepassen",
"search_message_use_another_instance": "Je kan ook <a href=\"`x`\">zoeken op een andere instantie</a>.",
"Cantonese (Hong Kong)": "Kantonees (Hongkong)",
"Chinese (China)": "Chinees (China)",
"crash_page_read_the_faq": "de <a href=\"`x`\">veelgestelde vragen (FAQ)</a> gelezen hebt",
@@ -462,5 +462,44 @@
"Spanish (auto-generated)": "Spaans (automatisch gegenereerd)",
"crash_page_you_found_a_bug": "Je lijkt een bug in Invidious tegengekomen te zijn!",
"search_filters_duration_option_medium": "Gemiddeld (4 - 20 minuten)",
"crash_page_report_issue": "Indien het bovenstaande niet hielp, gelieve dan <a href=\"`x`\">een nieuw ticket op GitHub</a> te openen (liefst in het Engels) en neem de volgende tekst op in je bericht (gelieve deze NIET te vertalen):"
"crash_page_report_issue": "Indien het bovenstaande niet hielp, gelieve dan <a href=\"`x`\">een nieuw ticket op GitHub</a> te openen (liefst in het Engels) en neem de volgende tekst op in je bericht (gelieve deze NIET te vertalen):",
"channel_tab_podcasts_label": "Podcasts",
"Download is disabled": "Downloaden is uitgeschakeld",
"Channel Sponsor": "Kanaalsponsor",
"channel_tab_streams_label": "Livestreams",
"playlist_button_add_items": "Video's toevoegen",
"Artist: ": "Artiest: ",
"generic_button_save": "Opslaan",
"generic_button_cancel": "Annuleren",
"Album: ": "Album: ",
"channel_tab_shorts_label": "Shorts",
"channel_tab_releases_label": "Uitgaves",
"Song: ": "Lied: ",
"generic_channels_count": "{{count}} kanaal",
"generic_channels_count_plural": "{{count}} kanalen",
"Popular enabled: ": "Populair ingeschakeld: ",
"channel_tab_playlists_label": "Afspeellijsten",
"generic_button_edit": "Bewerken",
"Music in this video": "Muziek in deze video",
"generic_button_rss": "RSS",
"channel_tab_channels_label": "Kanalen",
"error_video_not_in_playlist": "De gevraagde video bestaat niet in deze afspeellijst. <a href=\"`x`\">Klik hier voor de startpagina van de afspeellijst.</a>",
"generic_button_delete": "Verwijderen",
"Import YouTube playlist (.csv)": "YouTube-afspeellijst importeren (.csv)",
"Standard YouTube license": "Standaard YouTube-licentie",
"Import YouTube watch history (.json)": "YouTube-kijkgeschiedenis importeren (.json)",
"Add to playlist": "Aan afspeellijst toevoegen",
"The Popular feed has been disabled by the administrator.": "De Populaire feed werd uitgeschakeld door een beheerder.",
"carousel_slide": "Dia {{current}} van {{total}}",
"carousel_go_to": "Naar dia `x` gaan",
"Add to playlist: ": "Aan afspeellijst toevoegen: ",
"Answer": "Antwoorden",
"Search for videos": "Naar video's zoeken",
"carousel_skip": "Carousel overslaan",
"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"
}
+26 -11
View File
@@ -21,13 +21,13 @@
"Import and Export Data": "Import i eksport danych",
"Import": "Import",
"Import Invidious data": "Importuj dane JSON Invidious",
"Import YouTube subscriptions": "Importuj subskrybcje z YouTube/OPML",
"Import FreeTube subscriptions (.db)": "Importuj subskrybcje z FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importuj subskrybcje z NewPipe (.json)",
"Import YouTube subscriptions": "Importuj subskrypcje YouTube w formacie CSV lub OPML",
"Import FreeTube subscriptions (.db)": "Importuj subskrypcje FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importuj subskrypcje NewPipe (.json)",
"Import NewPipe data (.zip)": "Importuj dane NewPipe (.zip)",
"Export": "Eksport",
"Export subscriptions as OPML": "Eksportuj subskrybcje jako OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Eksportuj subskrybcje jako OPML (dla NewPipe i FreeTube)",
"Export subscriptions as OPML": "Eksportuj subskrypcje jako OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Eksportuj subskrypcje jako OPML (dla NewPipe i FreeTube)",
"Export data as JSON": "Eksportuj dane Invidious jako JSON",
"Delete account?": "Usunąć konto?",
"History": "Historia",
@@ -73,7 +73,7 @@
"preferences_thin_mode_label": "Tryb minimalny: ",
"preferences_category_misc": "Różne preferencje",
"preferences_automatic_instance_redirect_label": "Automatycznie przekierowanie instancji (powrót do redirect.invidious.io): ",
"preferences_category_subscription": "Preferencje subskrybcji",
"preferences_category_subscription": "Preferencje subskrypcji",
"preferences_annotations_subscribed_label": "Domyślnie wyświetlaj adnotacje dla subskrybowanych kanałów: ",
"Redirect homepage to feed: ": "Przekieruj stronę główną do subskrybcji: ",
"preferences_max_results_label": "Liczba filmów widoczna na stronie subskrybcji: ",
@@ -95,7 +95,7 @@
"Clear watch history": "Wyczyść historię",
"Import/export data": "Import/Eksport danych",
"Change password": "Zmień hasło",
"Manage subscriptions": "Organizuj subskrybcje",
"Manage subscriptions": "Organizuj subskrypcje",
"Manage tokens": "Zarządzaj tokenami",
"Watch history": "Historia",
"Delete account": "Usuń konto",
@@ -115,7 +115,7 @@
"Import/export": "Import/Eksport",
"unsubscribe": "odsubskrybuj",
"revoke": "cofnij",
"Subscriptions": "Subskrybcje",
"Subscriptions": "Subskrypcje",
"search": "szukaj",
"Log out": "Wyloguj",
"Source available here.": "Kod źródłowy dostępny tutaj.",
@@ -478,7 +478,7 @@
"search_filters_date_label": "Data przesłania",
"search_filters_features_option_vr180": "VR180",
"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_duration_option_none": "Dowolna długość",
"search_filters_duration_option_medium": "Średnia (4-20 minut)",
@@ -492,7 +492,7 @@
"Song: ": "Piosenka: ",
"Channel Sponsor": "Sponsor kanału",
"Standard YouTube license": "Standardowa licencja YouTube",
"Import YouTube playlist (.csv)": "Importuj playlistę YouTube (.csv)",
"Import YouTube playlist (.csv)": "Importuj playlistę z YouTube (.csv)",
"generic_button_edit": "Edytuj",
"generic_button_cancel": "Anuluj",
"generic_button_rss": "RSS",
@@ -503,5 +503,20 @@
"playlist_button_add_items": "Dodaj filmy",
"generic_channels_count_0": "{{count}} kanał",
"generic_channels_count_1": "{{count}} kanały",
"generic_channels_count_2": "{{count}} kanałów"
"generic_channels_count_2": "{{count}} kanałów",
"Import YouTube watch history (.json)": "Importuj historię oglądania z YouTube (.json)",
"toggle_theme": "Przełącz motyw",
"The Popular feed has been disabled by the administrator.": "Kanał Popularne został wyłączony przez administratora.",
"Answer": "Odpowiedź",
"Search for videos": "Wyszukaj filmy",
"Add to playlist": "Dodaj do playlisty",
"Add to playlist: ": "Dodaj do playlisty: ",
"carousel_slide": "Slajd {{current}} z {{total}}",
"carousel_skip": "Pomiń karuzelę",
"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"
}
+144 -129
View File
@@ -1,27 +1,27 @@
{
"LIVE": "AO VIVO",
"Shared `x` ago": "Compartilhado `x` atrás",
"Shared `x` ago": "Publicado há `x`",
"Unsubscribe": "Cancelar inscrição",
"Subscribe": "Inscrever-se",
"View channel on YouTube": "Ver canal no YouTube",
"View playlist on YouTube": "Ver lista de reprodução no YouTube",
"View playlist on YouTube": "Ver playlist no YouTube",
"newest": "mais recentes",
"oldest": "mais antigos",
"popular": "populares",
"last": "último",
"last": "últimos",
"Next page": "Próxima página",
"Previous page": "Página anterior",
"Clear watch history?": "Limpar histórico de reprodução?",
"Clear watch history?": "Limpar histórico de exibição?",
"New password": "Nova senha",
"New passwords must match": "Nova senha deve ser igual",
"Authorize token?": "Autorizar o token?",
"Authorize token for `x`?": "Autorizar o token para `x`?",
"New passwords must match": "As senhas devem ser iguais",
"Authorize token?": "Autorizar token?",
"Authorize token for `x`?": "Autorizar token para `x`?",
"Yes": "Sim",
"No": "Não",
"Import and Export Data": "Importar e Exportar Dados",
"Import and Export Data": "Importar/exportar dados",
"Import": "Importar",
"Import Invidious data": "Importar dados em JSON do Invidious",
"Import YouTube subscriptions": "Importar inscrições do YouTube/OPML",
"Import Invidious data": "Importar dados JSON do Invidious",
"Import YouTube subscriptions": "Importar inscrições no formato CSV ou OPML do YouTube",
"Import FreeTube subscriptions (.db)": "Importar inscrições do FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importar inscrições do NewPipe (.json)",
"Import NewPipe data (.zip)": "Importar dados do NewPipe (.zip)",
@@ -32,49 +32,49 @@
"Delete account?": "Excluir conta?",
"History": "Histórico",
"An alternative front-end to YouTube": "Uma interface alternativa para o YouTube",
"JavaScript license information": "Informação de licença do JavaScript",
"source": "código-fonte",
"Log in": "Entrar",
"Log in/register": "Entrar/Registrar",
"JavaScript license information": "Informações sobre a licença do JavaScript",
"source": "fonte",
"Log in": "Fazer login",
"Log in/register": "Fazer login/criar conta",
"User ID": "Usuário",
"Password": "Senha",
"Time (h:mm:ss):": "Hora (h:mm:ss):",
"Text CAPTCHA": "CAPTCHA em texto",
"Image CAPTCHA": "CAPTCHA em imagem",
"Sign In": "Entrar",
"Register": "Registrar",
"Text CAPTCHA": "Mudar para um desafio de texto",
"Image CAPTCHA": "Mudar para um desafio visual",
"Sign In": "Fazer login",
"Register": "Criar conta",
"E-mail": "E-mail",
"Preferences": "Preferências",
"preferences_category_player": "Preferências do reprodutor",
"preferences_category_player": "Preferências de reprodução",
"preferences_video_loop_label": "Repetir sempre: ",
"preferences_autoplay_label": "Reprodução automática: ",
"preferences_continue_label": "Sempre reproduzir próximo: ",
"preferences_continue_label": "Reproduzir a seguir, por padrão: ",
"preferences_continue_autoplay_label": "Reproduzir próximo vídeo automaticamente: ",
"preferences_listen_label": "Apenas áudio por padrão: ",
"preferences_local_label": "Usar proxy nos vídeos: ",
"preferences_speed_label": "Velocidade padrão: ",
"preferences_quality_label": "Qualidade de vídeo preferida: ",
"preferences_volume_label": "Volume de reprodução: ",
"preferences_comments_label": "Preferência de comentários: ",
"preferences_comments_label": "Comentários padrão: ",
"youtube": "YouTube",
"reddit": "Reddit",
"preferences_captions_label": "Preferência de legendas: ",
"preferences_captions_label": "Legendas padrão: ",
"Fallback captions: ": "Legendas alternativas: ",
"preferences_related_videos_label": "Mostrar vídeos relacionados: ",
"preferences_annotations_label": "Sempre mostrar anotações: ",
"preferences_extend_desc_label": "Estenda automaticamente a descrição do vídeo: ",
"preferences_extend_desc_label": "Expandir automaticamente a descrição do vídeo: ",
"preferences_vr_mode_label": "Vídeos interativos de 360 graus (requer WebGL): ",
"preferences_category_visual": "Preferências visuais",
"preferences_player_style_label": "Estilo do tocador: ",
"preferences_player_style_label": "Estilo de reprodução: ",
"Dark mode: ": "Modo escuro: ",
"preferences_dark_mode_label": "Tema: ",
"dark": "escuro",
"light": "claro",
"preferences_thin_mode_label": "Modo compacto: ",
"preferences_category_misc": "Preferências diversas",
"preferences_automatic_instance_redirect_label": "Redirecionamento de instância automática (fallback para redirect.invidious.io): ",
"preferences_automatic_instance_redirect_label": "Redirecionamento automático de instâncias (alternativa para redirect.invidious.io): ",
"preferences_category_subscription": "Preferências de inscrições",
"preferences_annotations_subscribed_label": "Sempre mostrar anotações dos vídeos de canais inscritos: ",
"preferences_annotations_subscribed_label": "Mostrar anotações por padrão para canais inscritos? ",
"Redirect homepage to feed: ": "Redirecionar página inicial para o feed: ",
"preferences_max_results_label": "Número de vídeos no feed: ",
"preferences_sort_label": "Ordenar vídeos por: ",
@@ -84,30 +84,30 @@
"alphabetically - reverse": "alfabética - ordem inversa",
"channel name": "nome do canal",
"channel name - reverse": "nome do canal - ordem inversa",
"Only show latest video from channel: ": "Mostrar apenas o vídeo mais recente do canal: ",
"Only show latest unwatched video from channel: ": "Mostrar apenas o vídeo mais recente não visualizado do canal: ",
"preferences_unseen_only_label": "Mostrar apenas vídeos não visualizados: ",
"preferences_notifications_only_label": "Mostrar apenas notificações (se existentes): ",
"Enable web notifications": "Ativar notificações pela web",
"`x` uploaded a video": "`x` publicou um novo vídeo",
"Only show latest video from channel: ": "Mostrar apenas vídeos mais recentes do canal: ",
"Only show latest unwatched video from channel: ": "Mostrar apenas vídeos mais recentes não assistido do canal: ",
"preferences_unseen_only_label": "Mostrar apenas vídeos não assistido: ",
"preferences_notifications_only_label": "Mostrar apenas notificações (se houver): ",
"Enable web notifications": "Ativar notificações da Web",
"`x` uploaded a video": "`x` publicou um vídeo",
"`x` is live": "`x` está ao vivo",
"preferences_category_data": "Preferências de dados",
"Clear watch history": "Limpar histórico de reprodução",
"Import/export data": "Importar/Exportar dados",
"Clear watch history": "Limpar histórico de exibição",
"Import/export data": "Importar/exportar dados",
"Change password": "Alterar senha",
"Manage subscriptions": "Gerenciar inscrições",
"Manage tokens": "Gerenciar tokens",
"Watch history": "Histórico de reprodução",
"Delete account": "Apagar sua conta",
"Watch history": "Histórico de exibição",
"Delete account": "Excluir conta",
"preferences_category_admin": "Preferências de administrador",
"preferences_default_home_label": "Página de início padrão: ",
"preferences_feed_menu_label": "Menu do feed: ",
"preferences_show_nick_label": "Mostrar o nickname no topo: ",
"Top enabled: ": "Habilitar destaques: ",
"CAPTCHA enabled: ": "Habilitar CAPTCHA: ",
"Login enabled: ": "Habilitar login: ",
"Registration enabled: ": "Habilitar registro: ",
"Report statistics: ": "Habilitar estatísticas: ",
"preferences_default_home_label": "Página inicial padrão: ",
"preferences_feed_menu_label": "Guias de feed preferidos: ",
"preferences_show_nick_label": "Mostrar nome de usuário na parte superior: ",
"Top enabled: ": "Destaques ativados: ",
"CAPTCHA enabled: ": "CAPTCHA ativado: ",
"Login enabled: ": "Fazer login ativado: ",
"Registration enabled: ": "Criar conta ativado: ",
"Report statistics: ": "Relatório de estatísticas: ",
"Save preferences": "Salvar preferências",
"Subscription manager": "Gerenciador de inscrições",
"Token manager": "Gerenciador de tokens",
@@ -115,24 +115,24 @@
"tokens_count_0": "{{count}} token",
"tokens_count_1": "{{count}} tokens",
"tokens_count_2": "{{count}} tokens",
"Import/export": "Importar/Exportar",
"Import/export": "Importar/exportar",
"unsubscribe": "cancelar inscrição",
"revoke": "revogar",
"Subscriptions": "Inscrições",
"search": "Pesquisar",
"search": "pesquisar",
"Log out": "Sair",
"Released under the AGPLv3 on Github.": "Lançado sob a AGPLv3 no GitHub.",
"Source available here.": "Código-fonte disponível aqui.",
"View JavaScript license information.": "Ver informações da licença do JavaScript.",
"View privacy policy.": "Ver a política de privacidade.",
"Trending": "Tendências",
"View JavaScript license information.": "Informações de licença JavaScript.",
"View privacy policy.": "Política de privacidade.",
"Trending": "Em alta",
"Public": "Público",
"Unlisted": "Não listado",
"Private": "Privado",
"View all playlists": "Mostrar todas listas de reprodução",
"View all playlists": "Ver todas as playlists",
"Updated `x` ago": "Atualizado `x` atrás",
"Delete playlist `x`?": "Apagar a playlist `x`?",
"Delete playlist": "Apagar playlist",
"Delete playlist `x`?": "Excluir playlist `x`?",
"Delete playlist": "Excluir playlist",
"Create playlist": "Criar playlist",
"Title": "Título",
"Playlist privacy": "Privacidade da playlist",
@@ -140,24 +140,24 @@
"Show more": "Mostrar mais",
"Show less": "Mostrar menos",
"Watch on YouTube": "Assistir no YouTube",
"Switch Invidious Instance": "Mudar a instância do Invidious",
"Switch Invidious Instance": "Alterar instância Invidious",
"Hide annotations": "Ocultar anotações",
"Show annotations": "Mostrar anotações",
"Genre: ": "Gênero: ",
"License: ": "Licença: ",
"Family friendly? ": "Filtrar conteúdo impróprio: ",
"Wilson score: ": "Pontuação de Wilson: ",
"Engagement: ": "Empenho: ",
"Engagement: ": "Engajamento: ",
"Whitelisted regions: ": "Regiões permitidas: ",
"Blacklisted regions: ": "Regiões bloqueadas: ",
"Shared `x`": "Compartilhado `x`",
"Shared `x`": "Publicado em `x`",
"Premieres in `x`": "Estreia em `x`",
"Premieres `x`": "Estreia `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.": "Oi! Parece que seu JavaScript está desativado. Clique aqui para ver os comentários, entretanto eles podem levar um pouco mais de 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.": "O! Parece que você está com o JavaScript desativado. Clique aqui para ver os comentários, mas lembre-se de que eles podem demorar um pouco mais para carregar.",
"View YouTube comments": "Ver comentários no YouTube",
"View more comments on Reddit": "Ver mais comentários no Reddit",
"View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "Ver `x` comentários",
"([^.,0-9]|^)1([^.,0-9]|$)": "Ver `x` comentário",
"": "Ver `x` comentários"
},
"View Reddit comments": "Ver comentários no Reddit",
@@ -166,7 +166,7 @@
"Incorrect password": "Senha incorreta",
"Wrong answer": "Resposta incorreta",
"Erroneous CAPTCHA": "CAPTCHA inválido",
"CAPTCHA is a required field": "O CAPTCHA é um campo obrigatório",
"CAPTCHA is a required field": "CAPTCHA é um campo obrigatório",
"User ID is a required field": "O nome de usuário é um campo obrigatório",
"Password is a required field": "A senha é um campo obrigatório",
"Wrong username or password": "Nome de usuário ou senha inválidos",
@@ -175,17 +175,17 @@
"Please log in": "Por favor, inicie sua sessão",
"Invidious Private Feed for `x`": "Feed Privado do Invidious para `x`",
"channel:`x`": "canal: `x`",
"Deleted or invalid channel": "Este canal foi apagado ou é inválido",
"Deleted or invalid channel": "Canal excluído ou inválido",
"This channel does not exist.": "Este canal não existe.",
"Could not get channel info.": "Não foi possível obter as informações do canal.",
"Could not fetch comments": "Não foi possível obter os comentários",
"`x` ago": "`x` atrás",
"Load more": "Carregar mais",
"Could not create mix.": "Não foi possível criar o mix.",
"Empty playlist": "Lista de reprodução vazia",
"Not a playlist.": "Não é uma lista de reprodução.",
"Playlist does not exist.": "A lista de reprodução não existe.",
"Could not pull trending pages.": "Não foi possível obter as páginas dos vídeos em alta.",
"Empty playlist": "Playlist vazia",
"Not a playlist.": "Não é uma playlist.",
"Playlist does not exist.": "A playlist não existe.",
"Could not pull trending pages.": "Não foi possível obter as páginas de vídeos em alta.",
"Hidden field \"challenge\" is a required field": "O campo oculto \"desafio\" é obrigatório",
"Hidden field \"token\" is a required field": "O campo oculto \"token\" é obrigatório",
"Erroneous challenge": "Desafio inválido",
@@ -319,87 +319,87 @@
"generic_count_seconds_0": "{{count}} segundo",
"generic_count_seconds_1": "{{count}} segundos",
"generic_count_seconds_2": "{{count}} segundos",
"Fallback comments: ": "Comentários alternativos: ",
"Fallback comments: ": "Alternativa para comentários: ",
"Popular": "Populares",
"Search": "Procurar",
"Top": "No topo",
"Search": "Pesquisar",
"Top": "Destaques",
"About": "Sobre",
"Rating: ": "Avaliação: ",
"preferences_locale_label": "Idioma: ",
"View as playlist": "Ver como lista de reprodução",
"View as playlist": "Ver como playlist",
"Default": "Padrão",
"Music": "Músicas",
"Gaming": "Jogos",
"News": "Notícias",
"Movies": "Filmes",
"Download": "Baixar",
"Download": "Download",
"Download as: ": "Baixar como: ",
"%A %B %-d, %Y": "%A %-d %B %Y",
"(edited)": "(editado)",
"YouTube comment permalink": "Link permanente do comentário no YouTube",
"permalink": "Link permanente",
"`x` marked it with a ❤": "`x` foi marcado como ❤",
"`x` marked it with a ❤": "`x` foi marcado com um ❤",
"Audio mode": "Modo de áudio",
"Video mode": "Modo de vídeo",
"channel_tab_videos_label": "Vídeos",
"Playlists": "Listas de reprodução",
"Playlists": "Playlists",
"channel_tab_community_label": "Comunidade",
"search_filters_sort_option_relevance": "relevância",
"search_filters_sort_option_rating": "avaliação",
"search_filters_sort_option_date": "data",
"search_filters_sort_option_views": "visualizações",
"search_filters_type_label": "content_type",
"search_filters_duration_label": "duração",
"search_filters_features_label": "recursos",
"search_filters_sort_label": "ordenar",
"search_filters_date_option_hour": "hora",
"search_filters_date_option_today": "hoje",
"search_filters_date_option_week": "semana",
"search_filters_date_option_month": "mês",
"search_filters_date_option_year": "ano",
"search_filters_type_option_video": "vídeo",
"search_filters_sort_option_relevance": "Relevância",
"search_filters_sort_option_rating": "Avaliação",
"search_filters_sort_option_date": "Data de publicação",
"search_filters_sort_option_views": "Visualizações",
"search_filters_type_label": "Tipo",
"search_filters_duration_label": "Duração",
"search_filters_features_label": "Características",
"search_filters_sort_label": "Ordenar por",
"search_filters_date_option_hour": "Últimas horas",
"search_filters_date_option_today": "Hoje",
"search_filters_date_option_week": "Esta semana",
"search_filters_date_option_month": "Este mês",
"search_filters_date_option_year": "Este ano",
"search_filters_type_option_video": "Vídeo",
"search_filters_type_option_channel": "Canal",
"search_filters_type_option_playlist": "playlist",
"search_filters_type_option_movie": "filme",
"search_filters_type_option_show": "show",
"search_filters_features_option_hd": "hd",
"search_filters_features_option_subtitles": "legendas",
"search_filters_features_option_c_commons": "creative_commons",
"search_filters_features_option_three_d": "3d",
"search_filters_features_option_live": "ao vivo",
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "localização",
"search_filters_features_option_hdr": "hdr",
"search_filters_type_option_playlist": "Playlist",
"search_filters_type_option_movie": "Filme",
"search_filters_type_option_show": "Séries",
"search_filters_features_option_hd": "HD",
"search_filters_features_option_subtitles": "Legendas",
"search_filters_features_option_c_commons": "Creative Commons",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_live": "AO VIVO",
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Localização",
"search_filters_features_option_hdr": "HDR",
"Current version: ": "Versão atual: ",
"next_steps_error_message": "Depois disso, você deve tentar: ",
"next_steps_error_message_refresh": "Atualizar",
"next_steps_error_message_refresh": "Recarregar",
"next_steps_error_message_go_to_youtube": "Ir para o YouTube",
"footer_donate_page": "Doe",
"adminprefs_modified_source_code_url_label": "URL para repositório de código fonte modificado",
"footer_donate_page": "Doar",
"adminprefs_modified_source_code_url_label": "URL para o repositório do código-fonte modificado",
"search_filters_duration_option_long": "Longo (> 20 minutos)",
"search_filters_duration_option_short": "Curto (< 4 minutos)",
"footer_documentation": "Documentação",
"footer_source_code": "Código fonte",
"footer_original_source_code": "Código fonte original",
"footer_source_code": "Código-fonte",
"footer_original_source_code": "Código-fonte original",
"footer_modfied_source_code": "Código-fonte modificado",
"preferences_quality_dash_label": "Qualidade de vídeo do painel preferida: ",
"preferences_quality_dash_label": "Qualidade de vídeo DASH preferida: ",
"preferences_region_label": "País do conteúdo: ",
"preferences_quality_dash_option_4320p": "4320p",
"generic_videos_count_0": "{{count}} vídeo",
"generic_videos_count_1": "{{count}} vídeos",
"generic_videos_count_2": "{{count}} vídeos",
"generic_playlists_count_0": "{{count}} lista de reprodução",
"generic_playlists_count_1": "{{count}} listas de reprodução",
"generic_playlists_count_2": "{{count}} listas de reprodução",
"generic_playlists_count_0": "{{count}} playlist",
"generic_playlists_count_1": "{{count}} playlists",
"generic_playlists_count_2": "{{count}} playlists",
"generic_subscribers_count_0": "{{count}} inscrito",
"generic_subscribers_count_1": "{{count}} inscritos",
"generic_subscribers_count_2": "{{count}} inscritos",
"generic_subscriptions_count_0": "{{count}} inscrição",
"generic_subscriptions_count_1": "{{count}} inscrições",
"generic_subscriptions_count_2": "{{count}} inscrições",
"subscriptions_unseen_notifs_count_0": "{{count}} notificação não vista",
"subscriptions_unseen_notifs_count_1": "{{count}} notificações não vistas",
"subscriptions_unseen_notifs_count_2": "{{count}} notificações não vistas",
"subscriptions_unseen_notifs_count_0": "{{count}} notificação não visualizada",
"subscriptions_unseen_notifs_count_1": "{{count}} notificações não visualizadas",
"subscriptions_unseen_notifs_count_2": "{{count}} notificações não visualizadas",
"comments_view_x_replies_0": "Ver {{count}} resposta",
"comments_view_x_replies_1": "Ver {{count}} respostas",
"comments_view_x_replies_2": "Ver {{count}} respostas",
@@ -407,14 +407,14 @@
"comments_points_count_1": "{{count}} pontos",
"comments_points_count_2": "{{count}} pontos",
"crash_page_you_found_a_bug": "Parece que você encontrou um erro no Invidious!",
"crash_page_before_reporting": "Antes de reportar um erro, verifique se você:",
"preferences_save_player_pos_label": "Salvar a posição de reprodução: ",
"crash_page_before_reporting": "Antes de informar um erro, verifique se você:",
"preferences_save_player_pos_label": "Salvar posição de reprodução: ",
"search_filters_features_option_purchased": "Comprado",
"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_search_issue": "procurou por um <a href=\"`x`\">erro existente 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 traduza):",
"crash_page_read_the_faq": "leia as <a href=\"`x`\">Perguntas frequentes (FAQ)</a>",
"crash_page_read_the_faq": "leu as <a href=\"`x`\">Perguntas frequentes (FAQ)</a>",
"generic_views_count_0": "{{count}} visualização",
"generic_views_count_1": "{{count}} visualizações",
"generic_views_count_2": "{{count}} visualizações",
@@ -422,8 +422,8 @@
"preferences_quality_option_hd720": "HD720",
"preferences_quality_option_small": "Pequeno",
"preferences_quality_dash_option_auto": "Auto",
"preferences_quality_dash_option_best": "Melhor",
"preferences_quality_dash_option_worst": "Pior",
"preferences_quality_dash_option_best": "Melhor qualidade",
"preferences_quality_dash_option_worst": "Pior qualidade",
"preferences_quality_dash_option_2160p": "2160p",
"preferences_quality_dash_option_1440p": "1440p",
"preferences_quality_dash_option_1080p": "1080p",
@@ -435,17 +435,17 @@
"invidious": "Invidious",
"preferences_quality_option_medium": "Médio",
"search_filters_features_option_three_sixty": "360°",
"none": "none",
"none": "nenhum",
"videoinfo_watch_on_youTube": "Assistir no YouTube",
"videoinfo_youTube_embed_link": "Embutir",
"videoinfo_invidious_embed_link": "Link Embutido",
"videoinfo_youTube_embed_link": "Embed",
"videoinfo_invidious_embed_link": "Embed link",
"download_subtitles": "Legendas - `x` (.vtt)",
"user_created_playlists": "`x` listas de reprodução criadas",
"user_saved_playlists": "`x` listas de reprodução salvas",
"user_created_playlists": "`x` playlists criadas",
"user_saved_playlists": "`x` playlists salvas",
"Video unavailable": "Vídeo indisponível",
"videoinfo_started_streaming_x_ago": "Iniciou a transmissão a `x`",
"search_filters_title": "Filtro",
"preferences_watch_history_label": "Ative o histórico de exibição: ",
"preferences_watch_history_label": "Ativar histórico de exibição: ",
"search_message_no_results": "Nenhum resultado encontrado.",
"search_message_change_filters_or_query": "Tente ampliar sua consulta de pesquisa e/ou alterar os filtros.",
"English (United Kingdom)": "Inglês (Reino Unido)",
@@ -465,7 +465,7 @@
"Portuguese (Brazil)": "Português (Brasil)",
"Russian (auto-generated)": "Russo (gerado automaticamente)",
"Vietnamese (auto-generated)": "Vietnamita (gerado automaticamente)",
"search_filters_date_label": "Data de upload",
"search_filters_date_label": "Data de publicação",
"search_filters_date_option_none": "Qualquer data",
"Dutch (auto-generated)": "Holandês (gerado automaticamente)",
"French (auto-generated)": "Francês (gerado automaticamente)",
@@ -474,26 +474,26 @@
"Spanish (auto-generated)": "Espanhol (gerado automaticamente)",
"Spanish (Mexico)": "Espanhol (México)",
"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)",
"Turkish (auto-generated)": "Turco (gerado automaticamente)",
"search_filters_duration_option_medium": "Médio (4 - 20 minutos)",
"search_filters_features_option_vr180": "VR180",
"Popular enabled: ": "Popular habilitado: ",
"Popular enabled: ": "Página \"Populares\" ativada: ",
"error_video_not_in_playlist": "O vídeo solicitado não existe nesta playlist. <a href=\"`x`\">Clique aqui para acessar a página inicial da playlist.</a>",
"channel_tab_channels_label": "Canais",
"channel_tab_playlists_label": "Listas de reprodução",
"channel_tab_shorts_label": "Curtos",
"channel_tab_streams_label": "Ao Vivo",
"channel_tab_playlists_label": "Playlists",
"channel_tab_shorts_label": "Shorts",
"channel_tab_streams_label": "Transmissão ao vivo",
"Music in this video": "Música neste vídeo",
"Artist: ": "Artista: ",
"Album: ": "Álbum: ",
"Standard YouTube license": "Licença padrão do YouTube",
"Song: ": "Música: ",
"Channel Sponsor": "Patrocinador do Canal",
"Download is disabled": "Download está desabilitado",
"Import YouTube playlist (.csv)": "Importar lista de reprodução do YouTube (.csv)",
"generic_button_delete": "Apagar",
"Channel Sponsor": "Patrocinador do canal",
"Download is disabled": "Download indisponível",
"Import YouTube playlist (.csv)": "Importar playlist do YouTube (.csv)",
"generic_button_delete": "Excluir",
"generic_button_save": "Salvar",
"generic_button_edit": "Editar",
"playlist_button_add_items": "Adicionar vídeos",
@@ -503,5 +503,20 @@
"generic_button_rss": "RSS",
"generic_channels_count_0": "{{count}} canal",
"generic_channels_count_1": "{{count}} canais",
"generic_channels_count_2": "{{count}} canais"
"generic_channels_count_2": "{{count}} canais",
"Import YouTube watch history (.json)": "Importar histórico de exibição do YouTube (.json)",
"toggle_theme": "Alternar tema",
"Add to playlist": "Adicionar à playlist",
"Add to playlist: ": "Adicionar à playlist: ",
"Search for videos": "Pesquisar vídeos",
"The Popular feed has been disabled by the administrator.": "O feed \"Populares\" foi desativado pelo administrador.",
"Answer": "Resposta",
"carousel_slide": "Slide {{current}} de {{total}}",
"carousel_skip": "Ignorar carrossel",
"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"
}
+154 -107
View File
@@ -1,27 +1,27 @@
{
"LIVE": "Em direto",
"LIVE": "Direto",
"Shared `x` ago": "Partilhado `x` atrás",
"Unsubscribe": "Anular subscrição",
"Subscribe": "Subscrever",
"View channel on YouTube": "Ver canal no YouTube",
"View playlist on YouTube": "Ver lista de reprodução no YouTube",
"newest": "mais recentes",
"oldest": "mais antigos",
"popular": "popular",
"newest": "recentes",
"oldest": "antigos",
"popular": "populares",
"last": "últimos",
"Next page": "Próxima página",
"Next page": "Página seguinte",
"Previous page": "Página anterior",
"Clear watch history?": "Limpar histórico de reprodução?",
"New password": "Nova palavra-chave",
"New passwords must match": "As novas palavra-chaves devem corresponder",
"Authorize token?": "Autorizar token?",
"Authorize token for `x`?": "Autorizar token para `x`?",
"New password": "Nova palavra-passe",
"New passwords must match": "As novas palavras-passe devem ser iguais",
"Authorize token?": "Autorizar 'token'?",
"Authorize token for `x`?": "Autorizar 'token' para `x`?",
"Yes": "Sim",
"No": "Não",
"Import and Export Data": "Importar e exportar dados",
"Import": "Importar",
"Import Invidious data": "Importar dados JSON do Invidious",
"Import YouTube subscriptions": "Importar subscrições do YouTube/OPML",
"Import YouTube subscriptions": "Importar via YouTube csv ou subscrição OPML",
"Import FreeTube subscriptions (.db)": "Importar subscrições do FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Importar subscrições do NewPipe (.json)",
"Import NewPipe data (.zip)": "Importar dados do NewPipe (.zip)",
@@ -32,38 +32,38 @@
"Delete account?": "Eliminar conta?",
"History": "Histórico",
"An alternative front-end to YouTube": "Uma interface alternativa ao YouTube",
"JavaScript license information": "Informação de licença do JavaScript",
"source": "código-fonte",
"JavaScript license information": "Informação da licença JavaScript",
"source": "fonte",
"Log in": "Iniciar sessão",
"Log in/register": "Iniciar sessão/registar",
"User ID": "Utilizador",
"Password": "Palavra-chave",
"Password": "Palavra-passe",
"Time (h:mm:ss):": "Tempo (h:mm:ss):",
"Text CAPTCHA": "Texto CAPTCHA",
"Image CAPTCHA": "Imagem CAPTCHA",
"Sign In": "Iniciar sessão",
"Sign In": "Entrar",
"Register": "Registar",
"E-mail": "E-mail",
"Preferences": "Preferências",
"preferences_category_player": "Preferências do reprodutor",
"preferences_video_loop_label": "Repetir sempre: ",
"preferences_autoplay_label": "Reprodução automática: ",
"preferences_continue_label": "Reproduzir sempre o próximo: ",
"preferences_continue_label": "Reproduzir sempre o seguinte: ",
"preferences_continue_autoplay_label": "Reproduzir próximo vídeo automaticamente: ",
"preferences_listen_label": "Apenas áudio: ",
"preferences_local_label": "Usar proxy nos vídeos: ",
"preferences_speed_label": "Velocidade preferida: ",
"preferences_quality_label": "Qualidade de vídeo preferida: ",
"preferences_volume_label": "Volume da reprodução: ",
"preferences_comments_label": "Preferência dos comentários: ",
"preferences_volume_label": "Volume de reprodução: ",
"preferences_comments_label": "Comentários padrão: ",
"youtube": "YouTube",
"reddit": "Reddit",
"preferences_captions_label": "Legendas predefinidas: ",
"preferences_captions_label": "Legendas padrão: ",
"Fallback captions: ": "Legendas alternativas: ",
"preferences_related_videos_label": "Mostrar vídeos relacionados: ",
"preferences_annotations_label": "Mostrar anotações sempre: ",
"preferences_extend_desc_label": "Estender automaticamente a descrição do vídeo: ",
"preferences_vr_mode_label": "Vídeos interativos de 360 graus (necessita de WebGL): ",
"preferences_extend_desc_label": "Expandir automaticamente a descrição do vídeo: ",
"preferences_vr_mode_label": "Vídeos interativos de 360 graus (requer WebGL): ",
"preferences_category_visual": "Preferências visuais",
"preferences_player_style_label": "Estilo do reprodutor: ",
"Dark mode: ": "Modo escuro: ",
@@ -74,9 +74,9 @@
"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_category_subscription": "Preferências de subscrições",
"preferences_annotations_subscribed_label": "Mostrar sempre anotações aos canais subscritos: ",
"preferences_annotations_subscribed_label": "Mostrar sempre anotações nos canais subscritos: ",
"Redirect homepage to feed: ": "Redirecionar página inicial para subscrições: ",
"preferences_max_results_label": "Quantidade de vídeos nas subscrições: ",
"preferences_max_results_label": "Número de vídeos nas subscrições: ",
"preferences_sort_label": "Ordenar vídeos por: ",
"published": "publicado",
"published - reverse": "publicado - inverso",
@@ -88,19 +88,19 @@
"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_notifications_only_label": "Mostrar apenas notificações (se existirem): ",
"Enable web notifications": "Ativar notificações pela web",
"`x` uploaded a video": "`x` publicou um novo vídeo",
"Enable web notifications": "Ativar notificações web",
"`x` uploaded a video": "`x` publicou um vídeo",
"`x` is live": "`x` está em direto",
"preferences_category_data": "Preferências de dados",
"Clear watch history": "Limpar histórico de reprodução",
"Import/export data": "Importar / exportar dados",
"Change password": "Alterar palavra-chave",
"Manage subscriptions": "Gerir as subscrições",
"Import/export data": "Importar/exportar dados",
"Change password": "Alterar palavra-passe",
"Manage subscriptions": "Gerir subscrições",
"Manage tokens": "Gerir tokens",
"Watch history": "Histórico de reprodução",
"Delete account": "Eliminar conta",
"preferences_category_admin": "Preferências de administrador",
"preferences_default_home_label": "Página inicial predefinida: ",
"preferences_default_home_label": "Página inicial padrão: ",
"preferences_feed_menu_label": "Menu de subscrições: ",
"preferences_show_nick_label": "Mostrar nome de utilizador em cima: ",
"Top enabled: ": "Destaques ativados: ",
@@ -109,37 +109,38 @@
"Registration enabled: ": "Registar ativado: ",
"Report statistics: ": "Relatório de estatísticas: ",
"Save preferences": "Guardar preferências",
"Subscription manager": "Gerir subscrições",
"Token manager": "Gerir tokens",
"Subscription manager": "Gestor de subscrições",
"Token manager": "Gestor de tokens",
"Token": "Token",
"tokens_count": "{{count}} token",
"tokens_count_plural": "{{count}} tokens",
"Import/export": "Importar / exportar",
"tokens_count_0": "{{count}} token",
"tokens_count_1": "{{count}} tokens",
"tokens_count_2": "{{count}} tokens",
"Import/export": "Importar/exportar",
"unsubscribe": "anular subscrição",
"revoke": "revogar",
"Subscriptions": "Subscrições",
"search": "pesquisar",
"Log out": "Terminar sessão",
"Released under the AGPLv3 on Github.": "Lançado sob a AGPLv3 no GitHub.",
"Released under the AGPLv3 on Github.": "Disponibilizada sob a AGPLv3 no GitHub.",
"Source available here.": "Código-fonte disponível aqui.",
"View JavaScript license information.": "Ver informações da licença do JavaScript.",
"View privacy policy.": "Ver a política de privacidade.",
"View JavaScript license information.": "Ver informações da licença JavaScript.",
"View privacy policy.": "Ver política de privacidade.",
"Trending": "Tendências",
"Public": "Público",
"Unlisted": "Não listado",
"Private": "Privado",
"View all playlists": "Ver todas as listas de reprodução",
"Updated `x` ago": "Atualizado `x` atrás",
"Delete playlist `x`?": "Eliminar a lista de reprodução 'x'?",
"Updated `x` ago": "Atualizado `x`",
"Delete playlist `x`?": "Eliminar lista de reprodução `x`?",
"Delete playlist": "Eliminar lista de reprodução",
"Create playlist": "Criar lista de reprodução",
"Title": "Título",
"Playlist privacy": "Privacidade da lista de reprodução",
"Editing playlist `x`": "A editar lista de reprodução 'x'",
"Editing playlist `x`": "A editar lista de reprodução `x`",
"Show more": "Mostrar mais",
"Show less": "Mostrar menos",
"Watch on YouTube": "Ver no YouTube",
"Switch Invidious Instance": "Mudar a instância do Invidious",
"Switch Invidious Instance": "Alterar instância Invidious",
"Hide annotations": "Ocultar anotações",
"Show annotations": "Mostrar anotações",
"Genre: ": "Género: ",
@@ -150,50 +151,50 @@
"Whitelisted regions: ": "Regiões permitidas: ",
"Blacklisted regions: ": "Regiões bloqueadas: ",
"Shared `x`": "Partilhado `x`",
"Premieres in `x`": "Estreias em '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, entretanto eles podem levar mais tempo para carregar.",
"Premieres in `x`": "Estreia a `x`",
"Premieres `x`": "Estreia `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.",
"View YouTube comments": "Ver comentários do YouTube",
"View more comments on Reddit": "Ver mais comentários no Reddit",
"View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "Ver `x` comentários",
"([^.,0-9]|^)1([^.,0-9]|$)": "Ver `x` comentário",
"": "Ver `x` comentários"
},
"View Reddit comments": "Ver comentários do Reddit",
"Hide replies": "Ocultar respostas",
"Show replies": "Mostrar respostas",
"Incorrect password": "Palavra-chave incorreta",
"Incorrect password": "Palavra-passe incorreta",
"Wrong answer": "Resposta errada",
"Erroneous CAPTCHA": "CAPTCHA inválido",
"CAPTCHA is a required field": "CAPTCHA é um campo obrigatório",
"User ID is a required field": "O nome de utilizador é um campo obrigatório",
"Password is a required field": "Palavra-chave é um campo obrigatório",
"Wrong username or password": "Nome de utilizador ou palavra-chave incorreto",
"Password cannot be empty": "A palavra-chave não pode estar vazia",
"Password cannot be longer than 55 characters": "A palavra-chave não pode ser superior a 55 caracteres",
"Password is a required field": "Palavra-passe é um campo obrigatório",
"Wrong username or password": "Nome de utilizador ou palavra-passe incorreta",
"Password cannot be empty": "A palavra-passe não pode estar vazia",
"Password cannot be longer than 55 characters": "A palavra-passe não pode ter mais do que 55 caracteres",
"Please log in": "Por favor, inicie sessão",
"Invidious Private Feed for `x`": "Feed Privado do Invidious para `x`",
"channel:`x`": "canal:'x'",
"channel:`x`": "canal:`x`",
"Deleted or invalid channel": "Canal eliminado ou inválido",
"This channel does not exist.": "Este canal não existe.",
"Could not get channel info.": "Não foi possível obter as informações do canal.",
"Could not fetch comments": "Não foi possível obter os comentários",
"`x` ago": "`x` atrás",
"Load more": "Carregar mais",
"Could not create mix.": "Não foi possível criar a mistura.",
"Could not create mix.": "Não foi possível criar o mix.",
"Empty playlist": "Lista de reprodução vazia",
"Not a playlist.": "Não é uma lista de reprodução.",
"Playlist does not exist.": "A lista de reprodução não existe.",
"Could not pull trending pages.": "Não foi possível obter as páginas de tendências.",
"Could not pull trending pages.": "Não foi possível obter a página de tendências.",
"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",
"Erroneous challenge": "Desafio inválido",
"Erroneous token": "Token inválido",
"No such user": "Utilizador inválido",
"Token is expired, please try again": "Token expirou, tente novamente",
"Token is expired, please try again": "Token caducado, tente novamente",
"English": "Inglês",
"English (auto-generated)": "Inglês (auto-gerado)",
"Afrikaans": "Africano",
"Afrikaans": "Africânder",
"Albanian": "Albanês",
"Amharic": "Amárico",
"Arabic": "Árabe",
@@ -209,7 +210,7 @@
"Cebuano": "Cebuano",
"Chinese (Simplified)": "Chinês (simplificado)",
"Chinese (Traditional)": "Chinês (tradicional)",
"Corsican": "Corso",
"Corsican": "Córsego",
"Croatian": "Croata",
"Czech": "Checo",
"Danish": "Dinamarquês",
@@ -252,7 +253,7 @@
"Macedonian": "Macedónio",
"Malagasy": "Malgaxe",
"Malay": "Malaio",
"Malayalam": "Malaiala",
"Malayalam": "Malaialaio",
"Maltese": "Maltês",
"Maori": "Maori",
"Marathi": "Marathi",
@@ -297,30 +298,37 @@
"Yiddish": "Iídiche",
"Yoruba": "Ioruba",
"Zulu": "Zulu",
"generic_count_years": "{{count}} ano",
"generic_count_years_plural": "{{count}} anos",
"generic_count_months": "{{count}} s",
"generic_count_months_plural": "{{count}} meses",
"generic_count_weeks": "{{count}} seman",
"generic_count_weeks_plural": "{{count}} semanas",
"generic_count_days": "{{count}} dia",
"generic_count_days_plural": "{{count}} dias",
"generic_count_hours": "{{count}} hora",
"generic_count_hours_plural": "{{count}} horas",
"generic_count_minutes": "{{count}} minuto",
"generic_count_minutes_plural": "{{count}} minutos",
"generic_count_seconds": "{{count}} segundo",
"generic_count_seconds_plural": "{{count}} segundos",
"Fallback comments: ": "Comentários alternativos: ",
"generic_count_years_0": "{{count}} ano",
"generic_count_years_1": "{{count}} anos",
"generic_count_years_2": "{{count}} anos",
"generic_count_months_0": "{{count}} mês",
"generic_count_months_1": "{{count}} meses",
"generic_count_months_2": "{{count}} meses",
"generic_count_weeks_0": "{{count}} semana",
"generic_count_weeks_1": "{{count}} semanas",
"generic_count_weeks_2": "{{count}} semanas",
"generic_count_days_0": "{{count}} dia",
"generic_count_days_1": "{{count}} dias",
"generic_count_days_2": "{{count}} dias",
"generic_count_hours_0": "{{count}} hora",
"generic_count_hours_1": "{{count}} horas",
"generic_count_hours_2": "{{count}} horas",
"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",
"Search": "Pesquisar",
"Top": "Destaques",
"About": "Sobre",
"About": "Acerca",
"Rating: ": "Avaliação: ",
"preferences_locale_label": "Idioma: ",
"View as playlist": "Ver como lista de reprodução",
"Default": "Predefinido",
"Music": "Música",
"Default": "Padrão",
"Music": "Músicas",
"Gaming": "Jogos",
"News": "Notícias",
"Movies": "Filmes",
@@ -328,9 +336,9 @@
"Download as: ": "Descarregar como: ",
"%A %B %-d, %Y": "%A %B %-d, %Y",
"(edited)": "(editado)",
"YouTube comment permalink": "Hiperligação permanente do comentário no YouTube",
"permalink": "hiperligação permanente",
"`x` marked it with a ❤": "`x` foi marcado como ❤",
"YouTube comment permalink": "Ligação permanente do comentário no YouTube",
"permalink": "ligação permanente",
"`x` marked it with a ❤": "`x` foi marcado com um ❤",
"Audio mode": "Modo de áudio",
"Video mode": "Modo de vídeo",
"channel_tab_videos_label": "Vídeos",
@@ -338,7 +346,7 @@
"channel_tab_community_label": "Comunidade",
"search_filters_sort_option_relevance": "Relevância",
"search_filters_sort_option_rating": "Avaliação",
"search_filters_sort_option_date": "Data de envio",
"search_filters_sort_option_date": "Data de carregamento",
"search_filters_sort_option_views": "Visualizações",
"search_filters_type_label": "Tipo",
"search_filters_duration_label": "Duração",
@@ -353,38 +361,44 @@
"search_filters_type_option_channel": "Canal",
"search_filters_type_option_playlist": "Lista de reprodução",
"search_filters_type_option_movie": "Filme",
"search_filters_type_option_show": "Espetáculo",
"search_filters_type_option_show": "Séries",
"search_filters_features_option_hd": "HD",
"search_filters_features_option_subtitles": "Legendas",
"search_filters_features_option_c_commons": "Creative Commons",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_live": "Em direto",
"search_filters_features_option_live": "Direto",
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Localização",
"search_filters_features_option_hdr": "HDR",
"Current version: ": "Versão atual: ",
"next_steps_error_message": "Pode tentar as seguintes opções: ",
"next_steps_error_message_refresh": "Atualizar",
"next_steps_error_message_go_to_youtube": "Ir ao YouTube",
"next_steps_error_message_refresh": "Recarregar",
"next_steps_error_message_go_to_youtube": "Ir para o YouTube",
"search_filters_title": "Filtro",
"generic_videos_count": "{{count}} vídeo",
"generic_videos_count_plural": "{{count}} vídeos",
"generic_playlists_count": "{{count}} lista de reprodução",
"generic_playlists_count_plural": "{{count}} listas de reprodução",
"generic_subscriptions_count": "{{count}} inscrição",
"generic_subscriptions_count_plural": "{{count}} inscrições",
"generic_views_count": "{{count}} visualização",
"generic_views_count_plural": "{{count}} visualizações",
"generic_subscribers_count": "{{count}} inscrito",
"generic_subscribers_count_plural": "{{count}} inscritos",
"generic_videos_count_0": "{{count}} vídeo",
"generic_videos_count_1": "{{count}} vídeos",
"generic_videos_count_2": "{{count}} vídeos",
"generic_playlists_count_0": "{{count}} lista de reprodução",
"generic_playlists_count_1": "{{count}} listas de reprodução",
"generic_playlists_count_2": "{{count}} listas de reprodução",
"generic_subscriptions_count_0": "{{count}} subscrição",
"generic_subscriptions_count_1": "{{count}} subscrições",
"generic_subscriptions_count_2": "{{count}} subscrições",
"generic_views_count_0": "{{count}} visualização",
"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_label": "Qualidade de vídeo DASH preferida: ",
"preferences_quality_dash_option_2160p": "2160p",
"subscriptions_unseen_notifs_count": "{{count}} notificação não vista",
"subscriptions_unseen_notifs_count_plural": "{{count}} notificações não vistas",
"subscriptions_unseen_notifs_count_0": "{{count}} notificação não vista",
"subscriptions_unseen_notifs_count_1": "{{count}} notificações não vistas",
"subscriptions_unseen_notifs_count_2": "{{count}} notificações não vistas",
"Popular enabled: ": "Página \"popular\" ativada: ",
"search_message_no_results": "Nenhum resultado encontrado.",
"preferences_quality_dash_option_auto": "Automático",
"preferences_quality_dash_option_auto": "Automática",
"preferences_region_label": "País do conteúdo: ",
"preferences_quality_dash_option_1440p": "1440p",
"preferences_quality_dash_option_720p": "720p",
@@ -403,10 +417,12 @@
"preferences_quality_dash_option_240p": "240p",
"Video unavailable": "Vídeo não disponível",
"Russian (auto-generated)": "Russo (gerado automaticamente)",
"comments_view_x_replies": "Ver {{count}} resposta",
"comments_view_x_replies_plural": "Ver {{count}} respostas",
"comments_points_count": "{{count}} ponto",
"comments_points_count_plural": "{{count}} pontos",
"comments_view_x_replies_0": "Ver {{count}} resposta",
"comments_view_x_replies_1": "Ver {{count}} respostas",
"comments_view_x_replies_2": "Ver {{count}} respostas",
"comments_points_count_0": "{{count}} ponto",
"comments_points_count_1": "{{count}} pontos",
"comments_points_count_2": "{{count}} pontos",
"English (United Kingdom)": "Inglês (Reino Unido)",
"Chinese (Hong Kong)": "Chinês (Hong Kong)",
"Chinese (Taiwan)": "Chinês (Taiwan)",
@@ -432,13 +448,13 @@
"videoinfo_watch_on_youTube": "Ver no YouTube",
"videoinfo_youTube_embed_link": "Incorporar",
"adminprefs_modified_source_code_url_label": "URL do repositório do código-fonte alterado",
"videoinfo_invidious_embed_link": "Incorporar hiperligação",
"videoinfo_invidious_embed_link": "Incorporar ligação",
"none": "nenhum",
"videoinfo_started_streaming_x_ago": "Iniciou a transmissão há `x`",
"download_subtitles": "Legendas - `x` (.vtt)",
"user_created_playlists": "`x` listas de reprodução criadas",
"user_saved_playlists": "`x` listas de reprodução guardadas",
"preferences_save_player_pos_label": "Guardar a posição de reprodução atual do vídeo: ",
"preferences_save_player_pos_label": "Guardar posição de reprodução: ",
"Turkish (auto-generated)": "Turco (gerado automaticamente)",
"Cantonese (Hong Kong)": "Cantonês (Hong Kong)",
"Chinese (China)": "Chinês (China)",
@@ -455,21 +471,52 @@
"search_filters_date_option_none": "Qualquer data",
"search_filters_features_option_three_sixty": "360°",
"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_before_reporting": "Antes de reportar um erro, verifique se:",
"crash_page_read_the_faq": "leia as <a href=\"`x`\">Perguntas frequentes (FAQ)</a>",
"crash_page_read_the_faq": "leu 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_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):",
"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):",
"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_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 a 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 voltar à página inicial da lista de reprodução.</a>",
"Artist: ": "Artista: ",
"Album: ": "Álbum: ",
"channel_tab_streams_label": "Diretos",
"channel_tab_streams_label": "Emissões em direto",
"channel_tab_playlists_label": "Listas de reprodução",
"channel_tab_channels_label": "Canais",
"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"
}
+143 -109
View File
@@ -1,25 +1,25 @@
{
"search_filters_type_option_show": "Espetáculo",
"search_filters_type_option_show": "Séries",
"search_filters_sort_option_views": "Visualizações",
"search_filters_sort_option_date": "Data de envio",
"search_filters_sort_option_date": "Data de carregamento",
"search_filters_sort_option_rating": "Avaliação",
"search_filters_sort_option_relevance": "Relevância",
"Switch Invidious Instance": "Mudar a instância do Invidious",
"Switch Invidious Instance": "Alterar instância Invidious",
"Show less": "Mostrar menos",
"Show more": "Mostrar mais",
"Released under the AGPLv3 on Github.": "Lançado sob a AGPLv3 no GitHub.",
"Released under the AGPLv3 on Github.": "Disponibilizada sob a AGPLv3 no GitHub.",
"preferences_show_nick_label": "Mostrar nome de utilizador em cima: ",
"preferences_automatic_instance_redirect_label": "Redirecionamento de instância automática (solução de último recurso para redirect.invidious.io): ",
"preferences_category_misc": "Preferências diversas",
"preferences_vr_mode_label": "Vídeos interativos de 360 graus (necessita de WebGL): ",
"preferences_extend_desc_label": "Estender automaticamente a descrição do vídeo: ",
"next_steps_error_message_go_to_youtube": "Ir ao YouTube",
"preferences_vr_mode_label": "Vídeos interativos de 360 graus (requer WebGL): ",
"preferences_extend_desc_label": "Expandir automaticamente a descrição do vídeo: ",
"next_steps_error_message_go_to_youtube": "Ir para o YouTube",
"next_steps_error_message": "Pode tentar as seguintes opções: ",
"next_steps_error_message_refresh": "Atualizar",
"next_steps_error_message_refresh": "Recarregar",
"search_filters_features_option_hdr": "HDR",
"search_filters_features_option_location": "Localização",
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_live": "Ao Vivo",
"search_filters_features_option_live": "Direto",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_c_commons": "Creative Commons",
"search_filters_features_option_subtitles": "Legendas",
@@ -37,45 +37,52 @@
"search_filters_features_label": "Funcionalidades",
"search_filters_duration_label": "Duração",
"search_filters_type_label": "Tipo",
"permalink": "hiperligação permanente",
"YouTube comment permalink": "Hiperligação permanente do comentário no YouTube",
"permalink": "ligação permanente",
"YouTube comment permalink": "Ligação permanente do comentário no YouTube",
"Download as: ": "Descarregar como: ",
"Download": "Descarregar",
"Default": "Predefinido",
"Default": "Padrão",
"Top": "Destaques",
"Search": "Pesquisar",
"generic_count_years": "{{count}} segundo",
"generic_count_years_plural": "{{count}} segundos",
"generic_count_months": "{{count}} minuto",
"generic_count_months_plural": "{{count}} minutos",
"generic_count_weeks": "{{count}} hora",
"generic_count_weeks_plural": "{{count}} horas",
"generic_count_days": "{{count}} dia",
"generic_count_days_plural": "{{count}} dias",
"generic_count_hours": "{{count}} seman",
"generic_count_hours_plural": "{{count}} semanas",
"generic_count_minutes": "{{count}} s",
"generic_count_minutes_plural": "{{count}} meses",
"generic_count_seconds": "{{count}} ano",
"generic_count_seconds_plural": "{{count}} anos",
"generic_count_years_0": "{{count}} ano",
"generic_count_years_1": "{{count}} anos",
"generic_count_years_2": "{{count}} anos",
"generic_count_months_0": "{{count}} mês",
"generic_count_months_1": "{{count}} meses",
"generic_count_months_2": "{{count}} meses",
"generic_count_weeks_0": "{{count}} semana",
"generic_count_weeks_1": "{{count}} semanas",
"generic_count_weeks_2": "{{count}} semanas",
"generic_count_days_0": "{{count}} dia",
"generic_count_days_1": "{{count}} dias",
"generic_count_days_2": "{{count}} dias",
"generic_count_hours_0": "{{count}} hora",
"generic_count_hours_1": "{{count}} horas",
"generic_count_hours_2": "{{count}} horas",
"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",
"Chinese (Traditional)": "Chinês (tradicional)",
"Chinese (Simplified)": "Chinês (simplificado)",
"Could not pull trending pages.": "Não foi possível obter as páginas de tendências.",
"Could not create mix.": "Não foi possível criar a mistura.",
"Could not pull trending pages.": "Não foi possível obter a página de tendências.",
"Could not create mix.": "Não foi possível criar o mix.",
"Deleted or invalid channel": "Canal eliminado ou inválido",
"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.",
"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.",
"Delete playlist": "Eliminar lista de reprodução",
"Delete playlist `x`?": "Eliminar a lista de reprodução 'x'?",
"Delete playlist `x`?": "Eliminar lista de reprodução `x`?",
"search": "pesquisar",
"unsubscribe": "anular subscrição",
"Import/export": "Importar / exportar",
"Import/export": "Importar/exportar",
"Save preferences": "Guardar preferências",
"Top enabled: ": "Destaques ativados: ",
"Delete account": "Eliminar conta",
"Import/export data": "Importar / exportar dados",
"Import/export data": "Importar/exportar dados",
"preferences_annotations_label": "Mostrar anotações sempre: ",
"preferences_continue_label": "Reproduzir sempre o próximo: ",
"Sign In": "Iniciar sessão",
"preferences_continue_label": "Reproduzir sempre o seguinte: ",
"Sign In": "Entrar",
"Log in/register": "Iniciar sessão/registar",
"Delete account?": "Eliminar conta?",
"Import and Export Data": "Importar e exportar dados",
@@ -86,7 +93,7 @@
"Danish": "Dinamarquês",
"Czech": "Checo",
"Croatian": "Croata",
"Corsican": "Corso",
"Corsican": "Córsego",
"Cebuano": "Cebuano",
"Catalan": "Catalão",
"Burmese": "Birmanês",
@@ -100,10 +107,10 @@
"Arabic": "Árabe",
"Amharic": "Amárico",
"Albanian": "Albanês",
"Afrikaans": "Africano",
"Afrikaans": "Africânder",
"English (auto-generated)": "Inglês (auto-gerado)",
"English": "Inglês",
"Token is expired, please try again": "Token expirou, tente novamente",
"Token is expired, please try again": "Token caducado, tente novamente",
"No such user": "Utilizador inválido",
"Erroneous token": "Token inválido",
"Erroneous challenge": "Desafio inválido",
@@ -117,29 +124,29 @@
"Could not fetch comments": "Não foi possível obter os comentários",
"Could not get channel info.": "Não foi possível obter as informações do canal.",
"This channel does not exist.": "Este canal não existe.",
"channel:`x`": "canal:'x'",
"channel:`x`": "canal:`x`",
"Invidious Private Feed for `x`": "Feed Privado do Invidious para `x`",
"Please log in": "Por favor, inicie sessão",
"Password cannot be longer than 55 characters": "A palavra-chave não pode ser superior a 55 caracteres",
"Password cannot be empty": "A palavra-chave não pode estar vazia",
"Wrong username or password": "Nome de utilizador ou palavra-chave incorreto",
"Password is a required field": "Palavra-chave é um campo obrigatório",
"Password cannot be longer than 55 characters": "A palavra-passe não pode ter mais do que 55 caracteres",
"Password cannot be empty": "A palavra-passe não pode estar vazia",
"Wrong username or password": "Nome de utilizador ou palavra-passe incorreta",
"Password is a required field": "Palavra-passe é um campo obrigatório",
"User ID is a required field": "O nome de utilizador é um campo obrigatório",
"CAPTCHA is a required field": "CAPTCHA é um campo obrigatório",
"Erroneous CAPTCHA": "CAPTCHA inválido",
"Wrong answer": "Resposta errada",
"Incorrect password": "Palavra-chave incorreta",
"Incorrect password": "Palavra-passe incorreta",
"Show replies": "Mostrar respostas",
"Hide replies": "Ocultar respostas",
"View Reddit comments": "Ver comentários do Reddit",
"View `x` comments": {
"": "Ver `x` comentários",
"([^.,0-9]|^)1([^.,0-9]|$)": "Ver `x` comentários"
"([^.,0-9]|^)1([^.,0-9]|$)": "Ver `x` comentário"
},
"View more comments on Reddit": "Ver mais comentários no Reddit",
"View YouTube comments": "Ver comentários do YouTube",
"Premieres `x`": "Estreias 'x'",
"Premieres in `x`": "Estreias em 'x'",
"Premieres `x`": "Estreia `x`",
"Premieres in `x`": "Estreia a `x`",
"Shared `x`": "Partilhado `x`",
"Blacklisted regions: ": "Regiões bloqueadas: ",
"Whitelisted regions: ": "Regiões permitidas: ",
@@ -151,43 +158,44 @@
"Show annotations": "Mostrar anotações",
"Hide annotations": "Ocultar anotações",
"Watch on YouTube": "Ver no YouTube",
"Editing playlist `x`": "A editar lista de reprodução 'x'",
"Editing playlist `x`": "A editar lista de reprodução `x`",
"Playlist privacy": "Privacidade da lista de reprodução",
"Title": "Título",
"Create playlist": "Criar lista de reprodução",
"Updated `x` ago": "Atualizado `x` atrás",
"Updated `x` ago": "Atualizado `x`",
"View all playlists": "Ver todas as listas de reprodução",
"Private": "Privado",
"Unlisted": "Não listado",
"Public": "Público",
"Trending": "Tendências",
"View privacy policy.": "Ver a política de privacidade.",
"View JavaScript license information.": "Ver informações da licença do JavaScript.",
"View privacy policy.": "Ver política de privacidade.",
"View JavaScript license information.": "Ver informações da licença JavaScript.",
"Source available here.": "Código-fonte disponível aqui.",
"Log out": "Terminar sessão",
"Subscriptions": "Subscrições",
"revoke": "revogar",
"tokens_count": "{{count}} token",
"tokens_count_plural": "{{count}} tokens",
"tokens_count_0": "{{count}} token",
"tokens_count_1": "{{count}} tokens",
"tokens_count_2": "{{count}} tokens",
"Token": "Token",
"Token manager": "Gerir tokens",
"Subscription manager": "Gerir subscrições",
"Token manager": "Gestor de tokens",
"Subscription manager": "Gestor de subscrições",
"Report statistics: ": "Relatório de estatísticas: ",
"Registration enabled: ": "Registar ativado: ",
"Login enabled: ": "Iniciar sessão ativado: ",
"CAPTCHA enabled: ": "CAPTCHA ativado: ",
"preferences_feed_menu_label": "Menu de subscrições: ",
"preferences_default_home_label": "Página inicial predefinida: ",
"preferences_default_home_label": "Página inicial padrão: ",
"preferences_category_admin": "Preferências de administrador",
"Watch history": "Histórico de reprodução",
"Manage tokens": "Gerir tokens",
"Manage subscriptions": "Gerir as subscrições",
"Change password": "Alterar palavra-chave",
"Manage subscriptions": "Gerir subscrições",
"Change password": "Alterar palavra-passe",
"Clear watch history": "Limpar histórico de reprodução",
"preferences_category_data": "Preferências de dados",
"`x` is live": "`x` está em direto",
"`x` uploaded a video": "`x` publicou um novo vídeo",
"Enable web notifications": "Ativar notificações pela web",
"`x` uploaded a video": "`x` publicou um vídeo",
"Enable web notifications": "Ativar notificações web",
"preferences_notifications_only_label": "Mostrar apenas notificações (se existirem): ",
"preferences_unseen_only_label": "Mostrar apenas vídeos não visualizados: ",
"Only show latest unwatched video from channel: ": "Mostrar apenas vídeos mais recentes não visualizados do canal: ",
@@ -199,9 +207,9 @@
"published - reverse": "publicado - inverso",
"published": "publicado",
"preferences_sort_label": "Ordenar vídeos por: ",
"preferences_max_results_label": "Quantidade de vídeos nas subscrições: ",
"preferences_max_results_label": "Número de vídeos nas subscrições: ",
"Redirect homepage to feed: ": "Redirecionar página inicial para subscrições: ",
"preferences_annotations_subscribed_label": "Mostrar sempre anotações aos canais subscritos: ",
"preferences_annotations_subscribed_label": "Mostrar sempre anotações nos canais subscritos: ",
"preferences_category_subscription": "Preferências de subscrições",
"preferences_thin_mode_label": "Modo compacto: ",
"light": "claro",
@@ -212,11 +220,11 @@
"preferences_category_visual": "Preferências visuais",
"preferences_related_videos_label": "Mostrar vídeos relacionados: ",
"Fallback captions: ": "Legendas alternativas: ",
"preferences_captions_label": "Legendas predefinidas: ",
"preferences_captions_label": "Legendas padrão: ",
"reddit": "Reddit",
"youtube": "YouTube",
"preferences_comments_label": "Preferência dos comentários: ",
"preferences_volume_label": "Volume da reprodução: ",
"preferences_comments_label": "Comentários padrão: ",
"preferences_volume_label": "Volume de reprodução: ",
"preferences_quality_label": "Qualidade de vídeo preferida: ",
"preferences_speed_label": "Velocidade preferida: ",
"preferences_local_label": "Usar proxy nos vídeos: ",
@@ -231,11 +239,11 @@
"Image CAPTCHA": "Imagem CAPTCHA",
"Text CAPTCHA": "Texto CAPTCHA",
"Time (h:mm:ss):": "Tempo (h:mm:ss):",
"Password": "Palavra-chave",
"Password": "Palavra-passe",
"User ID": "Utilizador",
"Log in": "Iniciar sessão",
"source": "código-fonte",
"JavaScript license information": "Informação de licença do JavaScript",
"source": "fonte",
"JavaScript license information": "Informação da licença JavaScript",
"An alternative front-end to YouTube": "Uma interface alternativa ao YouTube",
"History": "Histórico",
"Export data as JSON": "Exportar dados Invidious como JSON",
@@ -245,18 +253,18 @@
"Import NewPipe data (.zip)": "Importar dados do NewPipe (.zip)",
"Import NewPipe subscriptions (.json)": "Importar subscrições do NewPipe (.json)",
"Import FreeTube subscriptions (.db)": "Importar subscrições do FreeTube (.db)",
"Import YouTube subscriptions": "Importar subscrições do YouTube/OPML",
"Import YouTube subscriptions": "Importar via YouTube csv ou subscrição OPML",
"Import Invidious data": "Importar dados JSON do Invidious",
"Import": "Importar",
"No": "Não",
"Yes": "Sim",
"Authorize token for `x`?": "Autorizar token para `x`?",
"Authorize token?": "Autorizar token?",
"New passwords must match": "As novas palavra-chaves devem corresponder",
"New password": "Nova palavra-chave",
"Authorize token for `x`?": "Autorizar 'token' para `x`?",
"Authorize token?": "Autorizar 'token'?",
"New passwords must match": "As novas palavras-passe devem ser iguais",
"New password": "Nova palavra-passe",
"Clear watch history?": "Limpar histórico de reprodução?",
"Previous page": "Página anterior",
"Next page": "Próxima página",
"Next page": "Página seguinte",
"last": "últimos",
"Current version: ": "Versão atual: ",
"channel_tab_community_label": "Comunidade",
@@ -264,19 +272,19 @@
"channel_tab_videos_label": "Vídeos",
"Video mode": "Modo de vídeo",
"Audio mode": "Modo de áudio",
"`x` marked it with a ❤": "`x` foi marcado como ❤",
"`x` marked it with a ❤": "`x` foi marcado com um ❤",
"(edited)": "(editado)",
"%A %B %-d, %Y": "%A %B %-d, %Y",
"Movies": "Filmes",
"News": "Notícias",
"Gaming": "Jogos",
"Music": "Música",
"Music": "Músicas",
"View as playlist": "Ver como lista de reprodução",
"preferences_locale_label": "Idioma: ",
"Rating: ": "Avaliação: ",
"About": "Sobre",
"About": "Acerca",
"Popular": "Popular",
"Fallback comments: ": "Comentários alternativos: ",
"Fallback comments: ": "Alternativa para comentários: ",
"Zulu": "Zulu",
"Yoruba": "Ioruba",
"Yiddish": "Iídiche",
@@ -321,7 +329,7 @@
"Marathi": "Marathi",
"Maori": "Maori",
"Maltese": "Maltês",
"Malayalam": "Malaiala",
"Malayalam": "Malaialaio",
"Malay": "Malaio",
"Malagasy": "Malgaxe",
"Macedonian": "Macedónio",
@@ -357,15 +365,15 @@
"Galician": "Galego",
"French": "Francês",
"Finnish": "Finlandês",
"popular": "popular",
"oldest": "mais antigos",
"newest": "mais recentes",
"popular": "populares",
"oldest": "antigos",
"newest": "recentes",
"View playlist on YouTube": "Ver lista de reprodução no YouTube",
"View channel on YouTube": "Ver canal no YouTube",
"Subscribe": "Subscrever",
"Unsubscribe": "Anular subscrição",
"Shared `x` ago": "Partilhado `x` atrás",
"LIVE": "AO VIVO",
"LIVE": "Direto",
"search_filters_duration_option_short": "Curto (< 4 minutos)",
"search_filters_duration_option_long": "Longo (> 20 minutos)",
"footer_source_code": "Código-fonte",
@@ -378,7 +386,7 @@
"preferences_quality_dash_label": "Qualidade de vídeo DASH preferida: ",
"preferences_quality_option_small": "Baixa",
"preferences_quality_option_hd720": "HD720",
"preferences_quality_dash_option_auto": "Automático",
"preferences_quality_dash_option_auto": "Automática",
"preferences_quality_dash_option_best": "Melhor",
"preferences_quality_dash_option_4320p": "4320p",
"preferences_quality_dash_option_2160p": "2160p",
@@ -389,7 +397,7 @@
"preferences_quality_dash_option_144p": "144p",
"search_filters_features_option_purchased": "Comprado",
"search_filters_features_option_three_sixty": "360°",
"videoinfo_invidious_embed_link": "Incorporar hiperligação",
"videoinfo_invidious_embed_link": "Incorporar ligação",
"Video unavailable": "Vídeo não disponível",
"invidious": "Invidious",
"preferences_quality_option_medium": "Média",
@@ -400,39 +408,47 @@
"preferences_quality_dash_option_worst": "Pior",
"none": "nenhum",
"videoinfo_youTube_embed_link": "Incorporar",
"preferences_save_player_pos_label": "Guardar a posição de reprodução atual do vídeo: ",
"preferences_save_player_pos_label": "Guardar posição de reprodução: ",
"download_subtitles": "Legendas - `x` (.vtt)",
"generic_views_count": "{{count}} visualização",
"generic_views_count_plural": "{{count}} visualizações",
"generic_views_count_0": "{{count}} visualização",
"generic_views_count_1": "{{count}} visualizações",
"generic_views_count_2": "{{count}} visualizações",
"videoinfo_started_streaming_x_ago": "Iniciou a transmissão há `x`",
"user_saved_playlists": "`x` listas de reprodução guardadas",
"generic_videos_count": "{{count}} vídeo",
"generic_videos_count_plural": "{{count}} vídeos",
"generic_playlists_count": "{{count}} lista de reprodução",
"generic_playlists_count_plural": "{{count}} listas de reprodução",
"subscriptions_unseen_notifs_count": "{{count}} notificação não vista",
"subscriptions_unseen_notifs_count_plural": "{{count}} notificações não vistas",
"comments_view_x_replies": "Ver {{count}} resposta",
"comments_view_x_replies_plural": "Ver {{count}} respostas",
"generic_subscribers_count": "{{count}} inscrito",
"generic_subscribers_count_plural": "{{count}} inscritos",
"generic_subscriptions_count": "{{count}} inscrição",
"generic_subscriptions_count_plural": "{{count}} inscrições",
"comments_points_count": "{{count}} ponto",
"comments_points_count_plural": "{{count}} pontos",
"generic_videos_count_0": "{{count}} vídeo",
"generic_videos_count_1": "{{count}} vídeos",
"generic_videos_count_2": "{{count}} vídeos",
"generic_playlists_count_0": "{{count}} lista de reprodução",
"generic_playlists_count_1": "{{count}} listas de reprodução",
"generic_playlists_count_2": "{{count}} listas de reprodução",
"subscriptions_unseen_notifs_count_0": "{{count}} notificação não vista",
"subscriptions_unseen_notifs_count_1": "{{count}} notificações não vistas",
"subscriptions_unseen_notifs_count_2": "{{count}} notificações não vistas",
"comments_view_x_replies_0": "Ver {{count}} resposta",
"comments_view_x_replies_1": "Ver {{count}} respostas",
"comments_view_x_replies_2": "Ver {{count}} respostas",
"generic_subscribers_count_0": "{{count}} subscritor",
"generic_subscribers_count_1": "{{count}} subscritores",
"generic_subscribers_count_2": "{{count}} subscritores",
"generic_subscriptions_count_0": "{{count}} subscrição",
"generic_subscriptions_count_1": "{{count}} subscrições",
"generic_subscriptions_count_2": "{{count}} subscrições",
"comments_points_count_0": "{{count}} ponto",
"comments_points_count_1": "{{count}} pontos",
"comments_points_count_2": "{{count}} pontos",
"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_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_read_the_faq": "leia as <a href=\"`x`\">Perguntas frequentes (FAQ)</a>",
"crash_page_read_the_faq": "leu 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_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):",
"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):",
"user_created_playlists": "`x` listas de reprodução criadas",
"search_filters_title": "Filtro",
"Chinese (Taiwan)": "Chinês (Taiwan)",
"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_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 States)": "Inglês (Estados Unidos)",
"Cantonese (Hong Kong)": "Cantonês (Hong Kong)",
@@ -464,11 +480,11 @@
"search_filters_type_option_all": "Qualquer tipo",
"search_filters_duration_option_none": "Qualquer duração",
"Popular enabled: ": "Página \"popular\" ativada: ",
"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>",
"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>",
"channel_tab_playlists_label": "Listas de reprodução",
"channel_tab_channels_label": "Canais",
"channel_tab_shorts_label": "Curtos",
"channel_tab_streams_label": "Diretos",
"channel_tab_streams_label": "Emissões em direto",
"Music in this video": "Música neste vídeo",
"Artist: ": "Artista: ",
"Album: ": "Álbum: ",
@@ -477,12 +493,30 @@
"Standard YouTube license": "Licença padrão do YouTube",
"Download is disabled": "A descarga está desativada",
"Import YouTube playlist (.csv)": "Importar lista de reprodução do YouTube (.csv)",
"generic_button_delete": "Deletar",
"generic_button_delete": "Eliminar",
"generic_button_edit": "Editar",
"generic_button_rss": "RSS",
"channel_tab_podcasts_label": "Podcasts",
"channel_tab_releases_label": "Lançamentos",
"generic_button_save": "Salvar",
"generic_button_save": "Guardar",
"generic_button_cancel": "Cancelar",
"playlist_button_add_items": "Adicionar vídeos"
"playlist_button_add_items": "Adicionar vídeos",
"generic_channels_count_0": "{{count}} canal",
"generic_channels_count_1": "{{count}} canais",
"generic_channels_count_2": "{{count}} canais",
"Import YouTube watch history (.json)": "Importar histórico de reprodução do YouTube (.json)",
"toggle_theme": "Trocar tema",
"Add to playlist": "Adicionar à lista de reprodução",
"Add to playlist: ": "Adicionar à lista de reprodução: ",
"Answer": "Responder",
"Search for videos": "Procurar vídeos",
"carousel_slide": "Diapositivo {{current}} de{{total}}",
"carousel_skip": "Ignorar carrossel",
"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.",
"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"
}
+2 -1
View File
@@ -478,5 +478,6 @@
"search_filters_type_option_all": "orice tip",
"preferences_quality_dash_option_240p": "240p",
"preferences_quality_dash_option_144p": "144p",
"Show less": "Afișați mai puțin"
"Show less": "Afișați mai puțin",
"Add to playlist": "Adaugă la playlist"
}
+36 -22
View File
@@ -8,20 +8,21 @@
"newest": "сначала новые",
"oldest": "сначала старые",
"popular": "популярные",
"last": "недавние",
"last": "последние",
"Next page": "Следующая страница",
"Previous page": "Предыдущая страница",
"First page": "Первая страница",
"Clear watch history?": "Очистить историю просмотров?",
"New password": "Новый пароль",
"New passwords must match": "Новые пароли не совпадают",
"Authorize token?": "Авторизовать токен?",
"Authorize token for `x`?": "Авторизовать токен для `x`?",
"Authorize token for `x`?": "Токен авторизации для `x`?",
"Yes": "Да",
"No": "Нет",
"Import and Export Data": "Импорт и экспорт данных",
"Import": "Импорт",
"Import Invidious data": "Импортировать JSON с данными Invidious",
"Import YouTube subscriptions": "Импортировать подписки из YouTube/OPML",
"Import YouTube subscriptions": "Импортировать подписки из CSV или OPML",
"Import FreeTube subscriptions (.db)": "Импортировать подписки из FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Импортировать подписки из NewPipe (.json)",
"Import NewPipe data (.zip)": "Импортировать данные из NewPipe (.zip)",
@@ -29,7 +30,7 @@
"Export subscriptions as OPML": "Экспортировать подписки в формате OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Экспортировать подписки в формате OPML (для NewPipe и FreeTube)",
"Export data as JSON": "Экспортировать данные Invidious в формате JSON",
"Delete account?": "Удалить учётку?",
"Delete account?": "Удалить учётную запись?",
"History": "История",
"An alternative front-end to YouTube": "Альтернативный фронтенд для YouTube",
"JavaScript license information": "Информация о лицензиях JavaScript",
@@ -42,14 +43,14 @@
"Text CAPTCHA": "Текстовая капча (англ.)",
"Image CAPTCHA": "Капча-картинка",
"Sign In": "Войти",
"Register": "Зарегистрироваться",
"Register": "Регистрация",
"E-mail": "Эл. почта",
"Preferences": "Настройки",
"preferences_category_player": "Настройки проигрывателя",
"preferences_video_loop_label": "Всегда повторять: ",
"preferences_autoplay_label": "Автовоспроизведение: ",
"preferences_continue_label": "Переходить к следующему видео? ",
"preferences_continue_autoplay_label": "Автопроигрывание следующего видео: ",
"preferences_continue_label": "Воспроизводить следующее видео: ",
"preferences_continue_autoplay_label": "Автовоспроизведение следующего видео: ",
"preferences_listen_label": "Режим «только аудио» по умолчанию: ",
"preferences_local_label": "Проигрывать видео через прокси? ",
"preferences_speed_label": "Скорость видео по умолчанию: ",
@@ -61,7 +62,7 @@
"preferences_captions_label": "Основной язык субтитров: ",
"Fallback captions: ": "Дополнительный язык субтитров: ",
"preferences_related_videos_label": "Показывать похожие видео? ",
"preferences_annotations_label": "Всегда показывать аннотации? ",
"preferences_annotations_label": "Показывать аннотации по умолчанию: ",
"preferences_extend_desc_label": "Автоматически раскрывать описание видео: ",
"preferences_vr_mode_label": "Интерактивные 360-градусные видео (необходим WebGL): ",
"preferences_category_visual": "Настройки сайта",
@@ -77,13 +78,13 @@
"preferences_annotations_subscribed_label": "Всегда показывать аннотации на каналах из ваших подписок? ",
"Redirect homepage to feed: ": "Показывать подписки на главной странице: ",
"preferences_max_results_label": "Число видео в ленте: ",
"preferences_sort_label": "Сортировать видео: ",
"published": "по дате публикации",
"published - reverse": "по дате публикации в обратном порядке",
"alphabetically": "по алфавиту",
"alphabetically - reverse": "по алфавиту в обратном порядке",
"channel name": "по названию канала",
"channel name - reverse": "по названию канала в обратном порядке",
"preferences_sort_label": "Сортировать видео по: ",
"published": "дате публикации",
"published - reverse": "дате публикации в обратном порядке",
"alphabetically": "алфавиту",
"alphabetically - reverse": "алфавиту в обратном порядке",
"channel name": "названию канала",
"channel name - reverse": "названию канала в обратном порядке",
"Only show latest video from channel: ": "Показывать только последние видео с каналов: ",
"Only show latest unwatched video from channel: ": "Показывать только последние непросмотренные видео с канала: ",
"preferences_unseen_only_label": "Показывать только непросмотренные видео: ",
@@ -134,8 +135,8 @@
"Title": "Заголовок",
"Playlist privacy": "Видимость плейлиста",
"Editing playlist `x`": "Редактирование плейлиста `x`",
"Show more": "Развернуть",
"Show less": "Свернуть",
"Show more": "Показать больше",
"Show less": "Показать меньше",
"Watch on YouTube": "Смотреть на YouTube",
"Switch Invidious Instance": "Сменить зеркало Invidious",
"Hide annotations": "Скрыть аннотации",
@@ -414,7 +415,7 @@
"generic_count_days_0": "{{count}} день",
"generic_count_days_1": "{{count}} дня",
"generic_count_days_2": "{{count}} дней",
"preferences_quality_dash_option_auto": "Автоматическое",
"preferences_quality_dash_option_auto": "Авто",
"preferences_quality_dash_option_1080p": "1080p",
"preferences_quality_dash_option_720p": "720p",
"generic_subscriptions_count_0": "{{count}} подписка",
@@ -466,7 +467,7 @@
"search_filters_features_option_three_sixty": "360°",
"Video unavailable": "Видео недоступно",
"preferences_save_player_pos_label": "Запоминать позицию: ",
"preferences_region_label": "Страна: ",
"preferences_region_label": "Страна источник ",
"preferences_watch_history_label": "Включить историю просмотров: ",
"search_filters_title": "Фильтр",
"search_filters_duration_option_none": "Любой длины",
@@ -474,9 +475,9 @@
"search_filters_date_option_none": "Любая дата",
"search_filters_date_label": "Дата загрузки",
"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_message_change_filters_or_query": "Попробуйте расширить поисковый запрос или изменить фильтры.",
"search_message_change_filters_or_query": "Попробуйте расширить поисковый запрос или изменить фильтры.",
"search_filters_duration_option_medium": "Средние (4 - 20 минут)",
"search_filters_apply_button": "Применить фильтры",
"Popular enabled: ": "Популярное включено: ",
@@ -503,5 +504,18 @@
"channel_tab_podcasts_label": "Подкасты",
"generic_channels_count_0": "{{count}} канал",
"generic_channels_count_1": "{{count}} канала",
"generic_channels_count_2": "{{count}} каналов"
"generic_channels_count_2": "{{count}} каналов",
"Import YouTube watch history (.json)": "Импортировать историю просмотра из YouTube (.json)",
"Add to playlist": "Добавить в плейлист",
"Add to playlist: ": "Добавить в плейлист: ",
"Answer": "Ответить",
"Search for videos": "Поиск видео",
"The Popular feed has been disabled by the administrator.": "Лента популярного была отключена администратором.",
"toggle_theme": "Переключатель тем",
"carousel_slide": "Пролистано {{current}} из {{total}}",
"carousel_skip": "Пропустить всё",
"carousel_go_to": "Перейти к странице `x`",
"preferences_preload_label": "Предзагрузка видеоданных: ",
"channel_tab_courses_label": "Курсы",
"channel_tab_posts_label": "Записи"
}
+16 -4
View File
@@ -13,7 +13,7 @@
"Import and Export Data": "Uvoz in izvoz podatkov",
"Import": "Uvozi",
"Import Invidious data": "Uvozi Invidious JSON podatke",
"Import YouTube subscriptions": "Uvozi YouTube/OPML naročnine",
"Import YouTube subscriptions": "Uvozi YouTube CSV ali OPML naročnine",
"Import FreeTube subscriptions (.db)": "Uvozi FreeTube (.db) naročnine",
"Import NewPipe data (.zip)": "Uvozi NewPipe (.zip) podatke",
"Export": "Izvozi",
@@ -105,7 +105,7 @@
"Show more": "Pokaži več",
"Switch Invidious Instance": "Preklopi Invidious instanco",
"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: ",
"Engagement: ": "Sodelovanje: ",
"Blacklisted regions: ": "Regije na seznamu nedovoljenih: ",
@@ -462,7 +462,7 @@
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_hdr": "HDR",
"next_steps_error_message_refresh": "Osveži",
"search_filters_date_option_hour": "Zadnja ura",
"search_filters_date_option_hour": "V zadnji uri",
"search_filters_features_option_purchased": "Kupljeno",
"search_filters_sort_label": "Razvrsti po",
"search_filters_sort_option_views": "številu ogledov",
@@ -520,5 +520,17 @@
"generic_channels_count_0": "{{count}} kanal",
"generic_channels_count_1": "{{count}} kanala",
"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)",
"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: "
}
+27 -6
View File
@@ -79,7 +79,7 @@
"invidious": "Invidious",
"preferences_captions_label": "Titra parazgjedhje: ",
"preferences_extend_desc_label": "Zgjero automatikisht përshkrimin e videos: ",
"preferences_player_style_label": "Silt lojtësi: ",
"preferences_player_style_label": "Stil lojtësi: ",
"Dark mode: ": "Mënyra e errët: ",
"preferences_dark_mode_label": "Temë: ",
"dark": "e errët",
@@ -257,13 +257,13 @@
"Video mode": "Mënyrë video",
"channel_tab_videos_label": "Video",
"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_type_label": "Lloj",
"search_filters_duration_label": "Kohëzgjatje",
"search_filters_features_label": "Veçori",
"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_duration_option_long": "E gjatë (> 20 minuta)",
"search_filters_features_option_hd": "HD",
@@ -435,14 +435,14 @@
"tokens_count_plural": "{{count}} tokenë",
"preferences_save_player_pos_label": "Mba mend pozicionin e luajtjes: ",
"Import Invidious data": "Importoni të dhëna JSON Invidious",
"Import YouTube subscriptions": "Importoni pajtime YouTube/OPML",
"Import YouTube subscriptions": "Importoni pajtime YouTube CSV ose OPML",
"Export data as JSON": "Eksportoji të dhënat Invidious si JSON",
"preferences_vr_mode_label": "Video me ndërveprim 360 gradë (lyp WebGL): ",
"Shared `x`": "Ndarë me të tjerë më `x`",
"search_filters_title": "Filtra",
"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>",
"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",
"preferences_watch_history_label": "Aktivizo historik parjesh: ",
"Top enabled: ": "Me kryesueset të aktivizuara: ",
@@ -477,5 +477,26 @@
"channel_tab_releases_label": "Hedhje në qarkullim",
"Song: ": "Pjesë: ",
"Import YouTube playlist (.csv)": "Importoni luajlistë YouTube (.csv)",
"Standard YouTube license": "Licencë YouTube standarde"
"Standard YouTube license": "Licencë YouTube standarde",
"published - reverse": "publikuar më - së prapthi",
"channel_tab_podcasts_label": "Podcast-e",
"channel name - reverse": "emër kanali - së prapthi",
"Import YouTube watch history (.json)": "Importo historik parjesh YouTube (.json)",
"preferences_local_label": "Video përmes ndërmjetësi: ",
"Fallback captions: ": "Titra nga halli: ",
"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ë"
}
+20 -5
View File
@@ -21,7 +21,7 @@
"Import and Export Data": "Uvoz i izvoz podataka",
"Import": "Uvezi",
"Import Invidious data": "Uvezi Invidious JSON podatke",
"Import YouTube subscriptions": "Uvezi YouTube/OPML praćenja",
"Import YouTube subscriptions": "Uvezi YouTube CSV ili OPML praćenja",
"Import FreeTube subscriptions (.db)": "Uvezi FreeTube praćenja (.db)",
"Import NewPipe subscriptions (.json)": "Uvezi NewPipe praćenja (.json)",
"Import NewPipe data (.zip)": "Uvezi NewPipe podatke (.zip)",
@@ -174,7 +174,7 @@
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Hej! Izgleda da ste isključili JavaScript. Kliknite ovde da biste videli komentare, imajte na umu da će možda potrajati malo duže da se učitaju.",
"View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "Pogledaj `x` komentar",
"": "Pogledaj`x` komentare"
"": "Pogledaj`x` komentara"
},
"View Reddit comments": "Pogledaj Reddit komentare",
"CAPTCHA is a required field": "CAPTCHA je obavezno polje",
@@ -211,7 +211,7 @@
"About": "O sajtu",
"footer_source_code": "Izvorni kôd",
"footer_original_source_code": "Originalni izvorni kôd",
"preferences_related_videos_label": "Prikaži povezane video snimke: ",
"preferences_related_videos_label": "Prikaži srodne video snimke: ",
"preferences_annotations_label": "Podrazumevano prikaži napomene: ",
"preferences_extend_desc_label": "Automatski proširi opis video snimka: ",
"preferences_vr_mode_label": "Interaktivni video snimci od 360 stepeni (zahteva WebGl): ",
@@ -404,7 +404,7 @@
"generic_count_months_0": "{{count}} mesec",
"generic_count_months_1": "{{count}} meseca",
"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_1": "{{count}} pratioca",
"generic_subscribers_count_2": "{{count}} pratilaca",
@@ -503,5 +503,20 @@
"crash_page_you_found_a_bug": "Izgleda da ste pronašli grešku u Invidious-u!",
"generic_views_count_0": "{{count}} pregled",
"generic_views_count_1": "{{count}} pregleda",
"generic_views_count_2": "{{count}} pregleda"
"generic_views_count_2": "{{count}} pregleda",
"Import YouTube watch history (.json)": "Uvezi YouTube istoriju gledanja (.json)",
"The Popular feed has been disabled by the administrator.": "Administrator je onemogućio fid „Popularno“.",
"Add to playlist: ": "Dodajte na plejlistu: ",
"Add to playlist": "Dodaj na plejlistu",
"carousel_slide": "Slajd {{current}} od {{total}}",
"carousel_go_to": "Idi na slajd `x`",
"Answer": "Odgovor",
"Search for videos": "Pretražite video snimke",
"carousel_skip": "Preskoči karusel",
"toggle_theme": "Podesi temu",
"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"
}
+20 -5
View File
@@ -21,7 +21,7 @@
"Import and Export Data": "Увоз и извоз података",
"Import": "Увези",
"Import Invidious data": "Увези Invidious JSON податке",
"Import YouTube subscriptions": "Увези YouTube/OPML праћења",
"Import YouTube subscriptions": "Увези YouTube CSV или OPML праћења",
"Import FreeTube subscriptions (.db)": "Увези FreeTube праћења (.db)",
"Import NewPipe subscriptions (.json)": "Увези NewPipe праћења (.json)",
"Import NewPipe data (.zip)": "Увези NewPipe податке (.zip)",
@@ -60,7 +60,7 @@
"reddit": "Reddit",
"preferences_captions_label": "Подразумевани титлови: ",
"Fallback captions: ": "Резервни титлови: ",
"preferences_related_videos_label": "Прикажи повезане видео снимке: ",
"preferences_related_videos_label": "Прикажи сродне видео снимке: ",
"preferences_annotations_label": "Подразумевано прикажи напомене: ",
"preferences_category_visual": "Визуелна подешавања",
"preferences_player_style_label": "Стил плејера: ",
@@ -246,7 +246,7 @@
"preferences_locale_label": "Језик: ",
"Persian": "Персијски",
"View `x` comments": {
"": "Погледај `x` коментаре",
"": "Погледај `x` коментара",
"([^.,0-9]|^)1([^.,0-9]|$)": "Погледај `x` коментар"
},
"search_filters_type_option_channel": "Канал",
@@ -404,7 +404,7 @@
"generic_count_months_0": "{{count}} месец",
"generic_count_months_1": "{{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_1": "{{count}} пратиоца",
"generic_subscribers_count_2": "{{count}} пратилаца",
@@ -503,5 +503,20 @@
"crash_page_you_found_a_bug": "Изгледа да сте пронашли грешку у Invidious-у!",
"generic_views_count_0": "{{count}} преглед",
"generic_views_count_1": "{{count}} прегледа",
"generic_views_count_2": "{{count}} прегледа"
"generic_views_count_2": "{{count}} прегледа",
"Import YouTube watch history (.json)": "Увези YouTube историју гледањa (.json)",
"toggle_theme": "Укључи тему",
"Add to playlist": "Додај на плејлисту",
"Answer": "Одговор",
"Search for videos": "Претражите видео снимке",
"carousel_go_to": "Иди на слајд `x`",
"Add to playlist: ": "Додајте на плејлисту: ",
"carousel_skip": "Прескочи карусел",
"The Popular feed has been disabled by the administrator.": "Администратор је онемогућио фид „Популарно“.",
"carousel_slide": "Слајд {{current}} од {{total}}",
"preferences_preload_label": "Унапред учитај податке о видео снимку: ",
"Filipino (auto-generated)": "Филипински (аутоматски генерисано)",
"channel_tab_courses_label": "Курсеви",
"First page": "Прва страница",
"channel_tab_posts_label": "Објаве"
}
+177 -28
View File
@@ -20,15 +20,15 @@
"No": "Nej",
"Import and Export Data": "Importera och exportera data",
"Import": "Importera",
"Import Invidious data": "Importera Invidious-data",
"Import YouTube subscriptions": "Importera YouTube-prenumerationer",
"Import Invidious data": "Importera Invidious JSON data",
"Import YouTube subscriptions": "Importera YouTube CSV eller OPML prenumerationer",
"Import FreeTube subscriptions (.db)": "Importera FreeTube-prenumerationer (.db)",
"Import NewPipe subscriptions (.json)": "Importera NewPipe-prenumerationer (.json)",
"Import NewPipe data (.zip)": "Importera NewPipe-data (.zip)",
"Export": "Exportera",
"Export subscriptions as OPML": "Exportera prenumerationer som OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportera prenumerationer som OPML (för NewPipe och FreeTube)",
"Export data as JSON": "Exportera data som JSON",
"Export data as JSON": "Exportera Invidious data som JSON",
"Delete account?": "Radera konto?",
"History": "Historik",
"An alternative front-end to YouTube": "Ett alternativt gränssnitt till YouTube",
@@ -63,7 +63,7 @@
"preferences_related_videos_label": "Visa relaterade videor? ",
"preferences_annotations_label": "Visa länkar-i-videon som förval? ",
"preferences_extend_desc_label": "Förläng videobeskrivning automatiskt: ",
"preferences_vr_mode_label": "Interaktiva 360-gradervideos: ",
"preferences_vr_mode_label": "Interaktiva 360-gradervideos (kräver WebGL): ",
"preferences_category_visual": "Visuella inställningar",
"preferences_player_style_label": "Spelarstil: ",
"Dark mode: ": "Mörkt läge: ",
@@ -152,7 +152,7 @@
"View YouTube comments": "Visa YouTube-kommentarer",
"View more comments on Reddit": "Visa flera kommentarer på Reddit",
"View `x` comments": {
"([^.,0-9]|^)1([^.,0-9]|$)": "Visa `x` kommentarer",
"([^.,0-9]|^)1([^.,0-9]|$)": "Visa `x` kommentar",
"": "Visa `x` kommentarer"
},
"View Reddit comments": "Visa Reddit-kommentarer",
@@ -167,7 +167,7 @@
"Wrong username or password": "Ogiltigt användarnamn eller lösenord",
"Password cannot be empty": "Lösenordet kan inte vara tomt",
"Password cannot be longer than 55 characters": "Lösenordet kan inte vara längre än 55 tecken",
"Please log in": "Logga in",
"Please log in": "Snälla logga in",
"Invidious Private Feed for `x`": "Ogiltig privat flöde för `x`",
"channel:`x`": "kanal `x`",
"Deleted or invalid channel": "Raderad eller ogiltig kanal",
@@ -311,8 +311,8 @@
"%A %B %-d, %Y": "%A %B %-d, %Y",
"(edited)": "(redigerad)",
"YouTube comment permalink": "Permanent YouTube-länk till innehållet",
"permalink": "permalänk",
"`x` marked it with a ❤": "`x` lämnade ett ❤",
"permalink": "permanent länk",
"`x` marked it with a ❤": "`x` markerade det med ett ❤",
"Audio mode": "Ljudläge",
"Video mode": "Videoläge",
"channel_tab_videos_label": "Videor",
@@ -320,30 +320,30 @@
"channel_tab_community_label": "Gemenskap",
"search_filters_sort_option_relevance": "Relevans",
"search_filters_sort_option_rating": "Rankning",
"search_filters_sort_option_date": "Datum",
"search_filters_sort_option_date": "Uppladdnings datum",
"search_filters_sort_option_views": "Visningar",
"search_filters_type_label": "Typ",
"search_filters_duration_label": "Varaktighet",
"search_filters_features_label": "Funktioner",
"search_filters_sort_label": "Sortera efter",
"search_filters_date_option_hour": "timme",
"search_filters_date_option_today": "idag",
"search_filters_date_option_week": "vecka",
"search_filters_date_option_month": "månad",
"search_filters_date_option_year": "år",
"search_filters_type_option_video": "video",
"search_filters_type_option_channel": "kanal",
"search_filters_type_option_playlist": "spellista",
"search_filters_type_option_movie": "film",
"search_filters_type_option_show": "tv-serie",
"search_filters_features_option_hd": "hd",
"search_filters_features_option_subtitles": "undertexter",
"search_filters_features_option_c_commons": "creative_commons",
"search_filters_features_option_three_d": "3d",
"search_filters_features_option_live": "live",
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "plats",
"search_filters_features_option_hdr": "hdr",
"search_filters_date_option_hour": "Senaste timmen",
"search_filters_date_option_today": "Idag",
"search_filters_date_option_week": "Denna vecka",
"search_filters_date_option_month": "Denna månad",
"search_filters_date_option_year": "Detta år",
"search_filters_type_option_video": "Video",
"search_filters_type_option_channel": "Kanal",
"search_filters_type_option_playlist": "Spellista",
"search_filters_type_option_movie": "Film",
"search_filters_type_option_show": "Serie",
"search_filters_features_option_hd": "HD",
"search_filters_features_option_subtitles": "Undertexter/CC",
"search_filters_features_option_c_commons": "Creative Commons",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_live": "Live",
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Plats",
"search_filters_features_option_hdr": "HDR",
"Current version: ": "Nuvarande version: ",
"next_steps_error_message_refresh": "Uppdatera",
"next_steps_error_message_go_to_youtube": "Gå till Youtube",
@@ -352,5 +352,154 @@
"search_filters_duration_option_long": "Lång (> 20 minuter)",
"footer_documentation": "Dokumentation",
"search_filters_duration_option_short": "Kort (< 4 minuter)",
"search_filters_title": "Filter"
"search_filters_title": "Filter",
"Korean (auto-generated)": "Koreanska (auto-genererad)",
"search_filters_features_option_three_sixty": "360°",
"preferences_quality_dash_option_worst": "Sämst",
"channel_tab_podcasts_label": "Podcaster",
"preferences_save_player_pos_label": "Spara uppspelningsposition: ",
"Spanish (Mexico)": "Spanska (Mexiko)",
"preferences_region_label": "Innehållsland: ",
"generic_subscriptions_count": "{{count}} prenumeration",
"generic_subscriptions_count_plural": "{{count}} prenumerationer",
"search_filters_apply_button": "Använd valda filter",
"Download is disabled": "Nedladdning är inaktiverad",
"comments_points_count": "{{count}} poäng",
"comments_points_count_plural": "{{count}} poäng",
"preferences_quality_dash_option_2160p": "2160p",
"German (auto-generated)": "Tyska (auto-genererad)",
"Japanese (auto-generated)": "Japanska (auto-genererad)",
"preferences_quality_option_medium": "Medium",
"footer_donate_page": "Donera",
"search_message_change_filters_or_query": "Prova att bredda din sökfråga och/eller ändra filtren.",
"crash_page_before_reporting": "Innan du rapporterar en bugg, se till att du har:",
"preferences_quality_dash_option_best": "Bäst",
"Channel Sponsor": "Kanal Sponsor",
"generic_videos_count": "{{count}} video",
"generic_videos_count_plural": "{{count}} videor",
"videoinfo_started_streaming_x_ago": "Började sända `x` sedan",
"videoinfo_youTube_embed_link": "Bädda in",
"channel_tab_streams_label": "Livesändningar",
"playlist_button_add_items": "Lägg till videor",
"generic_count_minutes": "{{count}}minut",
"generic_count_minutes_plural": "{{count}}minuter",
"preferences_quality_dash_option_720p": "720p",
"preferences_watch_history_label": "Aktivera visningshistorik: ",
"user_saved_playlists": "`x` sparade spellistor",
"Spanish (Spain)": "Spanska (Spanien)",
"invidious": "Invidious",
"crash_page_refresh": "försökte <a href=\"`x`\">uppdatera sidan</a>",
"Chinese (Hong Kong)": "Kinesiska (Hong Kong)",
"Artist: ": "Artist: ",
"generic_count_months": "{{count}}månad",
"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>.",
"generic_subscribers_count": "{{count}} prenumerant",
"generic_subscribers_count_plural": "{{count}} prenumeranter",
"download_subtitles": "Undertexter - `x` (.vtt)",
"generic_button_save": "Spara",
"crash_page_search_issue": "sökte efter <a href=\"`x`\">befintliga problem på GitHub</a>",
"generic_button_cancel": "Avbryt",
"none": "ingen",
"English (United States)": "English (Förenta staterna)",
"subscriptions_unseen_notifs_count": "{{count}}osedd notifikation",
"subscriptions_unseen_notifs_count_plural": "{{count}}osedda notifikationer",
"Album: ": "Album: ",
"preferences_quality_option_dash": "DASH (adaptiv kvalitet)",
"preferences_quality_dash_option_1080p": "1080p",
"Video unavailable": "Video inte tillgänglig",
"tokens_count": "{{count}}nyckel",
"tokens_count_plural": "{{count}}nycklar",
"Chinese (China)": "Kinesiska (Kina)",
"Italian (auto-generated)": "Italienska (auto-genererad)",
"channel_tab_shorts_label": "Shorts",
"preferences_quality_dash_option_1440p": "1440p",
"preferences_quality_dash_option_360p": "360p",
"search_message_no_results": "Inga resultat hittades.",
"channel_tab_releases_label": "Releaser",
"preferences_quality_dash_option_144p": "144p",
"Interlingue": "Interlingue (auto-genererad)",
"Song: ": "Låt: ",
"generic_channels_count": "{{count}} kanal",
"generic_channels_count_plural": "{{count}} kanaler",
"Chinese (Taiwan)": "Kinesiska (Taiwan)",
"preferences_quality_dash_label": "Önskad DASH-videokvalitet: ",
"adminprefs_modified_source_code_url_label": "URL till modifierad källkodslager",
"Turkish (auto-generated)": "Turkiska (auto-genererad)",
"Indonesian (auto-generated)": "Indonesiska (auto-genererad)",
"Portuguese (auto-generated)": "Portugisiska (auto-genererad)",
"generic_count_years": "{{count}}år",
"generic_count_years_plural": "{{count}}år",
"videoinfo_invidious_embed_link": "Bädda in länk",
"Popular enabled: ": "Populär aktiverad: ",
"Spanish (auto-generated)": "Spanska (auto-genererad)",
"preferences_quality_option_small": "Liten",
"English (United Kingdom)": "Engelska (Storbritannien)",
"channel_tab_playlists_label": "Spellistor",
"generic_button_edit": "Redigera",
"generic_playlists_count": "{{count}} spellista",
"generic_playlists_count_plural": "{{count}} spellistor",
"preferences_quality_option_hd720": "HD720p",
"search_filters_features_option_purchased": "Köpt",
"search_filters_date_option_none": "Vilket datum som helst",
"preferences_quality_dash_option_auto": "Auto",
"Cantonese (Hong Kong)": "Katonesiska (Hong Kong)",
"crash_page_report_issue": "Om inget av ovanstående hjälpte, vänligen <a href=\"`x`\">öppna ett nytt nummer på GitHub</a> (helst på engelska) och inkludera följande text i ditt meddelande (översätt INTE den texten):",
"crash_page_switch_instance": "försökte <a href=\"`x`\">använda en annan instans</a>",
"generic_count_weeks": "{{count}}vecka",
"generic_count_weeks_plural": "{{count}}veckor",
"videoinfo_watch_on_youTube": "Titta på YouTube",
"Music in this video": "Musik i denna video",
"footer_modfied_source_code": "Modifierad källkod",
"generic_button_rss": "RSS",
"preferences_quality_dash_option_4320p": "4320p",
"generic_count_hours": "{{count}}timme",
"generic_count_hours_plural": "{{count}}timmar",
"French (auto-generated)": "Franska (auto-genererad)",
"crash_page_read_the_faq": "läs <a href=\"`x`\">Vanliga frågor (FAQ)</a>",
"user_created_playlists": "`x` skapade spellistor",
"channel_tab_channels_label": "Kanaler",
"search_filters_type_option_all": "Vilken typ som helst",
"Russian (auto-generated)": "Ryska (auto-genererad)",
"preferences_quality_dash_option_480p": "480p",
"comments_view_x_replies": "Se {{count}} svar",
"comments_view_x_replies_plural": "Se {{count}} svar",
"footer_original_source_code": "Ursprunglig källkod",
"Portuguese (Brazil)": "Portugisiska (Brasilien)",
"search_filters_features_option_vr180": "VR180",
"error_video_not_in_playlist": "Den begärda videon finns inte i den här spellistan. <a href=\"`x`\">Klicka här för startsidan för spellistan.</a>",
"Dutch (auto-generated)": "Nederländska (auto-genererad)",
"generic_count_days": "{{count}}dag",
"generic_count_days_plural": "{{count}}dagar",
"Vietnamese (auto-generated)": "Vietnamesiska (auto-genererad)",
"search_filters_duration_option_none": "Vilken varaktighet som helst",
"preferences_quality_dash_option_240p": "240p",
"Chinese": "Kinesiska",
"preferences_automatic_instance_redirect_label": "Automatisk instansomdirigering (återgång till redirect.invidious.io): ",
"generic_button_delete": "Radera",
"Import YouTube playlist (.csv)": "Importera YouTube spellista (.csv)",
"next_steps_error_message": "Därefter bör du försöka: ",
"Standard YouTube license": "Standard YouTube licens",
"Import YouTube watch history (.json)": "Importera YouTube visningshistorik (.json)",
"search_filters_duration_option_medium": "Medium (4 - 20 minuter)",
"generic_count_seconds": "{{count}}sekund",
"generic_count_seconds_plural": "{{count}}sekunder",
"search_filters_date_label": "Uppladdningsdatum",
"crash_page_you_found_a_bug": "Det verkar som att du har hittat en bugg i Invidious!",
"generic_views_count": "{{count}} visning",
"generic_views_count_plural": "{{count}} visningar",
"toggle_theme": "Växla tema",
"Add to playlist": "Lägg till i spellista",
"Add to playlist: ": "Lägg till i spellista: ",
"Answer": "Svara",
"Search for videos": "Sök efter videor",
"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_skip": "Hoppa över karusellen",
"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"
}
+502
View File
@@ -0,0 +1,502 @@
{
"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": "ஏற்றுமதி",
"Text CAPTCHA": "உரை கேப்ட்சா",
"Image CAPTCHA": "பட கேப்ட்சா",
"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": "கொணர்வி தவிர்க்கவும்"
}
+7
View File
@@ -0,0 +1,7 @@
{
"Add to playlist": "Aýdym sanawyna goş",
"Add to playlist: ": "Pleýliste goş: ",
"Answer": "Jogap",
"Search for videos": "Wideo gözläň",
"The Popular feed has been disabled by the administrator.": "Trende bolan administrator tarapyndan ýapyldy."
}
+1
View File
@@ -0,0 +1 @@
{}
+20 -5
View File
@@ -21,7 +21,7 @@
"Import and Export Data": "Verileri İçe ve Dışa Aktar",
"Import": "İçe Aktar",
"Import Invidious data": "Invidious JSON Verilerini İçe Aktar",
"Import YouTube subscriptions": "YouTube/OPML Aboneliklerini İçe Aktar",
"Import YouTube subscriptions": "YouTube CSV veya OPML Aboneliklerini İçe Aktar",
"Import FreeTube subscriptions (.db)": "FreeTube Aboneliklerini İçe Aktar (.db)",
"Import NewPipe subscriptions (.json)": "NewPipe Aboneliklerini İçe Aktar (.json)",
"Import NewPipe data (.zip)": "NewPipe Verilerini İçe Aktar (.zip)",
@@ -322,13 +322,13 @@
"channel_tab_community_label": "Topluluk",
"search_filters_sort_option_relevance": "İlgi",
"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_type_label": "Tür",
"search_filters_duration_label": "Süre",
"search_filters_features_label": "Özellikler",
"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_week": "Bu Hafta",
"search_filters_date_option_month": "Bu Ay",
@@ -452,7 +452,7 @@
"Spanish (Spain)": "İspanyolca (İspanya)",
"Vietnamese (auto-generated)": "Vietnamca (Otomatik Oluşturuldu)",
"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_duration_option_none": "Herhangi Bir Süre",
"search_message_no_results": "Sonuç bulunamadı.",
@@ -486,5 +486,20 @@
"playlist_button_add_items": "Video ekle",
"channel_tab_podcasts_label": "Podcast'ler",
"generic_channels_count": "{{count}} kanal",
"generic_channels_count_plural": "{{count}} kanal"
"generic_channels_count_plural": "{{count}} kanal",
"Import YouTube watch history (.json)": "YouTube İzleme Geçmişini İçe Aktar (.json)",
"toggle_theme": "Temayı Değiştir",
"Add to playlist": "Oynatma listesine ekle",
"Add to playlist: ": "Oynatma listesine ekle: ",
"Answer": "Yanıt",
"Search for videos": "Video ara",
"carousel_slide": "Sunum {{current}} / {{total}}",
"carousel_skip": "Kayar menüyü atla",
"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ı.",
"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"
}
+20 -5
View File
@@ -21,7 +21,7 @@
"Import and Export Data": "Імпорт і експорт даних",
"Import": "Імпорт",
"Import Invidious data": "Імпортувати JSON-дані Invidious",
"Import YouTube subscriptions": "Імпортувати підписки з YouTube чи OPML",
"Import YouTube subscriptions": "Імпортувати підписки YouTube з CSV чи OPML",
"Import FreeTube subscriptions (.db)": "Імпортувати підписки з FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Імпортувати підписки з NewPipe (.json)",
"Import NewPipe data (.zip)": "Імпортувати дані з NewPipe (.zip)",
@@ -127,7 +127,7 @@
"Create playlist": "Створити список відтворення",
"Title": "Заголовок",
"Playlist privacy": "Конфіденційність списку відтворення",
"Editing playlist `x`": "Редагування списку відтворення \"x\"",
"Editing playlist `x`": "Редагування списку відтворення `x`",
"Watch on YouTube": "Дивитися на YouTube",
"Hide annotations": "Приховати анотації",
"Show annotations": "Показати анотації",
@@ -455,7 +455,7 @@
"search_filters_date_option_week": "Цей тиждень",
"search_filters_type_label": "Тип",
"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_date_option_hour": "Остання година",
"search_filters_date_option_month": "Цей місяць",
@@ -472,7 +472,7 @@
"search_filters_features_option_three_sixty": "360°",
"search_filters_features_option_hdr": "HDR",
"search_filters_sort_label": "Спершу",
"search_filters_sort_option_date": "Нещодавні",
"search_filters_sort_option_date": "Дата вивантаження",
"search_filters_apply_button": "Застосувати фільтри",
"search_filters_features_option_vr180": "VR180",
"search_filters_features_option_purchased": "Придбано",
@@ -503,5 +503,20 @@
"generic_button_save": "Зберегти",
"generic_channels_count_0": "{{count}} канал",
"generic_channels_count_1": "{{count}} канали",
"generic_channels_count_2": "{{count}} каналів"
"generic_channels_count_2": "{{count}} каналів",
"Import YouTube watch history (.json)": "Імпортувати історію переглядів YouTube (.json)",
"toggle_theme": "Перемкнути тему",
"Add to playlist": "Додати до списку відтворення",
"Add to playlist: ": "Додати до списку відтворення: ",
"Answer": "Відповідь",
"Search for videos": "Шукати відео",
"The Popular feed has been disabled by the administrator.": "Стрічка Популярні вимкнена адміністратором.",
"carousel_slide": "Слайд {{current}} з {{total}}",
"carousel_skip": "Пропустити карусель",
"carousel_go_to": "Перейти до слайда `x`",
"preferences_preload_label": "Попереднє завантаження відеоданих: ",
"Filipino (auto-generated)": "Філіппінська (згенеровано автоматично)",
"First page": "Перша сторінка",
"channel_tab_courses_label": "Курси",
"channel_tab_posts_label": "Дописи"
}
+214 -119
View File
@@ -1,62 +1,62 @@
{
"generic_videos_count_0": "{{count}} video",
"generic_subscribers_count_0": "{{count}} người theo dõi",
"generic_subscribers_count_0": "{{count}} người đăng ký",
"LIVE": "TRỰC TIẾP",
"Shared `x` ago": "Đã chia sẻ `x` trước",
"Unsubscribe": "Hủy theo dõi",
"Subscribe": "Theo dõi",
"Unsubscribe": "Hủy đăng ký",
"Subscribe": "Đăng ký",
"View channel on YouTube": "Xem kênh trên YouTube",
"View playlist on YouTube": "Xem danh sách phát trên YouTube",
"newest": "mới nhất",
"oldest": "lâu đời nhất",
"popular": "phổ biến",
"last": "Cuối cùng",
"newest": "Mới nhất",
"oldest": " nhất",
"popular": "Phổ biến",
"last": "cuối cùng",
"Next page": "Trang tiếp theo",
"Previous page": "Trang trước",
"Clear watch history?": "Xóa lịch sử xem?",
"New password": "Mật khẩu mới",
"New passwords must match": "Mật khẩu mới phải khớp",
"Authorize token?": "Cấp phép mã thông báo?",
"Authorize token for `x`?": "Cấp phép mã thông báo cho` x`?",
"Yes": "Đúng",
"Authorize token for `x`?": "Cấp phép mã thông báo cho `x`?",
"Yes": "",
"No": "Không",
"Import and Export Data": "Nhập và xuất dữ liệu",
"Import": "Nhập",
"Import Invidious data": "Nhập dữ liệu Invidious JSON",
"Import YouTube subscriptions": "Nhập dữ liệu thuê bao YouTube/OPML",
"Import FreeTube subscriptions (.db)": "Nhập đăng ký FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Nhập đăng ký NewPipe (.json)",
"Import NewPipe data (.zip)": "Nhập dữ liệu NewPipe (.zip)",
"Import Invidious data": "Nhập dữ liệu Invidious dưới dạng JSON",
"Import YouTube subscriptions": "Nhập các kênh đã đăng ký từ YouTube/OPML",
"Import FreeTube subscriptions (.db)": "Nhập các kênh đã đăng ký từ FreeTube (.db)",
"Import NewPipe subscriptions (.json)": "Nhập các kênh đã đăng ký từ NewPipe (.json)",
"Import NewPipe data (.zip)": "Nhập dữ liệu từ NewPipe (.zip)",
"Export": "Xuất",
"Export subscriptions as OPML": "Xuất đăng ký dưới dạng OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Xuất đăng ký dưới dạng OPML (cho NewPipe & FreeTube)",
"Export subscriptions as OPML": "Xuất các kênh đã đăng ký dưới dạng OPML",
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Xuất các kênh đã đăng ký dưới dạng OPML (cho NewPipe & FreeTube)",
"Export data as JSON": "Xuất dữ liệu Invidious dưới dạng JSON",
"Delete account?": "Xóa tài khoản?",
"History": "Lịch sử",
"An alternative front-end to YouTube": "Giao diện người dùng thay thế cho YouTube",
"An alternative front-end to YouTube": "Giao diện thay thế cho YouTube",
"JavaScript license information": "Thông tin giấy phép JavaScript",
"source": "nguồn",
"Log in": "Đăng nhập",
"Log in/register": "Đăng nhập / đăng ký",
"User ID": "Tên người dùng",
"User ID": "Mã nhận dạng người dùng",
"Password": "Mật khẩu",
"Time (h:mm:ss):": "Thời gian (h: mm: ss):",
"Text CAPTCHA": "Nhắn tin tới CAPTCHA",
"Image CAPTCHA": "Hình ảnh CAPTCHA",
"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",
"Register": "Đăng ký",
"E-mail": "E-mail",
"Preferences": "Sở thích",
"Preferences": "Cài đặt",
"preferences_category_player": "Tùy chọn trình phát video",
"preferences_video_loop_label": "Luôn lặp lại: ",
"preferences_autoplay_label": "Tự chạy: ",
"preferences_autoplay_label": "Tự động phát: ",
"preferences_continue_label": "Phát kế tiếp theo mặc định: ",
"preferences_continue_autoplay_label": "Tự động phát video tiếp theo: ",
"preferences_listen_label": "Nghe theo mặc định: ",
"preferences_local_label": "Video proxy: ",
"preferences_local_label": "Máy chủ sử lý video: ",
"preferences_speed_label": "Tốc độ mặc định: ",
"preferences_quality_label": "Chất lượng video ưa thích: ",
"preferences_volume_label": "Âm lượng trình phát video: ",
"preferences_quality_label": "Chất lượng video: ",
"preferences_volume_label": "Âm lượng video: ",
"preferences_comments_label": "Nhận xét mặc định: ",
"youtube": "YouTube",
"reddit": "Reddit",
@@ -64,7 +64,7 @@
"Fallback captions: ": "Phụ đề dự phòng: ",
"preferences_related_videos_label": "Hiển thị các video có liên quan: ",
"preferences_annotations_label": "Hiển thị chú thích theo mặc định: ",
"preferences_extend_desc_label": "Tự động mở rộng mô tả video: ",
"preferences_extend_desc_label": "Tự động mở rộng phần mô tả của video: ",
"preferences_vr_mode_label": "Video 360 độ tương tác (yêu cầu WebGL): ",
"preferences_category_visual": "Tùy chọn hình ảnh",
"preferences_player_style_label": "Phong cách trình phát: ",
@@ -82,24 +82,24 @@
"preferences_sort_label": "Sắp xếp video theo: ",
"published": "được phát hành",
"published - reverse": "đã xuất bản - đảo ngược",
"alphabetically": "theo thứ tự bảng chữ cái",
"alphabetically - reverse": "theo thứ tự bảng chữ cái - đảo ngược",
"channel name": "Tên kênh",
"channel name - reverse": "tên kênh - đảo ngược",
"alphabetically": "Thứ tự (A - Z)",
"alphabetically - reverse": "Thứ tự (Z - A)",
"channel name": "Tên kênh (A - Z)",
"channel name - reverse": "Tên kênh (Z - A)",
"Only show latest video from channel: ": "Chỉ hiển thị video mới nhất từ kênh: ",
"Only show latest unwatched video from channel: ": "Chỉ hiển thị video chưa xem mới nhất từ kênh: ",
"preferences_unseen_only_label": "Chỉ hiển thị chưa xem: ",
"preferences_unseen_only_label": "Chỉ hiển thị các video chưa từng xem: ",
"preferences_notifications_only_label": "Chỉ hiển thị thông báo (nếu có): ",
"Enable web notifications": "Bật thông báo web",
"`x` uploaded a video": "` x` đã tải lên một video",
"`x` is live": "` x` đang phát trực tiếp",
"`x` uploaded a video": "`x` đã tải lên một video",
"`x` is live": "`x` đang phát trực tiếp",
"preferences_category_data": "Tùy chọn dữ liệu",
"Clear watch history": "Xóa lịch sử xem",
"Import/export data": "Nhập / xuất dữ liệu",
"Change password": "Đổi mật khẩu",
"Manage subscriptions": "Quản lý các mục đăng kí",
"Manage tokens": "Quản lý mã thông báo",
"Watch history": "Lịch sử xem",
"Watch history": "Xem lịch sử",
"Delete account": "Xóa tài khoản",
"preferences_category_admin": "Tùy chọn quản trị viên",
"preferences_default_home_label": "Trang chủ mặc định: ",
@@ -121,7 +121,7 @@
"View privacy policy.": "Xem chính sách bảo mật.",
"Trending": "Xu hướng",
"Public": "Công khai",
"Unlisted": "Không hiển thị",
"Unlisted": "Không công khai",
"Private": "Riêng tư",
"View all playlists": "Xem tất cả danh sách phát",
"Updated `x` ago": "Đã cập nhật` x` trước",
@@ -131,24 +131,24 @@
"Title": "Tiêu đề",
"Playlist privacy": "Bảo mật danh sách phát",
"Editing playlist `x`": "Chỉnh sửa danh sách phát` x`",
"Show more": "Cho xem nhiều hơn",
"Show less": "Hiện ít hơn",
"Show more": "Hiển thị thêm",
"Show less": "Hiển thị ít hơn",
"Watch on YouTube": "Xem trên YouTube",
"Switch Invidious Instance": "Chuyển phiên bản Invidious",
"Hide annotations": "Ẩn chú thích",
"Show annotations": "Hiển thị chú thích",
"Genre: ": "Thể loại: ",
"License: ": "Giấy phép: ",
"Family friendly? ": "Gia đình thân thiện? ",
"Family friendly? ": "Thân thiện với gia đình? ",
"Wilson score: ": "Điểm số Wilson: ",
"Engagement: ": "Hôn ước: ",
"Whitelisted regions: ": "Các vùng nằm trong danh sách trắng: ",
"Blacklisted regions: ": "Khu vực nằm trong danh sách đen: ",
"Blacklisted regions: ": "Các vùng nằm trong danh sách đen: ",
"Shared `x`": "Chia sẻ` x`",
"View Reddit comments": "Xem nhận xét trên Reddit",
"Hide replies": "Ẩn câu trả lời",
"Show replies": "Hiển thị câu trả lời",
"Incorrect password": "Mật khẩu không đúng",
"View Reddit comments": "Xem bình luận trên Reddit",
"Hide replies": "Ẩn phản hồi",
"Show replies": "Hiển thị phản hồi",
"Incorrect password": "Mật khẩu không chính xác",
"Wrong answer": "Câu trả lời sai",
"Erroneous CAPTCHA": "CAPTCHA bị lỗi",
"CAPTCHA is a required field": "CAPTCHA là trường bắt buộc",
@@ -190,35 +190,35 @@
"Bulgarian": "Tiếng Bungari",
"Burmese": "Tiếng Miến Điện",
"Catalan": "Tiếng Catalan",
"Cebuano": "Cebuano",
"Cebuano": "Tiếng Cebu",
"Chinese (Simplified)": "Tiếng Trung (Giản thể)",
"Chinese (Traditional)": "Tiếng Trung (Phồn thể)",
"Corsican": "Corsican",
"Corsican": "Tiếng Corse",
"Croatian": "Tiếng Croatia",
"Czech": "Tiếng Séc",
"Danish": "Người Đan Mạch",
"Danish": "Tiếng Đan Mạch",
"Dutch": "Tiếng Hà Lan",
"Esperanto": "Quốc tế ngữ",
"Estonian": "Tiếng Estonia",
"Filipino": "Filipino",
"Filipino": "Tiếng Philippines",
"Finnish": "Tiếng Phần Lan",
"French": "Người Pháp",
"French": "Tiếng Pháp",
"Galician": "Tiếng Galicia",
"Georgian": "Tiếng Georgia",
"German": "Tiếng Đức",
"Greek": "Người Hy Lạp",
"Gujarati": "Gujarati",
"Haitian Creole": "Tiếng Creole của Haiti",
"Hausa": "Hausa",
"Greek": "Tiếng Hy Lạp",
"Gujarati": "Tiếng Gujarat",
"Haitian Creole": "Tiếng Creole (Haiti)",
"Hausa": "Tiếng Hausa",
"Hawaiian": "Tiếng Hawaii",
"Hebrew": "Tiếng Do Thái",
"Hindi": "Tiếng Hindi",
"Hmong": "Hmong",
"Hungarian": "Người Hungary",
"Hmong": "Tiếng Hmong",
"Hungarian": "Tiếng Hungary",
"Icelandic": "Tiếng Iceland",
"Igbo": "Igbo",
"Igbo": "Tiếng Igbo",
"Indonesian": "Tiếng Indonesia",
"Irish": "Tiếng Ailen",
"Irish": "Tiếng Ireland",
"Italian": "Tiếng Ý",
"Japanese": "Tiếng Nhật",
"Javanese": "Tiếng Java",
@@ -237,37 +237,37 @@
"Malagasy": "Tiếng Malagasy",
"Malay": "Tiếng Mã Lai",
"Malayalam": "Tiếng Malayalam",
"Maltese": "Cây nho",
"Maltese": "Tiếng Malta",
"Maori": "Tiếng Maori",
"Marathi": "Marathi",
"Marathi": "Tiếng Marathi",
"Mongolian": "Tiếng Mông Cổ",
"Nepali": "Tiếng Nepal",
"Norwegian Bokmål": "Tiếng Na Uy Bokmål",
"Nyanja": "Nyanja",
"Pashto": "Pashto",
"Norwegian Bokmål": "Tiếng Na Uy (Bokmål)",
"Nyanja": "Tiếng Chewa / Nyanja",
"Pashto": "Tiếng Pashtun",
"Persian": "Tiếng Ba Tư",
"Polish": "Đánh bóng",
"Polish": "Tiếng Ba Lan",
"Portuguese": "Tiếng Bồ Đào Nha",
"Punjabi": "Punjabi",
"Punjabi": "Tiếng Punjab",
"Romanian": "Tiếng Rumani",
"Russian": "Tiếng Nga",
"Samoan": "Samoan",
"Scottish Gaelic": "Tiếng Gaelic Scotland",
"Samoan": "Tiếng Samoa",
"Scottish Gaelic": "Tiếng Gaelic (Scotland)",
"Serbian": "Tiếng Serbia",
"Shona": "Shona",
"Sindhi": "Sindhi",
"Sinhala": "Sinhala",
"Shona": "Tiếng Shona",
"Sindhi": "Tiếng Sindh",
"Sinhala": "Tiếng Sinhala",
"Slovak": "Tiếng Slovak",
"Slovenian": "Tiếng Slovenia",
"Somali": "Tiếng Somali",
"Southern Sotho": "Southern Sotho",
"Spanish": "Người Tây Ban Nha",
"Spanish": "Tiếng Tây Ban Nha",
"Spanish (Latin America)": "Tiếng Tây Ban Nha (Mỹ Latinh)",
"Sundanese": "Tiếng Sundan",
"Swahili": "Tiếng Swahili",
"Swedish": "Tiếng Thụy Điển",
"Tajik": "Tajik",
"Tamil": "Tamil",
"Tajik": "Tiếng Tajik",
"Tamil": "Tiếng Tamil",
"Telugu": "Tiếng Telugu",
"Thai": "Tiếng Thái",
"Turkish": "Tiếng Thổ Nhĩ Kỳ",
@@ -275,17 +275,17 @@
"Urdu": "Tiếng Urdu",
"Uzbek": "Tiếng Uzbek",
"Vietnamese": "Tiếng Việt",
"Welsh": "Người xứ Wales",
"Western Frisian": "Western Frisian",
"Xhosa": "Xhosa",
"Yiddish": "Yiddish",
"Yoruba": "Yoruba",
"Welsh": "Tiếng Wales",
"Western Frisian": "Tiếng Tây Frisia",
"Xhosa": "Tiếng Nam Phi",
"Yiddish": "Tiếng Yiddish",
"Yoruba": "Tiếng Yoruba",
"Zulu": "Tiếng Zulu",
"Fallback comments: ": "Nhận xét dự phòng: ",
"Popular": "Phổ biến",
"Search": "Tìm kiếm",
"Top": "Hàng đầu",
"About": "Trong khoảng",
"About": "Giới thiệu",
"Rating: ": "Xếp hạng: ",
"preferences_locale_label": "Ngôn ngữ: ",
"View as playlist": "Xem dưới dạng danh sách phát",
@@ -295,45 +295,45 @@
"News": "Tin tức",
"Movies": "Phim",
"Download": "Tải xuống",
"Download as: ": "Tải tệp dưới dạng: ",
"Download as: ": "Tải xuống dưới dạng: ",
"%A %B %-d, %Y": "% A% B% -d,% Y",
"(edited)": "(đã chỉnh sửa)",
"YouTube comment permalink": "Liên kết cố định nhận xét trên YouTube",
"permalink": "liên kết cố định",
"`x` marked it with a ❤": "` x` đã đánh dấu nó bằng một ❤",
"Audio mode": "Chế độ âm thanh",
"Video mode": "Chế độ quay",
"Audio mode": "Chế độ audio",
"Video mode": "Chế độ video",
"channel_tab_videos_label": "Video",
"Playlists": "Danh sách phát",
"channel_tab_community_label": "Cộng đồng",
"search_filters_sort_option_relevance": "liên quan",
"search_filters_sort_option_relevance": "Liên quan",
"search_filters_sort_option_rating": "Xếp hạng",
"search_filters_sort_option_date": "ngày",
"search_filters_sort_option_views": "lượt xem",
"search_filters_type_label": "content_type",
"search_filters_duration_label": "thời lượng",
"search_filters_features_label": "đặc trưng",
"search_filters_sort_label": "sắp xếp",
"search_filters_date_option_hour": "giờ",
"search_filters_date_option_today": "hôm nay",
"search_filters_date_option_week": "tuần",
"search_filters_date_option_month": "tháng",
"search_filters_date_option_year": "năm",
"search_filters_sort_option_date": "Ngày tải lên",
"search_filters_sort_option_views": "Lượt xem",
"search_filters_type_label": "Thể loại",
"search_filters_duration_label": "Thời lượng",
"search_filters_features_label": "Đặc điểm",
"search_filters_sort_label": "Sắp xếp theo",
"search_filters_date_option_hour": "Một giờ trước",
"search_filters_date_option_today": "Hôm nay",
"search_filters_date_option_week": "Tuần này",
"search_filters_date_option_month": "Tháng này",
"search_filters_date_option_year": "Năm nay",
"search_filters_type_option_video": "video",
"search_filters_type_option_channel": "kênh",
"search_filters_type_option_playlist": "danh sách phát",
"search_filters_type_option_movie": "bộ phim",
"search_filters_type_option_show": "chỉ",
"search_filters_features_option_hd": "hd",
"search_filters_features_option_subtitles": "phụ đề",
"search_filters_features_option_c_commons": "Commons sáng tạo",
"search_filters_features_option_three_d": "3d",
"search_filters_features_option_live": "trực tiếp",
"search_filters_features_option_four_k": "4k",
"search_filters_features_option_location": "vị trí",
"search_filters_features_option_hdr": "hdr",
"search_filters_type_option_channel": "Kênh",
"search_filters_type_option_playlist": "Danh sách phát",
"search_filters_type_option_movie": "Phim",
"search_filters_type_option_show": "Hiện",
"search_filters_features_option_hd": "HD",
"search_filters_features_option_subtitles": "Phụ đề",
"search_filters_features_option_c_commons": "Giấy phép Creative Commons",
"search_filters_features_option_three_d": "3D",
"search_filters_features_option_live": "Trực tiếp",
"search_filters_features_option_four_k": "4K",
"search_filters_features_option_location": "Vị trí",
"search_filters_features_option_hdr": "HDR",
"Current version: ": "Phiên bản hiện tại: ",
"search_filters_title": "bộ lọc",
"search_filters_title": "Bộ lọc",
"generic_playlists_count": "{{count}} danh sách phát",
"generic_views_count": "{{count}} lượt xem",
"View `x` comments": {
@@ -341,40 +341,40 @@
"([^.,0-9]|^)1([^.,0-9]|$)": "Hiển thị `x`bình luận"
},
"Song: ": "Ca khúc: ",
"Premieres in `x`": "Trình chiếu lần đầu vào `x`",
"preferences_quality_dash_option_worst": "Thấp nhất",
"Premieres in `x`": "Trình chiếu `x`",
"preferences_quality_dash_option_worst": "T nhất",
"preferences_watch_history_label": "Bật lịch sử video đã xem ",
"preferences_quality_option_hd720": "HD720",
"unsubscribe": "hủy đăng kí",
"revoke": "gỡ bỏ",
"preferences_quality_dash_label": "Chất lượng video DASH ưa thích ",
"preferences_quality_dash_label": "Chất lượng video DASH ",
"preferences_quality_dash_option_auto": "Tự động",
"Subscriptions": "Thuê bao",
"View YouTube comments": "Hiển thị bình luận trên YouTube",
"View YouTube comments": "Hiển thị bình luận t YouTube",
"View more comments on Reddit": "Hiển thị thêm bình luận từ Reddit",
"Music in this video": "Nhạc trong video này",
"Artist: ": "Nghệ sĩ: ",
"Premieres `x`": "Phát lần đầu `x`",
"preferences_region_label": "Nội dung theo quốc gia ",
"search_message_change_filters_or_query": "Thử mở rộng nội dung tìm kiếm hoặc thay đổi bộ lọc.",
"preferences_quality_option_small": "Nhỏ",
"preferences_quality_option_small": "Thấp",
"preferences_quality_dash_option_144p": "144p",
"invidious": "Invidious",
"preferences_quality_dash_option_240p": "240p",
"Import/export": "Xuất/nhập dữ liệu",
"preferences_quality_dash_option_4320p": "4320p",
"Import/export": "Nhập/Xuất",
"preferences_quality_dash_option_4320p": "4320p (8K)",
"preferences_quality_option_dash": "DASH (tự tối ưu chất lượng)",
"generic_subscriptions_count_0": "{{count}} người đăng kí",
"preferences_quality_dash_option_1440p": "1440p",
"preferences_quality_dash_option_1440p": "1440p (2K)",
"preferences_quality_dash_option_480p": "480p",
"preferences_quality_dash_option_2160p": "2160p",
"preferences_quality_dash_option_2160p": "2160p (4K)",
"search_message_no_results": "Tìm kiếm không có kết quả.",
"preferences_quality_dash_option_1080p": "1080p",
"preferences_quality_dash_option_720p": "720p",
"preferences_quality_option_medium": "Trung bình",
"Load more": "Hiển thị thêm",
"Load more": "Tải thêm",
"comments_points_count_0": "{{count}} điểm",
"Import YouTube playlist (.csv)": "Nhập danh sách phát YouTube (.csv)",
"Import YouTube playlist (.csv)": "Nhập các danh sách phát từ YouTube (.csv)",
"preferences_quality_dash_option_best": "Tốt nhất",
"preferences_quality_dash_option_360p": "360p",
"subscriptions_unseen_notifs_count_0": "{{count}} thông báo chưa đọc",
@@ -382,10 +382,105 @@
"search_message_use_another_instance": " Bạn cũng có thể tìm kiếm <a href=\"`x`\"> ở một phiên bản khác</a>.",
"Standard YouTube license": "Giấy phép YouTube thông thường",
"Album: ": "Album: ",
"preferences_save_player_pos_label": "Lưu vị trí xem cuối cùng ",
"preferences_save_player_pos_label": "Lưu vị trí xem: ",
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Xin chào! Có vẻ như bạn đã tắt JavaScript. Bấm vào đây để xem bình luận, lưu ý rằng thời gian tải có thể lâu hơn.",
"Chinese (China)": "Tiếng Trung (Trung Quốc)",
"generic_button_cancel": "Hủy",
"Chinese": "Tiếng Trung",
"generic_button_delete": "Xóa"
"generic_button_delete": "Xóa",
"Korean (auto-generated)": "Tiếng Hàn (được tạo tự động)",
"search_filters_features_option_three_sixty": "360°",
"channel_tab_podcasts_label": "Podcast",
"Spanish (Mexico)": "Tiếng Tây Ban Nha (Mexico)",
"search_filters_apply_button": "Áp dụng các mục đã chọn",
"Download is disabled": "Tải xuống đã bị vô hiệu hóa.",
"next_steps_error_message_go_to_youtube": "Đi đến YouTube",
"German (auto-generated)": "Tiếng Đức (được tạo tự động)",
"Japanese (auto-generated)": "Tiếng Nhật (được tạo tự động)",
"footer_donate_page": "Ủng hộ",
"crash_page_before_reporting": "Trước khi báo cáo lỗi, hãy chắc chắn rằng bạn đã:",
"Channel Sponsor": "Nhà tài trợ của kênh",
"videoinfo_started_streaming_x_ago": "Đã bắt đầu phát sóng `x` trước",
"videoinfo_youTube_embed_link": "Nhúng",
"channel_tab_streams_label": "Phát trực tiếp",
"playlist_button_add_items": "Thêm video",
"generic_count_minutes_0": "{{count}} phút",
"user_saved_playlists": "`x` danh sách phát đã lưu",
"Spanish (Spain)": "Tiếng Tây Ban Nha (Tây Ban Nha)",
"crash_page_refresh": "Đã thử <a href=\"`x`\">tải lại trang</a>",
"Chinese (Hong Kong)": "Tiếng Trung (Hồng Kông)",
"generic_count_months_0": "{{count}} tháng",
"download_subtitles": "Phụ đề - `x` (.vtt)",
"generic_button_save": "Lưu",
"crash_page_search_issue": "Tìm <a href=\"`x`\">lỗi có sẵn trên GitHub</a>",
"none": "không",
"English (United States)": "Tiếng Anh (Mỹ)",
"next_steps_error_message_refresh": "Tải lại",
"Video unavailable": "Video không có sẵn",
"footer_source_code": "Mã nguồn",
"search_filters_duration_option_short": "Ngắn (< 4 phút)",
"search_filters_duration_option_long": "Dài (> 20 phút)",
"tokens_count_0": "{{count}} mã thông báo",
"Italian (auto-generated)": "Tiếng Ý (được tạo tự động)",
"channel_tab_shorts_label": "Shorts",
"channel_tab_releases_label": "Mới tải lên",
"`x` ago": "`x` trước",
"Interlingue": "Tiếng Khoa học Quốc tế",
"generic_channels_count_0": "{{count}} kênh",
"Chinese (Taiwan)": "Tiếng Trung (Đài Loan)",
"adminprefs_modified_source_code_url_label": "URL tới kho lưu trữ mã nguồn đã sửa đổi",
"Turkish (auto-generated)": "Tiếng Thổ Nhĩ Kỳ (được tạo tự động)",
"Indonesian (auto-generated)": "Tiếng Indonesia (được tạo tự động)",
"Portuguese (auto-generated)": "Tiếng Bồ Đào Nha (được tạo tự động)",
"generic_count_years_0": "{{count}} năm",
"videoinfo_invidious_embed_link": "Liên kết nhúng",
"Popular enabled: ": "Đã bật phổ biến: ",
"Spanish (auto-generated)": "Tiếng Tây Ban Nha (được tạo tự động)",
"English (United Kingdom)": "Tiếng Anh Anh",
"channel_tab_playlists_label": "Danh sách phát",
"generic_button_edit": "Sửa",
"search_filters_features_option_purchased": "Đã mua",
"search_filters_date_option_none": "Mọi thời điểm",
"Cantonese (Hong Kong)": "Tiếng Quảng Châu (Hồng Kông)",
"crash_page_report_issue": "Nếu các điều trên không giúp được, xin hãy <a href=\"`x`\">tạo vấn đề mới trên GitHub</a> (ưu tiên tiếng Anh) và đính kèm đoạn chữ sau trong nội dung (giữ nguyên KHÔNG dịch):",
"crash_page_switch_instance": "Đã thử <a href=\"`x`\">dùng một phiên bản khác</a>",
"generic_count_weeks_0": "{{count}} tuần",
"videoinfo_watch_on_youTube": "Xem trên YouTube",
"footer_modfied_source_code": "Mã nguồn đã chỉnh sửa",
"generic_button_rss": "RSS",
"generic_count_hours_0": "{{count}} giờ",
"French (auto-generated)": "Tiếng Pháp (được tạo tự động)",
"crash_page_read_the_faq": "Đọc <a href=\"`x`\">Hỏi đáp thường gặp (FAQ)</a>",
"user_created_playlists": "`x` danh sách phát đã tạo",
"channel_tab_channels_label": "Kênh",
"search_filters_type_option_all": "Mọi thể loại",
"Russian (auto-generated)": "Tiếng Nga (được tạo tự động)",
"comments_view_x_replies_0": "Xem {{count}} lượt trả lời",
"footer_original_source_code": "Mã nguồn gốc",
"Portuguese (Brazil)": "Tiếng Bồ Đào Nha (Brazil)",
"search_filters_features_option_vr180": "VR180",
"error_video_not_in_playlist": "Video không tồn tại trong danh sách phát. <a href=\"`x`\">Bấm để trở về trang chủ của danh sách phát.</a>",
"Dutch (auto-generated)": "Tiếng Hà Lan (được tạo tự động)",
"generic_count_days_0": "{{count}} ngày",
"Vietnamese (auto-generated)": "Tiếng Việt (được tạo tự động)",
"search_filters_duration_option_none": "Mọi thời lượng",
"footer_documentation": "Tài liệu",
"next_steps_error_message": "Bạn có thể thử: ",
"Import YouTube watch history (.json)": "Nhập lịch sử xem từ YouTube (.json)",
"search_filters_duration_option_medium": "Trung bình (4 - 20 phút)",
"generic_count_seconds_0": "{{count}} giây",
"search_filters_date_label": "Ngày tải lên",
"crash_page_you_found_a_bug": "Có vẻ như bạn đã tìm ra lỗi trong Indivious!",
"Add to playlist": "Thêm vào danh sách phát",
"Add to playlist: ": "Thêm vào danh sách phát: ",
"Answer": "Trả lời",
"toggle_theme": "Bật/tắt diện mạo",
"carousel_slide": "Trang {{current}} trên tổng {{total}} trang",
"carousel_skip": "Bỏ qua Carousel",
"carousel_go_to": "Đi tới trang `x`",
"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ý.",
"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"
}
+18 -4
View File
@@ -26,7 +26,7 @@
"Import and Export Data": "导入与导出数据",
"Import": "导入",
"Import Invidious data": "导入 Invidious JSON 数据",
"Import YouTube subscriptions": "导入 YouTube/OPML 订阅",
"Import YouTube subscriptions": "导入 YouTube CSV 或 OPML 订阅",
"Import FreeTube subscriptions (.db)": "导入 FreeTube 订阅 (.db)",
"Import NewPipe subscriptions (.json)": "导入 NewPipe 订阅 (.json)",
"Import NewPipe data (.zip)": "导入 NewPipe 数据 (.zip)",
@@ -420,7 +420,7 @@
"Chinese": "中文",
"Chinese (China)": "中文 (中国)",
"Chinese (Hong Kong)": "中文 (中国香港)",
"Chinese (Taiwan)": "中文 (中国台湾)",
"Chinese (Taiwan)": "中文 (台湾)",
"German (auto-generated)": "德语 (自动生成)",
"Indonesian (auto-generated)": "印尼语 (自动生成)",
"Interlingue": "国际语",
@@ -436,7 +436,7 @@
"Turkish (auto-generated)": "土耳其语 (自动生成)",
"Spanish (Spain)": "西班牙语 (西班牙)",
"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_date_label": "上传日期",
"search_filters_apply_button": "应用所选过滤器",
@@ -470,5 +470,19 @@
"generic_button_save": "保存",
"generic_button_rss": "RSS",
"channel_tab_releases_label": "公告",
"generic_channels_count_0": "{{count}} 个频道"
"generic_channels_count_0": "{{count}} 个频道",
"toggle_theme": "切换主题",
"Add to playlist": "添加到播放列表",
"Add to playlist: ": "添加到播放列表: ",
"Answer": "响应",
"Search for videos": "搜索视频",
"The Popular feed has been disabled by the administrator.": "“流行”源已被管理员禁用。",
"carousel_slide": "当前为第 {{current}} 张图,共 {{total}} 张图",
"carousel_skip": "跳过图集",
"carousel_go_to": "转到图 `x`",
"preferences_preload_label": "预加载视频数据: ",
"Filipino (auto-generated)": "菲律宾语 (自动生成)",
"channel_tab_posts_label": "帖子",
"First page": "第一页",
"channel_tab_courses_label": "课程"
}
+19 -5
View File
@@ -26,7 +26,7 @@
"Import and Export Data": "匯入與匯出資料",
"Import": "匯入",
"Import Invidious data": "匯入 Invidious JSON 資料",
"Import YouTube subscriptions": "匯入 YouTube/OPML 訂閱",
"Import YouTube subscriptions": "匯入 YouTube CSV 或 OPML 訂閱",
"Import FreeTube subscriptions (.db)": "匯入 FreeTube 訂閱 (.db)",
"Import NewPipe subscriptions (.json)": "匯入 NewPipe 訂閱 (.json)",
"Import NewPipe data (.zip)": "匯入 NewPipe 資料 (.zip)",
@@ -338,13 +338,13 @@
"channel_tab_community_label": "社群",
"search_filters_sort_option_relevance": "關聯",
"search_filters_sort_option_rating": "評分",
"search_filters_sort_option_date": "日期",
"search_filters_sort_option_date": "上傳日期",
"search_filters_sort_option_views": "檢視",
"search_filters_type_label": "內容類型",
"search_filters_duration_label": "時長",
"search_filters_features_label": "特色",
"search_filters_sort_label": "排序",
"search_filters_date_option_hour": "小時",
"search_filters_date_option_hour": "最後一小時",
"search_filters_date_option_today": "今天",
"search_filters_date_option_week": "週",
"search_filters_date_option_month": "月",
@@ -442,7 +442,7 @@
"search_filters_duration_option_none": "任何時長",
"search_filters_duration_option_medium": "中等(4到20分鐘)",
"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_date_label": "上傳日期",
"search_filters_type_option_all": "任何類型",
@@ -470,5 +470,19 @@
"playlist_button_add_items": "新增影片",
"channel_tab_podcasts_label": "Podcast",
"channel_tab_releases_label": "發布",
"generic_channels_count_0": "{{count}} 個頻道"
"generic_channels_count_0": "{{count}} 個頻道",
"toggle_theme": "切換佈景主題",
"Add to playlist": "新增至播放清單",
"Add to playlist: ": "新增至播放清單: ",
"Answer": "答案",
"Search for videos": "搜尋影片",
"carousel_slide": "第 {{current}} 張投影片,共 {{total}} 張",
"carousel_skip": "略過輪播",
"carousel_go_to": "跳到投影片 `x`",
"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": "貼文"
}
+1 -1
Submodule mocks updated: 11ec372f72...b55d58dea9
+56
View File
@@ -0,0 +1,56 @@
# 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")
+12 -12
View File
@@ -2,7 +2,7 @@ version: 2.0
shards:
ameba:
git: https://github.com/crystal-ameba/ameba.git
version: 1.5.0
version: 1.6.1
athena-negotiation:
git: https://github.com/athena-framework/negotiation.git
@@ -10,27 +10,27 @@ shards:
backtracer:
git: https://github.com/sija/backtracer.cr.git
version: 1.2.1
version: 1.2.2
db:
git: https://github.com/crystal-lang/crystal-db.git
version: 0.10.1
version: 0.13.1
exception_page:
git: https://github.com/crystal-loot/exception_page.git
version: 0.2.2
version: 0.4.1
http_proxy:
git: https://github.com/mamantoha/http_proxy.git
version: 0.10.3
kemal:
git: https://github.com/kemalcr/kemal.git
version: 1.1.2
kilt:
git: https://github.com/jeromegn/kilt.git
version: 0.6.1
version: 1.6.0
pg:
git: https://github.com/will/crystal-pg.git
version: 0.24.0
version: 0.28.0
protodec:
git: https://github.com/iv-org/protodec.git
@@ -42,9 +42,9 @@ shards:
spectator:
git: https://github.com/icy-arctic-fox/spectator.git
version: 0.10.4
version: 0.10.6
sqlite3:
git: https://github.com/crystal-lang/crystal-sqlite3.git
version: 0.18.0
version: 0.21.0
+17 -14
View File
@@ -1,33 +1,32 @@
name: invidious
version: 0.20.1
version: 2.20250517.0-dev
authors:
- Omar Roth <omarroth@protonmail.com>
- Invidious team
- Invidious team <contact@invidious.io>
- Contributors!
targets:
invidious:
main: src/invidious.cr
description: |
Invidious is an alternative front-end to YouTube
dependencies:
pg:
github: will/crystal-pg
version: ~> 0.24.0
version: ~> 0.28.0
sqlite3:
github: crystal-lang/crystal-sqlite3
version: ~> 0.18.0
version: ~> 0.21.0
kemal:
github: kemalcr/kemal
version: ~> 1.1.2
kilt:
github: jeromegn/kilt
version: ~> 0.6.1
version: ~> 1.6.0
protodec:
github: iv-org/protodec
version: ~> 0.1.5
athena-negotiation:
github: athena-framework/negotiation
version: ~> 0.1.1
http_proxy:
github: mamantoha/http_proxy
version: ~> 0.10.3
development_dependencies:
spectator:
@@ -35,8 +34,12 @@ development_dependencies:
version: ~> 0.10.4
ameba:
github: crystal-ameba/ameba
version: ~> 1.5.0
version: ~> 1.6.1
crystal: ">= 1.0.0, < 2.0.0"
crystal: ">= 1.10.0, < 2.0.0"
license: AGPLv3
repository: https://github.com/iv-org/invidious
homepage: https://invidious.io
documentation: https://docs.invidious.io
+44 -21
View File
@@ -1,34 +1,27 @@
require "../../spec_helper.cr"
MockLines = [
{
"start_time": Time::Span.new(seconds: 1),
"end_time": Time::Span.new(seconds: 2),
"text": "Line 1",
},
{
"start_time": Time::Span.new(seconds: 2),
"end_time": Time::Span.new(seconds: 3),
"text": "Line 2",
},
]
MockLines = ["Line 1", "Line 2"]
MockLinesWithEscapableCharacter = ["<Line 1>", "&Line 2>", '\u200E' + "Line\u200F 3", "\u00A0Line 4"]
Spectator.describe "WebVTT::Builder" do
it "correctly builds a vtt file" do
result = WebVTT.build do |vtt|
MockLines.each do |line|
vtt.cue(line["start_time"], line["end_time"], line["text"])
2.times do |i|
vtt.cue(
Time::Span.new(seconds: i),
Time::Span.new(seconds: i + 1),
MockLines[i]
)
end
end
expect(result).to eq([
"WEBVTT",
"",
"00:00:01.000 --> 00:00:02.000",
"00:00:00.000 --> 00:00:01.000",
"Line 1",
"",
"00:00:02.000 --> 00:00:03.000",
"00:00:01.000 --> 00:00:02.000",
"Line 2",
"",
"",
@@ -42,8 +35,12 @@ Spectator.describe "WebVTT::Builder" do
}
result = WebVTT.build(setting_fields) do |vtt|
MockLines.each do |line|
vtt.cue(line["start_time"], line["end_time"], line["text"])
2.times do |i|
vtt.cue(
Time::Span.new(seconds: i),
Time::Span.new(seconds: i + 1),
MockLines[i]
)
end
end
@@ -52,13 +49,39 @@ Spectator.describe "WebVTT::Builder" do
"Kind: captions",
"Language: en",
"",
"00:00:01.000 --> 00:00:02.000",
"00:00:00.000 --> 00:00:01.000",
"Line 1",
"",
"00:00:02.000 --> 00:00:03.000",
"00:00:01.000 --> 00:00:02.000",
"Line 2",
"",
"",
].join('\n'))
end
it "properly escapes characters" do
result = WebVTT.build do |vtt|
4.times do |i|
vtt.cue(Time::Span.new(seconds: i), Time::Span.new(seconds: i + 1), MockLinesWithEscapableCharacter[i])
end
end
expect(result).to eq([
"WEBVTT",
"",
"00:00:00.000 --> 00:00:01.000",
"&lt;Line 1&gt;",
"",
"00:00:01.000 --> 00:00:02.000",
"&amp;Line 2&gt;",
"",
"00:00:02.000 --> 00:00:03.000",
"&lrm;Line&rlm; 3",
"",
"00:00:03.000 --> 00:00:04.000",
"&nbsp;Line 4",
"",
"",
].join('\n'))
end
end
+7 -6
View File
@@ -17,7 +17,7 @@ FORM_TESTS = {
"cy" => I18next::Plurals::PluralForms::Special_Welsh,
"fr" => I18next::Plurals::PluralForms::Special_French_Portuguese,
"en" => I18next::Plurals::PluralForms::Single_not_one,
"es" => I18next::Plurals::PluralForms::Single_not_one,
"es" => I18next::Plurals::PluralForms::Special_Spanish_Italian,
"ga" => I18next::Plurals::PluralForms::Special_Irish,
"gd" => I18next::Plurals::PluralForms::Special_Scottish_Gaelic,
"he" => I18next::Plurals::PluralForms::Special_Hebrew,
@@ -33,7 +33,8 @@ FORM_TESTS = {
"mt" => I18next::Plurals::PluralForms::Special_Maltese,
"or" => I18next::Plurals::PluralForms::Special_Odia,
"pl" => I18next::Plurals::PluralForms::Special_Polish_Kashubian,
"pt" => I18next::Plurals::PluralForms::Single_gt_one,
"pt" => I18next::Plurals::PluralForms::Special_French_Portuguese,
"pt-PT" => I18next::Plurals::PluralForms::Single_gt_one,
"pt-BR" => I18next::Plurals::PluralForms::Special_French_Portuguese,
"ro" => I18next::Plurals::PluralForms::Special_Romanian,
"sk" => I18next::Plurals::PluralForms::Special_Czech_Slovak,
@@ -77,10 +78,10 @@ SUFFIX_TESTS = {
{num: 10, suffix: "_plural"},
],
"es" => [
{num: 0, suffix: "_plural"},
{num: 1, suffix: ""},
{num: 10, suffix: "_plural"},
{num: 6_000_000, suffix: "_plural"},
{num: 0, suffix: "_2"},
{num: 1, suffix: "_0"},
{num: 10, suffix: "_2"},
{num: 6_000_000, suffix: "_1"},
],
"fr" => [
{num: 0, suffix: "_0"},
+8 -8
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.views).to eq(40_504_893)
expect(video_11.live_now).to be_false
expect(video_11.premium).to be_false
expect(video_11.badges.live_now?).to be_false
expect(video_11.badges.premium?).to be_false
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.views).to eq(30_790_049)
expect(video_35.live_now).to be_false
expect(video_35.premium).to be_false
expect(video_35.badges.live_now?).to be_false
expect(video_35.badges.premium?).to be_false
expect(video_35.premiere_timestamp).to be_nil
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.views).to eq(63_240)
expect(video_41.live_now).to be_false
expect(video_41.premium).to be_false
expect(video_41.badges.live_now?).to be_false
expect(video_41.badges.premium?).to be_false
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.views).to eq(68_704)
expect(video_48.live_now).to be_false
expect(video_48.premium).to be_false
expect(video_48.badges.live_now?).to be_false
expect(video_48.badges.premium?).to be_false
expect(video_48.premiere_timestamp).to be_nil
end
end
-1
View File
@@ -301,7 +301,6 @@ Spectator.describe Invidious::Search::Filters do
it "Encodes features filter (single)" do
Invidious::Search::Filters::Features.each do |value|
string = described_class.format_features(value)
filters = described_class.new(features: value)
expect("#{filters.to_iv_params}")
+27 -27
View File
@@ -12,45 +12,45 @@ end
# page of Youtube with any browser devtools HTML inspector.
DATE_FILTERS = {
Invidious::Search::Filters::Date::Hour => "EgIIAQ%3D%3D",
Invidious::Search::Filters::Date::Today => "EgIIAg%3D%3D",
Invidious::Search::Filters::Date::Week => "EgIIAw%3D%3D",
Invidious::Search::Filters::Date::Month => "EgIIBA%3D%3D",
Invidious::Search::Filters::Date::Year => "EgIIBQ%3D%3D",
Invidious::Search::Filters::Date::Hour => "EgIIAfABAQ%3D%3D",
Invidious::Search::Filters::Date::Today => "EgIIAvABAQ%3D%3D",
Invidious::Search::Filters::Date::Week => "EgIIA_ABAQ%3D%3D",
Invidious::Search::Filters::Date::Month => "EgIIBPABAQ%3D%3D",
Invidious::Search::Filters::Date::Year => "EgIIBfABAQ%3D%3D",
}
TYPE_FILTERS = {
Invidious::Search::Filters::Type::Video => "EgIQAQ%3D%3D",
Invidious::Search::Filters::Type::Channel => "EgIQAg%3D%3D",
Invidious::Search::Filters::Type::Playlist => "EgIQAw%3D%3D",
Invidious::Search::Filters::Type::Movie => "EgIQBA%3D%3D",
Invidious::Search::Filters::Type::Video => "EgIQAfABAQ%3D%3D",
Invidious::Search::Filters::Type::Channel => "EgIQAvABAQ%3D%3D",
Invidious::Search::Filters::Type::Playlist => "EgIQA_ABAQ%3D%3D",
Invidious::Search::Filters::Type::Movie => "EgIQBPABAQ%3D%3D",
}
DURATION_FILTERS = {
Invidious::Search::Filters::Duration::Short => "EgIYAQ%3D%3D",
Invidious::Search::Filters::Duration::Medium => "EgIYAw%3D%3D",
Invidious::Search::Filters::Duration::Long => "EgIYAg%3D%3D",
Invidious::Search::Filters::Duration::Short => "EgIYAfABAQ%3D%3D",
Invidious::Search::Filters::Duration::Medium => "EgIYA_ABAQ%3D%3D",
Invidious::Search::Filters::Duration::Long => "EgIYAvABAQ%3D%3D",
}
FEATURE_FILTERS = {
Invidious::Search::Filters::Features::Live => "EgJAAQ%3D%3D",
Invidious::Search::Filters::Features::FourK => "EgJwAQ%3D%3D",
Invidious::Search::Filters::Features::HD => "EgIgAQ%3D%3D",
Invidious::Search::Filters::Features::Subtitles => "EgIoAQ%3D%3D",
Invidious::Search::Filters::Features::CCommons => "EgIwAQ%3D%3D",
Invidious::Search::Filters::Features::ThreeSixty => "EgJ4AQ%3D%3D",
Invidious::Search::Filters::Features::VR180 => "EgPQAQE%3D",
Invidious::Search::Filters::Features::ThreeD => "EgI4AQ%3D%3D",
Invidious::Search::Filters::Features::HDR => "EgPIAQE%3D",
Invidious::Search::Filters::Features::Location => "EgO4AQE%3D",
Invidious::Search::Filters::Features::Purchased => "EgJIAQ%3D%3D",
Invidious::Search::Filters::Features::Live => "EgJAAfABAQ%3D%3D",
Invidious::Search::Filters::Features::FourK => "EgJwAfABAQ%3D%3D",
Invidious::Search::Filters::Features::HD => "EgIgAfABAQ%3D%3D",
Invidious::Search::Filters::Features::Subtitles => "EgIoAfABAQ%3D%3D",
Invidious::Search::Filters::Features::CCommons => "EgIwAfABAQ%3D%3D",
Invidious::Search::Filters::Features::ThreeSixty => "EgJ4AfABAQ%3D%3D",
Invidious::Search::Filters::Features::VR180 => "EgPQAQHwAQE%3D",
Invidious::Search::Filters::Features::ThreeD => "EgI4AfABAQ%3D%3D",
Invidious::Search::Filters::Features::HDR => "EgPIAQHwAQE%3D",
Invidious::Search::Filters::Features::Location => "EgO4AQHwAQE%3D",
Invidious::Search::Filters::Features::Purchased => "EgJIAfABAQ%3D%3D",
}
SORT_FILTERS = {
Invidious::Search::Filters::Sort::Relevance => "",
Invidious::Search::Filters::Sort::Date => "CAI%3D",
Invidious::Search::Filters::Sort::Views => "CAM%3D",
Invidious::Search::Filters::Sort::Rating => "CAE%3D",
Invidious::Search::Filters::Sort::Relevance => "8AEB",
Invidious::Search::Filters::Sort::Date => "CALwAQE%3D",
Invidious::Search::Filters::Sort::Views => "CAPwAQE%3D",
Invidious::Search::Filters::Sort::Rating => "CAHwAQE%3D",
}
Spectator.describe Invidious::Search::Filters do
@@ -17,8 +17,8 @@ Spectator.describe "parse_video_info" do
# Basic video infos
expect(info["title"].as_s).to eq("I Gave My 100,000,000th Subscriber An Island")
expect(info["views"].as_i).to eq(126_573_823)
expect(info["likes"].as_i).to eq(5_157_654)
expect(info["views"].as_i).to eq(220_226_287)
expect(info["likes"].as_i).to eq(6_870_691)
# For some reason the video length from VideoDetails and the
# one from microformat differs by 1s...
@@ -48,12 +48,12 @@ Spectator.describe "parse_video_info" do
expect(info["relatedVideos"].as_a.size).to eq(20)
expect(info["relatedVideos"][0]["id"]).to eq("Hwybp38GnZw")
expect(info["relatedVideos"][0]["title"]).to eq("I Built Willy Wonka's Chocolate Factory!")
expect(info["relatedVideos"][0]["id"]).to eq("krsBRQbOPQ4")
expect(info["relatedVideos"][0]["title"]).to eq("$1 vs $250,000,000 Private Island!")
expect(info["relatedVideos"][0]["author"]).to eq("MrBeast")
expect(info["relatedVideos"][0]["ucid"]).to eq("UCX6OQ3DkcsbYNE6H8uQQuVA")
expect(info["relatedVideos"][0]["view_count"]).to eq("179877630")
expect(info["relatedVideos"][0]["short_view_count"]).to eq("179M")
expect(info["relatedVideos"][0]["view_count"]).to eq("230617484")
expect(info["relatedVideos"][0]["short_view_count"]).to eq("230M")
expect(info["relatedVideos"][0]["author_verified"]).to eq("true")
# Description
@@ -67,7 +67,7 @@ Spectator.describe "parse_video_info" do
# Video metadata
expect(info["genre"].as_s).to eq("Entertainment")
expect(info["genreUcid"].as_s).to be_empty
expect(info["genreUcid"].as_s?).to be_nil
expect(info["license"].as_s).to be_empty
# Author infos
@@ -76,11 +76,11 @@ Spectator.describe "parse_video_info" do
expect(info["ucid"].as_s).to eq("UCX6OQ3DkcsbYNE6H8uQQuVA")
expect(info["authorThumbnail"].as_s).to eq(
"https://yt3.ggpht.com/ytc/AL5GRJVuqw82ERvHzsmBxL7avr1dpBtsVIXcEzBPZaloFg=s48-c-k-c0x00ffffff-no-rj"
"https://yt3.ggpht.com/fxGKYucJAVme-Yz4fsdCroCFCrANWqw0ql4GYuvx8Uq4l_euNJHgE-w9MTkLQA805vWCi-kE0g=s48-c-k-c0x00ffffff-no-rj"
)
expect(info["authorVerified"].as_bool).to be_true
expect(info["subCountText"].as_s).to eq("143M")
expect(info["subCountText"].as_s).to eq("320M")
end
it "parses a regular video with no descrition/comments" do
@@ -99,8 +99,8 @@ Spectator.describe "parse_video_info" do
# Basic video infos
expect(info["title"].as_s).to eq("Chris Rea - Auberge")
expect(info["views"].as_i).to eq(10_943_126)
expect(info["likes"].as_i).to eq(0)
expect(info["views"].as_i).to eq(14_324_584)
expect(info["likes"].as_i).to eq(35_870)
expect(info["lengthSeconds"].as_i).to eq(283_i64)
expect(info["published"].as_s).to eq("2012-05-21T00:00:00Z")
@@ -132,14 +132,14 @@ Spectator.describe "parse_video_info" do
# Related videos
expect(info["relatedVideos"].as_a.size).to eq(19)
expect(info["relatedVideos"].as_a.size).to eq(20)
expect(info["relatedVideos"][0]["id"]).to eq("Ww3KeZ2_Yv4")
expect(info["relatedVideos"][0]["title"]).to eq("Chris Rea")
expect(info["relatedVideos"][0]["author"]).to eq("PanMusic")
expect(info["relatedVideos"][0]["ucid"]).to eq("UCsKAPSuh1iNbLWUga_igPyA")
expect(info["relatedVideos"][0]["view_count"]).to eq("31581")
expect(info["relatedVideos"][0]["short_view_count"]).to eq("31K")
expect(info["relatedVideos"][0]["id"]).to eq("gUUdQfnshJ4")
expect(info["relatedVideos"][0]["title"]).to eq("Chris Rea - The Road To Hell 1989 Full Version")
expect(info["relatedVideos"][0]["author"]).to eq("NEA ZIXNH")
expect(info["relatedVideos"][0]["ucid"]).to eq("UCYMEOGcvav3gCgImK2J07CQ")
expect(info["relatedVideos"][0]["view_count"]).to eq("53298661")
expect(info["relatedVideos"][0]["short_view_count"]).to eq("53M")
expect(info["relatedVideos"][0]["author_verified"]).to eq("false")
# Description
@@ -151,16 +151,18 @@ Spectator.describe "parse_video_info" do
# Video metadata
expect(info["genre"].as_s).to eq("Music")
expect(info["genreUcid"].as_s).to be_empty
expect(info["genreUcid"].as_s?).to be_nil
expect(info["license"].as_s).to be_empty
# Author infos
expect(info["author"].as_s).to eq("ChrisReaOfficial")
expect(info["author"].as_s).to eq("ChrisReaVideos")
expect(info["ucid"].as_s).to eq("UC_5q6nWPbD30-y6oiWF_oNA")
expect(info["authorThumbnail"].as_s).to be_empty
expect(info["authorThumbnail"].as_s).to eq(
"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["subCountText"].as_s).to eq("-")
expect(info["subCountText"].as_s).to eq("3.11K")
end
end
@@ -94,7 +94,7 @@ Spectator.describe "parse_video_info" do
# Video metadata
expect(info["genre"].as_s).to eq("Entertainment")
expect(info["genreUcid"].as_s).to be_empty
expect(info["genreUcid"].as_s?).to be_nil
expect(info["license"].as_s).to be_empty
# Author infos
-16
View File
@@ -1,16 +0,0 @@
# 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
+1 -1
View File
@@ -71,7 +71,7 @@ def send_file(env : HTTP::Server::Context, file_path : String, data : Slice(UInt
filesize = data.bytesize
attachment(env, filename, disposition)
Kemal.config.static_headers.try(&.call(env.response, file_path, filestat))
Kemal.config.static_headers.try(&.call(env, file_path, filestat))
file = IO::Memory.new(data)
if env.request.method == "GET" && env.request.headers.has_key?("Range")
+45 -17
View File
@@ -17,12 +17,11 @@
require "digest/md5"
require "file_utils"
# Require kemal, kilt, then our own overrides
# Require kemal, then our own overrides
require "kemal"
require "kilt"
require "./ext/kemal_content_for.cr"
require "./ext/kemal_static_file_handler.cr"
require "http_proxy"
require "athena-negotiation"
require "openssl/hmac"
require "option_parser"
@@ -48,7 +47,8 @@ require "./invidious/channels/*"
require "./invidious/user/*"
require "./invidious/search/*"
require "./invidious/routes/**"
require "./invidious/jobs/**"
require "./invidious/jobs/base_job"
require "./invidious/jobs/*"
# Declare the base namespace for invidious
module Invidious
@@ -92,6 +92,14 @@ SOFTWARE = {
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
Kemal.config.extra_options do |parser|
parser.banner = "Usage: invidious [arguments]"
@@ -117,6 +125,9 @@ Kemal.config.extra_options do |parser|
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)
end
parser.on("-k", "--colorize", "Colorize logs") do
CONFIG.colorize_logs = true
end
parser.on("-v", "--version", "Print version") do
puts SOFTWARE.to_pretty_json
exit
@@ -133,7 +144,7 @@ if CONFIG.output.upcase != "STDOUT"
FileUtils.mkdir_p(File.dirname(CONFIG.output))
end
OUTPUT = CONFIG.output.upcase == "STDOUT" ? STDOUT : File.open(CONFIG.output, mode: "a")
LOGGER = Invidious::LogHandler.new(OUTPUT, CONFIG.log_level)
LOGGER = Invidious::LogHandler.new(OUTPUT, CONFIG.log_level, CONFIG.colorize_logs)
# Check table integrity
Invidious::Database.check_integrity(CONFIG)
@@ -153,6 +164,15 @@ Invidious::Database.check_integrity(CONFIG)
{% puts "\nDone checking player dependencies, now compiling Invidious...\n" %}
{% end %}
# Misc
DECRYPT_FUNCTION =
if sig_helper_address = CONFIG.signature_server.presence
IV::DecryptFunction.new(sig_helper_address)
else
nil
end
# Start jobs
if CONFIG.channel_threads > 0
@@ -163,11 +183,6 @@ if CONFIG.feed_threads > 0
Invidious::Jobs.register Invidious::Jobs::RefreshFeedsJob.new(PG_DB)
end
DECRYPT_FUNCTION = DecryptFunction.new(CONFIG.decrypt_polling)
if CONFIG.decrypt_polling
Invidious::Jobs.register Invidious::Jobs::UpdateDecryptFunctionJob.new
end
if CONFIG.statistics_enabled
Invidious::Jobs.register Invidious::Jobs::StatisticsRefreshJob.new(PG_DB, SOFTWARE)
end
@@ -180,11 +195,14 @@ if CONFIG.popular_enabled
Invidious::Jobs.register Invidious::Jobs::PullPopularVideosJob.new(PG_DB)
end
CONNECTION_CHANNEL = ::Channel({Bool, ::Channel(PQ::Notification)}).new(32)
Invidious::Jobs.register Invidious::Jobs::NotificationJob.new(CONNECTION_CHANNEL, CONFIG.database_url)
NOTIFICATION_CHANNEL = ::Channel(VideoNotification).new(32)
CONNECTION_CHANNEL = ::Channel({Bool, ::Channel(PQ::Notification)}).new(32)
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::InstanceListRefreshJob.new
Invidious::Jobs.start_all
def popular_videos
@@ -207,8 +225,8 @@ error 500 do |env, ex|
error_template(500, ex)
end
static_headers do |response|
response.headers.add("Cache-Control", "max-age=2629800")
static_headers do |env|
env.response.headers.add("Cache-Control", "max-age=2629800")
end
# Init Kemal
@@ -225,8 +243,6 @@ add_context_storage_type(Preferences)
add_context_storage_type(Invidious::User)
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"
# Use in kemal's production mode.
@@ -235,4 +251,16 @@ Kemal.config.app_name = "Invidious"
Kemal.config.env = "production" if !ENV.has_key?("KEMAL_ENV")
{% end %}
Kemal.run
Kemal.run do |config|
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
+102 -69
View File
@@ -14,7 +14,9 @@ record AboutChannel,
is_family_friendly : Bool,
allowed_regions : Array(String),
tabs : Array(String),
verified : Bool
tags : Array(String),
verified : Bool,
is_age_gated : Bool
def get_about_info(ucid, locale) : AboutChannel
begin
@@ -43,37 +45,103 @@ def get_about_info(ucid, locale) : AboutChannel
auto_generated = true
end
if auto_generated
author = initdata["header"]["interactiveTabbedHeaderRenderer"]["title"]["simpleText"].as_s
author_url = initdata["microformat"]["microformatDataRenderer"]["urlCanonical"].as_s
author_thumbnail = initdata["header"]["interactiveTabbedHeaderRenderer"]["boxArt"]["thumbnails"][0]["url"].as_s
tags = [] of String
tab_names = [] of String
total_views = 0_i64
joined = Time.unix(0)
# Raises a KeyError on failure.
banners = initdata["header"]["interactiveTabbedHeaderRenderer"]?.try &.["banner"]?.try &.["thumbnails"]?
banner = banners.try &.[-1]?.try &.["url"].as_s?
description_node = initdata["header"]["interactiveTabbedHeaderRenderer"]["description"]
if age_gate_renderer = initdata.dig?("contents", "twoColumnBrowseResultsRenderer", "tabs", 0, "tabRenderer", "content", "sectionListRenderer", "contents", 0, "channelAgeGateRenderer")
description_node = nil
author = age_gate_renderer["channelTitle"].as_s
ucid = initdata.dig("responseContext", "serviceTrackingParams", 0, "params", 0, "value").as_s
author_url = "https://www.youtube.com/channel/#{ucid}"
author_thumbnail = age_gate_renderer.dig("avatar", "thumbnails", 0, "url").as_s
banner = nil
is_family_friendly = false
is_age_gated = true
tab_names = ["videos", "shorts", "streams"]
auto_generated = false
else
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"))
if auto_generated
author = initdata["header"]["interactiveTabbedHeaderRenderer"]["title"]["simpleText"].as_s
author_url = initdata["microformat"]["microformatDataRenderer"]["urlCanonical"].as_s
author_thumbnail = initdata["header"]["interactiveTabbedHeaderRenderer"]["boxArt"]["thumbnails"][0]["url"].as_s
ucid = initdata["metadata"]["channelMetadataRenderer"]["externalId"].as_s
# Raises a KeyError on failure.
banners = initdata["header"]["interactiveTabbedHeaderRenderer"]?.try &.["banner"]?.try &.["thumbnails"]?
banner = banners.try &.[-1]?.try &.["url"].as_s?
# Raises a KeyError on failure.
banners = initdata["header"]["c4TabbedHeaderRenderer"]?.try &.["banner"]?.try &.["thumbnails"]?
banner = banners.try &.[-1]?.try &.["url"].as_s?
description_base_node = initdata["header"]["interactiveTabbedHeaderRenderer"]["description"]
# 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
# if banner.includes? "channels/c4/default_banner"
# banner = nil
# end
tags = initdata.dig?("header", "interactiveTabbedHeaderRenderer", "badges")
.try &.as_a.map(&.["metadataBadgeRenderer"]["label"].as_s) || [] of String
else
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"))
description_node = initdata["metadata"]["channelMetadataRenderer"]?.try &.["description"]?
ucid = initdata["metadata"]["channelMetadataRenderer"]["externalId"].as_s
# 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
is_family_friendly = initdata["microformat"]["microformatDataRenderer"]["familySafe"].as_bool
allowed_regions = initdata
.dig?("microformat", "microformatDataRenderer", "availableCountries")
.try &.as_a.map(&.as_s) || [] of String
@@ -91,55 +159,18 @@ def get_about_info(ucid, locale) : AboutChannel
end
end
total_views = 0_i64
joined = Time.unix(0)
sub_count = 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"
)
if (metadata_rows = initdata.dig?("header", "pageHeaderRenderer", "content", "pageHeaderViewModel", "metadata", "contentMetadataViewModel", "metadataRows").try &.as_a)
metadata_rows.each do |row|
metadata_part = row.dig?("metadataParts").try &.as_a.find { |i| i.dig?("text", "content").try &.as_s.includes?("subscribers") }
if !metadata_part.nil?
sub_count = short_text_to_number(metadata_part.dig("text", "content").as_s.split(" ")[0]).to_i32
end
break if sub_count != 0
end
end
sub_count = initdata
.dig?("header", "c4TabbedHeaderRenderer", "subscriberCountText", "simpleText").try &.as_s?
.try { |text| short_text_to_number(text.split(" ")[0]).to_i32 } || 0
AboutChannel.new(
ucid: ucid,
author: author,
@@ -155,7 +186,9 @@ def get_about_info(ucid, locale) : AboutChannel
is_family_friendly: is_family_friendly,
allowed_regions: allowed_regions,
tabs: tab_names,
tags: tags,
verified: author_verified || false,
is_age_gated: is_age_gated || false,
)
end

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