Compare commits

..

386 Commits

Author SHA1 Message Date
syeopite
cf019e3b45 Release v2.20250913.0 (#5463)
This release primarily marks Invidious companion's ascend out of beta and its stable integration thereof into Invidious!

For those unaware Invidious companion is the successor to the `inv-sig-helper` tool, designed to securely pass YouTube's attestation checks and allow for the efficient retrieval and playback of video streams reliably.

Companion delivers YouTube fixes faster since it’s built on the community-driven [YouTube.js](https://github.com/LuanRT/YouTube.js) project, used by many open source projects such as [FreeTube](https://github.com/FreeTubeApp/FreeTube).

For more information see https://github.com/iv-org/invidious-companion and https://docs.invidious.io/installation/

But companion isn't the only new thing in this release!

Invidious will no longer error out completely as soon as a single item failed to parse in search results, channel pages, etc. Instead it now handles it gracefully by substituting those problematic items with an error card and rendering the page normally.

The player has gained some quality of life features such as being able to choose a default playlist for videos to be added to, or persisting caption appearance settings across the session.

Base Invidious video retrieval without Invidious companion has also been made more stable.

And finally a significant amount of bugs were fixed alongside many other minor improvements.

Co-authored-by: Émilien (perso) <4016501+unixfox@users.noreply.github.com>
2025-09-13 17:44:38 +00:00
Samantaz Fox
c8b4325b4f Translations update from Hosted Weblate (#5313) 2025-09-13 14:43:17 +02:00
Hosted Weblate
36086ce083 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:06:45 +00:00
Hosted Weblate
5405320b96 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:06:42 +00:00
Hosted Weblate
6ce4717ed0 Update Alemannic translation
Update Alemannic translation

Update Alemannic translation

Update Alemannic translation

Update Alemannic translation

Update Alemannic translation

Update Alemannic translation

Update Alemannic translation

Update Alemannic translation

Update Alemannic translation

Update Alemannic translation

Update Alemannic translation

Update Alemannic translation

Add Alemannic translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Lenny Angst <lenny@familie-angst.ch>
2025-09-12 15:06:37 +00:00
Hosted Weblate
fce446c10e Update translation files
Updated by "Cleanup translation files" 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-09-12 15:06:32 +00:00
Hosted Weblate
d047a686a4 Update Serbian (Cyrillic script) translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:06:28 +00:00
Hosted Weblate
87d3bd0ab8 Update Chinese (Simplified Han script) translation
Update Chinese (Simplified Han script) translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: 大王叫我来巡山 <hamburger2048@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:06:24 +00:00
Hosted Weblate
a35fa2bd3c Update Chinese (Traditional Han script) translation
Update Chinese (Traditional Han script) translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jeff Huang <s8321414@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:06:22 +00:00
Hosted Weblate
4ce4faec13 Update Portuguese (Portugal) translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: ssantos <ssantos@web.de>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:06:19 +00:00
Hosted Weblate
aa1f8d0e63 Update Slovenian translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Damjan Gerl <damjan@damjan.net>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:06:16 +00:00
Hosted Weblate
4c57aba1f3 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:06:12 +00:00
Hosted Weblate
5643cb1c4d Update translation files
Updated by "Cleanup translation files" 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-09-12 15:06:09 +00:00
Hosted Weblate
5a1d39683b Update translation files
Updated by "Cleanup translation files" 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-09-12 15:06:06 +00:00
Hosted Weblate
8ffbed0d38 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:06:03 +00:00
Hosted Weblate
6928be1298 Update Serbian translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: NEXI <nexiphotographer@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:06:00 +00:00
Hosted Weblate
39c930145a Update Finnish translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Jiri Grönroos <jiri.gronroos@iki.fi>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:05:58 +00:00
Hosted Weblate
7ab925e45b Update Persian translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Atur <aturaseman9@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:05:55 +00:00
Hosted Weblate
fc76964c87 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:05:49 +00:00
Hosted Weblate
2c7e513c63 Update French translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Tristan B <tristanb0@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:05:46 +00:00
Hosted Weblate
28cf74e321 Update Spanish translation
Update Spanish translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: TransGecko <sigekos824@mongrec.com>
Co-authored-by: Álvaro Alonso Ramírez <aalonsoramirez@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:05:42 +00:00
Hosted Weblate
692a12336a Update Dutch translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Dick Groskamp <dikgro@yahoo.co.uk>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:05:36 +00:00
Hosted Weblate
a2d48051e3 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:05:28 +00:00
Hosted Weblate
928b290fdb Update translation files
Updated by "Cleanup translation files" 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-09-12 15:05:21 +00:00
Hosted Weblate
d4b8801bbf Update Arabic translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Rex_sa <rex.sa@pm.me>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:05:16 +00:00
Hosted Weblate
003f462580 Update Italian translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Random <random-r@users.noreply.hosted.weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:05:11 +00:00
Hosted Weblate
0eff8c8cd9 Update Polish translation
Update Polish translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Matthaiks <kitynska@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:05:05 +00:00
Hosted Weblate
deee01fe7b Update translation files
Updated by "Cleanup translation files" 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-09-12 15:04:57 +00:00
Hosted Weblate
2e59a50c24 Update Hindi translation
Update Hindi translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Saurmanđal <saurmandal@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:04:54 +00:00
Hosted Weblate
fb2fcc48d5 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:04:46 +00:00
Hosted Weblate
1176ac59e5 Update Croatian translation
Update Croatian translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Milo Ivir <mail@milotype.de>
Co-authored-by: Vid <vid.maricic@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:04:43 +00:00
Hosted Weblate
22ee5573e3 Update Icelandic translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Sveinn í Felli <sv1@fellsnet.is>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:04:39 +00:00
Hosted Weblate
1d671b6117 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:04:34 +00:00
Hosted Weblate
166435b26d Update translation files
Updated by "Cleanup translation files" 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-09-12 15:04:30 +00:00
Hosted Weblate
90269a5d09 Update Czech translation
Update Czech translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Fjuro <fjuro@alius.cz>
Co-authored-by: Fjuro <git@alius.cz>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:04:24 +00:00
Hosted Weblate
019a5cdb7d Update translation files
Updated by "Cleanup translation files" 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-09-12 15:04:18 +00:00
Hosted Weblate
9b3c46e74e Update translation files
Updated by "Cleanup translation files" 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-09-12 15:04:11 +00:00
Hosted Weblate
5b3cb5268b Update Japanese translation
Update Japanese translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

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>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:04:05 +00:00
Hosted Weblate
f38742e4e7 Update Ukrainian translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Ihor Hordiichuk <igor_ck@outlook.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:03:59 +00:00
Hosted Weblate
dd03b16ff9 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:03:53 +00:00
Hosted Weblate
5a1e86ddb6 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:03:42 +00:00
Hosted Weblate
abd5bfb7b7 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:03:31 +00:00
Hosted Weblate
2c5a3a9538 Update Russian translation
Update Russian translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Artyom Rybakov <rib.artem@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Yurt Page <yurtpage@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:03:22 +00:00
Hosted Weblate
d68d01315a Update Estonian translation
Update Estonian translation

Update Estonian translation

Update Estonian translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Priit Jõerüüt <hwlate@joeruut.com>
Co-authored-by: Priit Jõerüüt <jrthwlate@users.noreply.hosted.weblate.org>
Co-authored-by: kovabait12 <gamingugandaknuckles@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:03:11 +00:00
Hosted Weblate
f6d2920479 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:02:59 +00:00
Hosted Weblate
5d7a60ba38 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:02:45 +00:00
Hosted Weblate
eee9d8441c Update translation files
Updated by "Cleanup translation files" 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-09-12 15:02:38 +00:00
Hosted Weblate
0ae262c396 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:02:29 +00:00
Hosted Weblate
bda898d7fb Update German translation
Update German translation

Update German translation

Update German translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

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>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:02:22 +00:00
Hosted Weblate
08821d7897 Update Portuguese (Brazil) translation
Update Portuguese (Brazil) translation

Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Juzé <dedakir923@exoular.com>
Co-authored-by: joaooliva <joaooliva@protonmail.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:02:20 +00:00
Hosted Weblate
f9821d08ee Update Tamil translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: தமிழ்நேரம் <anishprabu.t@gmail.com>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:02:18 +00:00
Hosted Weblate
d38f5d0ab7 Update Turkmen translation
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: Hydyr Sopyyew <sopyyewhydyr46@gmail.com>
2025-09-12 15:02:17 +00:00
Hosted Weblate
c28fb22db5 Update translation files
Updated by "Cleanup translation files" 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-09-12 15:02:14 +00:00
Hosted Weblate
ae75c142d0 Update Latvian translation
Update Latvian translation

Co-authored-by: Hosted Weblate <hosted@weblate.org>
Co-authored-by: ℂ𝕠𝕠𝕠𝕝 (𝕘𝕚𝕥𝕙𝕦𝕓.𝕔𝕠𝕞/ℂ𝕠𝕠𝕠𝕝) <coool@mail.lv>
2025-09-12 15:02:12 +00:00
Hosted Weblate
97783f84c1 Update Turkish translation
Update translation files

Updated by "Cleanup translation files" hook in Weblate.

Co-authored-by: Bora Atıcı <boratici.acc@gmail.com>
Co-authored-by: Hosted Weblate <hosted@weblate.org>
Translate-URL: https://hosted.weblate.org/projects/invidious/translations/
Translation: Invidious/Invidious Translations
2025-09-12 15:02:11 +00:00
Fijxu
f9cf70f9d7 Add default playlist preference (#5449)
* Add default playlist preference

Closes https://github.com/iv-org/invidious/issues/5421

* Add option to set default playlist to none

* Move it to player preferences
2025-09-11 11:05:09 -03:00
Émilien (perso)
14a629a4e8 Better documentation for the specific case public_url with companion 2025-09-11 11:19:40 +02:00
dependabot[bot]
9e160d45d3 Bump actions/stale from 9 to 10
Bumps [actions/stale](https://github.com/actions/stale) from 9 to 10.
- [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/v9...v10)

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

Signed-off-by: dependabot[bot] <support@github.com>
2025-09-08 23:36:07 +02:00
Fijxu
ba02a4cdf5 Prevent player microformat from being overwritten by the next microformat (#5453)
* Prevent player microformat from being overwritten by the next microformat

Closes https://github.com/iv-org/invidious/issues/5443

The player microformat is what we need to get the published date,
premiere timestamp, allowed regions and more information of the video.

Youtube introduced a new `microformat.microformatDataRenderer` in the
next endpoint which overwrote the player microformat
`microformat.playerMicroformatRenderer` when merged

* Update src/invidious/videos/parser.cr

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

---------

Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2025-09-08 17:16:22 -03:00
Emilien
cf2dfbb75d chore: remove debug 2025-09-08 21:34:47 +02:00
Emilien
21c13bba9d chore: use api captions from companion when available 2025-09-08 21:34:47 +02:00
syeopite
5e9d51c06e Refactor FilteredCompressHandler to inherit from stdlib
This changes its behavior to align with the stdlib variant in that
compression is now delayed till the moment that the server begins to
send a response.

This allows the handler to avoid compressing empty responses,and
safeguards against any double compression of content that may occur
if another handler decides to compressi ts response.

This does however come at the drawback(?) of it now removing
`content-length` headers on requests if it exists; since compression
makes the value inaccurate anyway.

See: https://github.com/crystal-lang/crystal/pull/9625
2025-09-08 21:34:47 +02:00
Emilien
1653dd629e fix formatting 2025-09-08 21:34:47 +02:00
Emilien
cba2adc6ef fix csp + progress proxy + allow omit public_url 2025-09-08 21:34:47 +02:00
Emilien
42b955d713 chore: add the suggestions 2025-09-08 21:34:47 +02:00
Emilien
324a416fd4 initial support for base_url with invidious companion + proxy invidious_companion 2025-09-08 21:34:47 +02:00
Fijxu
89c8b1b901 CI: fix wrong if statement for build-docker job (#5442) 2025-09-02 16:57:29 +02:00
syeopite
fd8dc93569 Show message when connection to the database is not possible (#5346) 2025-08-23 04:04:06 -07:00
syeopite
67f93e55d8 Fix "ex" variable collision in invidious.cr
The exception handling for database connections results in an
`ex` variable which Ameba sees as overshadowing the `ex` used by the
`ex` block arg used to define the HTTP status code 500 handler below.

Although this is a non-issue since the db connection exception handling
will cause Invidious to exit, Ameba's nature as a static checker means
that it isn't aware of this.

The simplest fix without a dirty ameba ignore comment is to rename `ex`
within the Kemal handler block below, since `ex` within a begin rescue
block is a Crystal convention that will also cause Ameba to raise when
not adhered to.
2025-08-23 03:35:59 -07:00
syeopite
f35f529adc Videos: Fix missing .id to retrieve first playlist video ID (#5366) 2025-08-23 03:30:00 -07:00
syeopite
b32b077a80 Player: Persist caption settings (#5417) 2025-08-23 03:29:07 -07:00
syeopite
6badb80082 Channels: Fix fetching channel playlists (#5418) 2025-08-23 03:26:49 -07:00
syeopite
15099ac1dd Frontend: Fix notification count of TRUE (#5391) 2025-08-23 03:26:11 -07:00
syeopite
adc83f1c09 Documentation: Fix typo (effet -> effect) (#5369) 2025-08-23 03:23:42 -07:00
syeopite
41e0e77d33 HTML: Add Missing Noreferrers (#5368) 2025-08-23 03:23:05 -07:00
syeopite
9ebc76462f Channels: Fix fetching of individual community posts (#5361) 2025-08-23 03:20:04 -07:00
syeopite
0308acb624 Videos: Add fallback to TvSimply client (#5345) 2025-08-23 03:18:41 -07:00
syeopite
cac2397494 YTAPI: Add TvSimply client (#5344) 2025-08-23 03:17:28 -07:00
syeopite
cf640d808e YtAPI: Bump client versions (#5325) 2025-08-23 03:16:55 -07:00
syeopite
80ec027c8f CI: Fix docker ci job not checking if Invidious starts successfully or not (#5306) 2025-08-23 03:16:32 -07:00
syeopite
6f5f0dceca CI: Use public ARM64 Github actions runners for ARM64 builds (#5305) 2025-08-23 03:16:05 -07:00
syeopite
a8ab7b61f7 Player: Add keyboard shortcuts to configure captions (#5188) 2025-08-23 03:15:28 -07:00
Kristian Vos
dd8086e6d9 fix: fetching channel playlists returned 500 error 2025-08-13 15:43:54 +02:00
Eugene Pakhomov
875d8e7e41 Persist caption settings 2025-08-13 14:39:58 +03:00
dependabot[bot]
1ae0f45b0e Bump actions/checkout from 4 to 5 (#5415)
Bumps [actions/checkout](https://github.com/actions/checkout) from 4 to 5.
- [Release notes](https://github.com/actions/checkout/releases)
- [Changelog](https://github.com/actions/checkout/blob/main/CHANGELOG.md)
- [Commits](https://github.com/actions/checkout/compare/v4...v5)

---
updated-dependencies:
- dependency-name: actions/checkout
  dependency-version: '5'
  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-08-12 15:06:16 +02:00
fieryhenry
3335bc8c38 Get a count of 0 if STORAGE_KEY_NOTIF_COUNT is not present in storage
Not sure if this is necessary as I think it should always be present in storage, but just in case it isn't
2025-07-18 19:07:41 +00:00
fieryhenry
a84bb1d22e Fix TRUE number of notifications
`update_ticker_count` used to use STORAGE_KEY_STREAM to get the number of notifications which is a boolean value, now it uses STORAGE_KEY_NOTIF_COUNT which is an integer
2025-07-18 19:02:50 +00:00
epicsam123
24252b836c add back semicolon 2025-06-30 22:38:30 -04:00
Nami Sunami
227c041b86 fix(config.example.yml): Fix typo (effet -> effect) 2025-06-28 11:38:31 +02:00
ChunkyProgrammer
803311713d make sort_by code more legible 2025-06-27 11:38:08 -04:00
epicsam123
64ac3b5203 add missing noreferrers 2025-06-26 18:40:06 -04:00
Samantaz Fox
b0c9f87fbe Fix missing .id to retrieve first playlist video ID
This was missed in the review of PR 5196
2025-06-26 19:09:52 +00:00
ChunkyProgrammer
f8febbe2b2 format changes 2025-06-25 23:53:07 -04:00
ChunkyProgrammer
436f955e0f update fetch_community_post_comments protobuf to match currently used protobuf, add sort_by option 2025-06-25 23:34:30 -04:00
ChunkyProgrammer
4155f15bf7 update resolve_url api to better support new post endpoint 2025-06-25 23:33:28 -04:00
ChunkyProgrammer
b9171d9dab Update protobuf for individual community post 2025-06-25 22:35:16 -04:00
ChunkyProgrammer
f3f6937ffc Fix community tab not loading 2025-06-25 22:22:30 -04:00
Fijxu
8723fdca06 Update src/invidious.cr
Co-authored-by: Samantaz Fox <coding@samantaz.fr>
2025-06-21 12:02:32 -04:00
Fijxu
d51e1cb051 remove fallback to TV client 2025-06-15 17:45:53 -04:00
Fijxu
cf0a68bd77 store adaptiveFormats data into a variable 2025-06-15 17:43:07 -04:00
Fijxu
8cd9d53fb1 show message when connection to the database is not possible 2025-06-12 18:44:01 -04:00
Fijxu
01cdb384e0 add suggestions from syeopite 2025-06-12 17:25:19 -04:00
Fijxu
b1e7e0c45e replace url by signatureCipher if url is not present 2025-06-12 16:18:01 -04:00
Fijxu
0c96e0977f check for signatureCipher too 2025-06-12 16:07:58 -04:00
Fijxu
37be513e14 Add fallback to TvSimply client 2025-06-12 01:25:59 -04:00
Fijxu
4daf1f0818 Add TvSimply client
Data taken from: 8cf658151f, 689fb0b90e and b15f623dab
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
Fijxu
09d342b84d Update src/invidious/yt_backend/youtube_api.cr
Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2025-05-22 17:55:46 -04:00
Fijxu
3a8d4f333f update IOS_APP_VERSION 2025-05-22 17:17:01 -04:00
Fijxu
97354adf0f Update src/invidious/yt_backend/youtube_api.cr
Co-authored-by: syeopite <70992037+syeopite@users.noreply.github.com>
2025-05-22 17:15:45 -04:00
Fijxu
6497e1c418 YtAPI: Bump client versions 2025-05-22 16:06:13 -04:00
epicsam123
f9472e4e4b revert format 2025-05-19 22:34:59 -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
Fijxu
cc643f209a CI: Fix build-docker job not checking if Invidious starts successfully or not 2025-05-15 19:57:46 -04:00
Fijxu
381074fce1 CI: Replace Dockerfile path depending of the os used 2025-05-15 19:38:21 -04:00
Fijxu
033a44fab5 CI: Also use matrix.docker_compose_file for Run Docker step 2025-05-15 17:58:24 -04:00
Fijxu
a3375e512e CI: Add name attribute to build-docker job 2025-05-15 17:43:03 -04:00
Fijxu
1d664c759f CI: Use matrix for build-docker on ci.yml 2025-05-15 16:33:03 -04:00
Fijxu
94f0a7a9d2 CI: remove --build-arg
Dockerfile and Dockerfile.arm64 already build Invidious without release mode if
`release` argument is not present.
2025-05-15 15:31:17 -04:00
Fijxu
1d2f4b6813 CI: fix typo on comment about the os used on the ARM64 builder 2025-05-15 15:29:24 -04:00
Fijxu
cef0097a30 CI: fix typo on matrix platforms 2025-05-15 15:28:14 -04:00
Fijxu
bef2d7b6b5 CI: Use public ARM64 Github actions runners for ARM64 builds.
Currently, Invidious uses QEMU to build it's ARM64 Invidious image,
which is slow (since we are basically using a virtual machine).

This helps with the speed of building ARM64 binaries for Invidious
on each release/commit.

More information about the public ARM64 runners here:
https://github.com/orgs/community/discussions/148648

CI: Use ARM64 compose file for build-docker-arm64
2025-05-15 01:49:17 -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
epicsam123
e67a30b124 formatting 2025-03-20 10:29:26 -04:00
epicsam123
bc3b3f6d69 updated caption features to use videojs interface 2025-03-20 10:09:43 -04: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
epicsam123
73bf956af5 captions: provide "w", "o", "-", "+" keydowns for player from YT 2025-02-19 21:08:45 -05: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
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
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
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
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
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
⛧-440729 [sophie]
3850739d7f apply review suggestions 2024-08-27 10:48:34 +02:00
Samantaz Fox
9d91ac3b88 Use snake case for all variables 2024-08-26 20:17:45 +00:00
Sophie Tauchert
5d0149844f Batch user notifications together 2024-08-26 21:24:27 +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
Krystof Pistek
5f590dda80 Carry over audio-only mode in playlist links 2024-08-07 20:58:08 +02: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
PMK
7214fdaff4 JS: Update timeupdate event defensive to prevent errors 2024-07-06 21:39:00 +02: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
RadoslavL
6861148290 Moved code around and fixed a problem 2023-11-24 11:24:56 +02: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
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
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
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
Emilien Devos
78773d7326 add the ability to listen on unix sockets 2021-05-24 23:41:14 +02:00
153 changed files with 4117 additions and 1438 deletions

3
.github/CODEOWNERS vendored
View File

@@ -1,6 +1,3 @@
# 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

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
.github/dependabot.yml vendored Normal file
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"

View File

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

View File

@@ -8,29 +8,26 @@ on:
jobs:
release:
runs-on: ubuntu-latest
strategy:
matrix:
include:
- os: ubuntu-latest
platform: linux/amd64
name: "AMD64"
dockerfile: "docker/Dockerfile"
tag_suffix: ""
# GitHub doesn't have a ubuntu-latest-arm runner
- os: ubuntu-24.04-arm
platform: linux/arm64/v8
name: "ARM64"
dockerfile: "docker/Dockerfile.arm64"
tag_suffix: "-arm64"
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Install Crystal
uses: crystal-lang/install-crystal@v1.8.2
with:
crystal: 1.12.2
- name: Run lint
run: |
if ! crystal tool format --check; then
crystal tool format
git diff
exit 1
fi
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
uses: actions/checkout@v5
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
@@ -49,46 +46,21 @@ jobs:
images: quay.io/invidious/invidious
flavor: |
latest=false
suffix=${{ matrix.tag_suffix }}
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@v5
- name: Build and push Docker ${{ matrix.name }} image for Push Event
uses: docker/build-push-action@v6
with:
context: .
file: docker/Dockerfile
platforms: linux/amd64
file: ${{ matrix.dockerfile }}
platforms: ${{ matrix.platform }}
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@v5
with:
context: .
file: docker/Dockerfile.arm64
platforms: linux/arm64/v8
labels: ${{ steps.meta-arm64.outputs.labels }}
push: true
tags: ${{ steps.meta-arm64.outputs.tags }}
build-args: |
"release=1"

View File

@@ -38,17 +38,17 @@ jobs:
matrix:
stable: [true]
crystal:
- 1.10.1
- 1.11.2
- 1.12.1
- 1.13.2
- 1.14.0
- 1.12.2
- 1.13.3
- 1.14.1
- 1.15.1
- 1.16.3
include:
- crystal: nightly
stable: false
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
submodules: true
@@ -58,12 +58,12 @@ jobs:
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
@@ -83,46 +83,43 @@ jobs:
run: crystal build --warnings all --error-on-warnings --error-trace src/invidious.cr
build-docker:
strategy:
matrix:
include:
- os: ubuntu-latest
name: "AMD64"
# GitHub doesn't have a ubuntu-latest-arm runner
- os: ubuntu-24.04-arm
name: "ARM64"
runs-on: ubuntu-latest
name: Test ${{ matrix.name }} Docker build
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Use ARM64 Dockerfile if ARM64
if: ${{ matrix.name == 'ARM64' }}
run: sed -i 's/Dockerfile/Dockerfile.arm64/' docker-compose.yml
- name: Build Docker
run: docker compose build --build-arg release=0
run: docker compose build
- name: Change hmac_key on docker-compose.yml
run: sed -i '/hmac_key/s/CHANGE_ME!!/docker-build-hmac-key/' docker-compose.yml
- name: Run Docker
run: docker compose up -d
- name: Test Docker
run: while curl -Isf http://localhost:3000; do sleep 1; done
id: test
run: curl -If http://localhost:3000 --retry 5 --retry-delay 1 --retry-all-errors
build-docker-arm64:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
with:
platforms: arm64
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Build Docker ARM64 image
uses: docker/build-push-action@v5
with:
context: .
file: docker/Dockerfile.arm64
platforms: linux/arm64/v8
build-args: release=0
- name: Test Docker
run: while curl -Isf http://localhost:3000; do sleep 1; done
- name: Print Invidious container logs
# Tells Github Actions to always run this step regardless of whether the previous step has failed
# Without this expression this step would simply be skipped when the previous step fails.
if: success() || steps.test.conclusion == 'failure'
run: docker compose logs
lint:
@@ -131,22 +128,23 @@ jobs:
continue-on-error: true
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
submodules: true
- name: Install Crystal
uses: crystal-lang/install-crystal@v1.8.0
id: lint_step_install_crystal
uses: crystal-lang/install-crystal@v1.8.2
with:
crystal: latest
- name: Cache Shards
uses: actions/cache@v3
uses: actions/cache@v4
with:
path: |
./lib
./bin
key: shards-${{ hashFiles('shard.lock') }}
key: shards-${{ hashFiles('shard.lock') }}-${{ steps.lint_step_install_crystal.outputs.crystal }}
- name: Install Shards
run: |

View File

@@ -10,7 +10,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- uses: actions/stale@v8
- uses: actions/stale@v10
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
days-before-stale: 730

View File

@@ -1,5 +1,247 @@
# CHANGELOG
## vX.Y.0 (future)
## v2.20250913.0
### Wrap-up
This release primarily marks Invidious companion's ascend out of beta and its stable integration thereof into Invidious!
For those unaware Invidious companion is the successor to the `inv-sig-helper` tool, designed to securely pass YouTube's attestation checks and allow for the efficient retrieval and playback of video streams reliably.
Companion delivers YouTube fixes faster since its built on the community-driven [YouTube.js](https://github.com/LuanRT/YouTube.js) project, used by many open source projects such as [FreeTube](https://github.com/FreeTubeApp/FreeTube).
For more information see https://github.com/iv-org/invidious-companion and https://docs.invidious.io/installation/
But companion isn't the only new thing in this release!
Invidious will no longer error out completely as soon as a single item failed to parse in search results, channel pages, etc. Instead it now handles it gracefully by substituting those problematic items with an error card and rendering the page normally.
The player has gained some quality of life features such as being able to choose a default playlist for videos to be added to, or persisting caption appearance settings across the session.
Base Invidious video retrieval without Invidious companion has also been made more stable.
And finally a significant amount of bugs were fixed alongside many other minor improvements.
### New features & important changes
#### For Users
- DASH is now enabled by default due to YouTube's removal of the 720p non-dash streams
- Javascript licencing info has been added to all of Invidious' scripts, restoring full compatibility with LibreJS
- There is no longer an option for a text captcha during registration due to the shutdown (presumably) of the upstream service
- Parse errors in feeds will no longer render the entire feed unusable and instead will substitute only the broken items with error cards
- Keyboard shortcuts have been added to configure caption styles:
- `-`,`=` can be used to change the font size
- `o` can be used to cycle the opacity of the caption text
- `w` can be used to cycle the opacity of the caption box
- Caption styles changed through the VideoJS menu will now persist
- You can now choose a default playlist to add videos to instead of needing to manually select one each time
#### For instance owners
- Invidious companion support has been added to replace the deprecated inv-sig-helper
- **DASH is now the default resolution! Please ensure that your instances can withstand the significantly higher bandwidth usage or manually configure your instance to use non-dash streams by default**
- Invidious will now warn when it is unable to connect to the database instead of failing silently
- **The text captcha during registration has been removed due to the shutdown (presumably) of the upstream service**
#### For developers
- Dependabot has been added to keep Github Actions and Docker dependencies up-to-date.
- CI version matrix has been bumped to the latest patch release for each minor version
- The versions of Crystal that we test in CI/CD are now: `1.12.2`, `1.13.3`, `1.14.1`, `1.15.1`, `1.16.3`
- `Kilt` is no longer a dependency of Invidious
- The ARM64 docker image builds (and the test CI) has been changed to use Github's ARM64 runner instead of QEMU
- **An "error" JSON object can now be returned in various API responses in-place of an item that has failed to parse**:
```json
{
"type": "parse-error",
"errorMessage": "...",
"errorBacktrace": "..."
}
```
### Bugs fixed
#### User-side
- Livestream will now be properly proxied again allowing playback from the UI
- The proxy video preference for logged-in users will no longer get ignored when a default value is set by the instance
- Fixes the missing `label` key error on select search results and other feeds
- Invidious will no longer strip out spaces from search queries when navigating back from the preferences page
- Restores functionality to the `subscriptions:true` search keyword
- The channel RSS feeds will no longer have an empty title
- Individual community posts can be viewed again
- The playlists tab of channels can be viewed again
- Fix incorrect dates, region, etc of videos
- Various minor fixes were made to how video info is extracted in setups without Invidious companion to improve resiliency and chances of success
- Fix issue where the notification count becomes `TRUE` rather than an actual number
#### For instance owners
- Fixed a minor typo in config.example.yml (`effet` -> `effect`)
#### For developers
- The docker image test CI will now properly check whether Invidious has started
### Full list of pull requests merged since the last release (newest first)
* Add Invidious companion support (https://github.com/iv-org/invidious/pull/4985, by @unixfox)
* Bump shards.yml version to dev version (https://github.com/iv-org/invidious/pull/5206, by @syeopite)
* chore: enforce 16 characters for invidious_companion_key (https://github.com/iv-org/invidious/pull/5220, by @unixfox)
* chore: set dash by default (https://github.com/iv-org/invidious/pull/5216, by @unixfox)
* Fix minor casing issues in brand names (https://github.com/iv-org/invidious/pull/5258, thanks @efb4f5ff-1298-471a-8973-3d47447115dc)
* feat: route to invidious companion on downloads (https://github.com/iv-org/invidious/pull/5224, by @alexmaras)
* Fix proxying live DASH streams (https://github.com/iv-org/invidious/pull/4589, thanks @absidue)
* Reflect companion secret character limit in example config comment (https://github.com/iv-org/invidious/pull/5269, thanks @Vyquos)
* chore: Add dependabot for docker and github actions (https://github.com/iv-org/invidious/pull/5285, by @unixfox)
* Bump actions/stale from 8 to 9 (https://github.com/iv-org/invidious/pull/5291, thanks @dependabot[bot])
* Bump actions/cache from 3 to 4 (https://github.com/iv-org/invidious/pull/5289, thanks @dependabot[bot])
* Bump alpine from 3.20 to 3.21 in /docker (https://github.com/iv-org/invidious/pull/5288, thanks @dependabot[bot])
* Bump docker/build-push-action from 5 to 6 (https://github.com/iv-org/invidious/pull/5287, thanks @dependabot[bot])
* Bump crystal-lang/install-crystal from 1.8.0 to 1.8.2 (https://github.com/iv-org/invidious/pull/5286, thanks @dependabot[bot])
* Bump crystallang/crystal from 1.12.2-alpine to 1.16.2-alpine in /docker (https://github.com/iv-org/invidious/pull/5290, thanks @dependabot[bot])
* Bump crystallang/crystal from 1.16.2-alpine to 1.16.3-alpine in /docker (https://github.com/iv-org/invidious/pull/5301, thanks @dependabot[bot])
* CI: Bump Crystal version matrix (https://github.com/iv-org/invidious/pull/5293, by @Fijxu)
* fix(typo): 'Salect' -> 'Select' (https://github.com/iv-org/invidious/pull/5242, by @Fijxu)
* fix: set CSP header after setting preferences of registered users (https://github.com/iv-org/invidious/pull/5275, by @Fijxu)
* fix: safely access "label" key (https://github.com/iv-org/invidious/pull/5282, by @Fijxu)
* Add missing javascript licenses (https://github.com/iv-org/invidious/pull/5292, by @Fijxu)
* Add Javascript licence information automatically (https://github.com/iv-org/invidious/pull/5297, by @syeopite)
* Remove text captcha due to textcaptcha.com being down (https://github.com/iv-org/invidious/pull/5308, by @Fijxu)
* Release versioning maintenance (https://github.com/iv-org/invidious/pull/5310, by @syeopite)
* Update Kemal to 1.6.0 and remove Kilt (https://github.com/iv-org/invidious/pull/5120, by @syeopite)
* Translations update from Hosted Weblate (https://github.com/iv-org/invidious/pull/5192, thanks @weblate)
* require base_job before the other jobs (https://github.com/iv-org/invidious/pull/5194, by @Fijxu)
* Handle parse errors gracefully on timeline items (https://github.com/iv-org/invidious/pull/5196, by @syeopite)
* fix: do not strip '+' character from referer (https://github.com/iv-org/invidious/pull/5276, by @Fijxu)
* fix: pass user to `query.process` if present. (https://github.com/iv-org/invidious/pull/5277, by @Fijxu)
* Add missing xml.text on "title" element for channels RSS (https://github.com/iv-org/invidious/pull/5320, by @Fijxu)
* Remove `@iv-org/developers` from codeowners (https://github.com/iv-org/invidious/pull/5314, by @syeopite)
* Make base-Invidious video info extraction more resilient (https://github.com/iv-org/invidious/pull/5312, by @syeopite)
* Bump actions/checkout from 4 to 5 (https://github.com/iv-org/invidious/pull/5415, thanks @dependabot[bot])
* Player: Add keyboard shortcuts to configure captions (https://github.com/iv-org/invidious/pull/5188, thanks @epicsam123)
* CI: Use public ARM64 Github actions runners for ARM64 builds. (https://github.com/iv-org/invidious/pull/5305, by @Fijxu)
* CI: Fix docker ci job not checking if Invidious starts successfully or not (https://github.com/iv-org/invidious/pull/5306, by @Fijxu)
* YtAPI: Bump client versions (https://github.com/iv-org/invidious/pull/5325, by @Fijxu)
* YTAPI: Add `TvSimply` client (https://github.com/iv-org/invidious/pull/5344, by @Fijxu)
* Videos: Add fallback to TvSimply client (https://github.com/iv-org/invidious/pull/5345, by @Fijxu)
* Show message when connection to the database is not possible (https://github.com/iv-org/invidious/pull/5346, by @Fijxu)
* Channels: Fix fetching of individual community posts (https://github.com/iv-org/invidious/pull/5361, thanks @ChunkyProgrammer)
* Videos: Fix missing .id to retrieve first playlist video ID (https://github.com/iv-org/invidious/pull/5366, by @SamantazFox)
* HTML: Add Missing Noreferrers (https://github.com/iv-org/invidious/pull/5368, thanks @epicsam123)
* Documentation: Fix typo (effet -> effect) (https://github.com/iv-org/invidious/pull/5369, thanks @nsunami)
* Frontend: Fix notification count of `TRUE` (https://github.com/iv-org/invidious/pull/5391, thanks @fieryhenry)
* Player: Persist caption settings (https://github.com/iv-org/invidious/pull/5417, thanks @p-himik)
* Channels: Fix fetching channel playlists (https://github.com/iv-org/invidious/pull/5418, thanks @KrisVos130)
* CI: fix wrong if statement for build-docker job (https://github.com/iv-org/invidious/pull/5442, by @Fijxu)
* initial base_url companion support + proxy companion (https://github.com/iv-org/invidious/pull/5266, by @unixfox)
* Prevent player microformat from being overwritten by the next microformat (https://github.com/iv-org/invidious/pull/5453, by @Fijxu)
* Bump actions/stale from 9 to 10 (https://github.com/iv-org/invidious/pull/5457, thanks @dependabot[bot])
* Better documentation for the specific case public_url with companion (https://github.com/iv-org/invidious/pull/5461, by @unixfox)
* Add default playlist preference (https://github.com/iv-org/invidious/pull/5449, by @Fijxu)
* Translations update from Hosted Weblate (https://github.com/iv-org/invidious/pull/5313, thanks to our many translators)
* Release `v2.20250913.0` (https://github.com/iv-org/invidious/pull/5463, by @syeopite)
## v2.20250517.0
Inverse fallback for the YouTube client from TVHTML then MWEB. Fixes https://github.com/iv-org/invidious/issues/5273
## v2.20250504.0
Small release with quick workaround fix for issue #4251 (Nil assertion failed).
PR: https://github.com/iv-org/invidious/issues/5262
## v2.20250314.0
### Wrap-up
This release brings the long awaited feature of supporting multiple audio tracks in a video, some bug fixes and UX improvements, and many other things primarily oriented to self-hosting instances, and developers using the API.
The `Community` channel tab has been replaced by `Posts` in light of YouTube changes, but the URL remains the same.
Tamil is now available as an interface language
Automatic instance redirects will no longer have the chance to annoyingly redirect to the same instance you're on.
Due to their requirements for video playback, Invidious will log warning messages when either inv-sig-helper, `po_token` or `visitor_data` is not configured
Invidious is now able to listen through a UNIX socket
User notifications are now batched for each channel
**The minimum Crystal version supported by Invidious now `1.12.0`**
### New features & important changes
#### For users
* Invidious now supports videos with multiple audio tracks allowing you to select which one you want to hear with!
* Channel pages now have a proper previous page button
* RSS feeds for channels will no longer contain the channel's profile picture
* Support for channel `courses` page has been added
* `Community` tabs has been replaced with `Posts` to comply with YouTube changes
* Tamil is now an available interface language.
#### For instance owners
* Invidious is now able to listen on a UNIX socket
* User notifications are now batched by channels, significantly reducing database load.
* **`1.12.0` is now the oldest Crystal version that Invidious supports**
* The example config will no longer force an http proxy to be configured
* Invidious will now warn when any top-level config option must be set to a custom value, instead of just `HMAC_KEY`
* Due to their requirements for video playback, Invidious will log warning messages when either inv-sig-helper, `po_token` or `visitor_data` is not configured
#### For developers
* Invidious is now compliant to Crystal 1.15 formatting rules, which are incompatible with earlier versions.
* `/api/v1/transcripts/{id}` has been added to the API to allow for fetching the transcripts for a video. The arguments are the same as the captions endpoint.
* `author_thumbnail` field has been added to videos in the various paged api endpoints
* `published` field has been added to the API response for a video's related videos.
* Docker builds now uses the Crystal compiler cache, reducing build times on repeated builds significantly.
* Invidious ajax action handlers has undergone a clean up and may face compatibility issues with code that depends on these endpoints.
* The versions of Crystal that we test in CI/CD are now: `1.12.1`, `1.13.2`, `1.14.0`, `1.15.0`
### Bugs fixed
#### User-side
* Local video listen mode is now preserved when clicking on a video in the sidebar playlist widget
* Automatic instance redirects will no longer redirect to the same instance the user is on
* Fix some thumbnails responses returning 404
* Videos: Fix missing host parameter on playback URLs when `local=true`
* Fix HLS being used for non-livestream videos
* Fix timeupdate event errors when required elements are missing
* User: Ensure IO is properly closed when importing NewPipe subscriptions
#### For instance owners
* Fix http proxy configuration being forced by the standard example config
#### API
* `/api/v1/videos/{id}` will no longer return an occasional empty JSON response
### Full list of pull requests merged since the last release (newest first)
* Make Invidious compliant to Crystal 1.15 formatting rules (https://github.com/iv-org/invidious/pull/5014, by @syeopite)
* Remove formatter check on container workflows (https://github.com/iv-org/invidious/pull/5153, by @syeopite)
* Videos: Fix missing host parameter on playback URLs when `local=true` (https://github.com/iv-org/invidious/pull/4992, by @SamantazFox)
* Remove stdlib override for proxy initialization (https://github.com/iv-org/invidious/pull/5065, by @syeopite)
* Add support for author thumbnails in search api for videos (https://github.com/iv-org/invidious/pull/5072, thanks @ChunkyProgrammer)
* Skip route if resp got closed by before handlers (https://github.com/iv-org/invidious/pull/5073, by @syeopite)
* Fix video thumbnails in mixes (https://github.com/iv-org/invidious/pull/5116, thanks @iBicha)
* CI: Drop support for versions prior to 1.12 and add 1.15.0 (https://github.com/iv-org/invidious/pull/5148, by @syeopite)
* [Continuing #5094] Set language info for dash audio streams and sort (https://github.com/iv-org/invidious/pull/5149, thanks @giuliano-macedo)
* Warn when any top-level config is "CHANGE_ME!!" (https://github.com/iv-org/invidious/pull/5150, by @syeopite)
* Comment out http_proxy in example config (https://github.com/iv-org/invidious/pull/5151, by @syeopite)
* API: Add a 'published' video parameter for related videos (https://github.com/iv-org/invidious/pull/4149, thanks @RadoslavL)
* Ensure IO is properly closed when importing NewPipe subscriptions (https://github.com/iv-org/invidious/pull/4346, thanks @ChunkyProgrammer)
* Carry over audio-only mode in playlist links (https://github.com/iv-org/invidious/pull/4784, thanks @krystof1119)
* Routes: Clean ajax actions handlers (https://github.com/iv-org/invidious/pull/5036, by @SamantazFox)
* Frontend: Add a first page and previous page buttons for channel navigation (https://github.com/iv-org/invidious/pull/4123, thanks @RadoslavL)
* RSS: Channel + Playlist improvements (https://github.com/iv-org/invidious/pull/4298, thanks @ChunkyProgrammer)
* Batch user notifications together (https://github.com/iv-org/invidious/pull/4486, thanks @999eagle)
* JS: Update timeupdate event making it more defensive to prevent errors (https://github.com/iv-org/invidious/pull/4782, thanks @PMK)
* Add API endpoint for fetching transcripts from YouTube by (https://github.com/iv-org/invidious/pull/4788, by @syeopite)
* Translations update from Hosted Weblate by (https://github.com/iv-org/invidious/pull/4989, thanks to our many translators)
* Add the ability to listen on UNIX sockets (https://github.com/iv-org/invidious/pull/5112, thanks @Caian)
* Pick a different instance upon redirect (https://github.com/iv-org/invidious/pull/5154, thanks @epicsam123)
* Add Courses to channel page and channel API (https://github.com/iv-org/invidious/pull/5158, thanks @ChunkyProgrammer)
* fix /api/v1/videos/:id returns 200 with no content (https://github.com/iv-org/invidious/pull/5162, thanks @Drikanis)
* Use Crystal compiler cache in docker builds (https://github.com/iv-org/invidious/pull/5163, by @syeopite)
* Channels: Fix community tab by (https://github.com/iv-org/invidious/pull/5183, thanks @Fijxu)
* Fix typo in `src/invidious/routes/images.cr` (https://github.com/iv-org/invidious/pull/5184, by @syeopite)
* Fix an issue with the HLS manifest check for livestream videos (https://github.com/iv-org/invidious/pull/5189, thanks @alexmaras)
* Warn when `po_token`, `visitor_data` and/or `inv-sig-helper` is not configured (https://github.com/iv-org/invidious/pull/5202, by @syeopite)
## v2.20241110.0
### Wrap-up

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

View File

@@ -550,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,
@@ -596,6 +600,10 @@ span > select {
.light-theme .pure-menu-heading {
color: #565d64;
}
.no-theme .error-card {
border: 1px solid black;
}
}
@@ -658,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,
@@ -719,6 +731,10 @@ body.dark-theme {
.no-theme footer a {
color: #adadad !important;
}
.no-theme .error-card {
border: 1px solid #5e5e5e;
}
}
@@ -816,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);
}

View File

@@ -86,6 +86,7 @@ ul.vjs-menu-content::-webkit-scrollbar {
background-color: rgba(0, 0, 0, 0.75) !important;
border-radius: 9px !important;
padding: 5px !important;
line-height: 1.5 !important;
}
.vjs-play-control,

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 {

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');

View File

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

93
assets/js/pagination.js Normal file
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);
}
}
});

View File

@@ -5,6 +5,10 @@ var video_data = JSON.parse(document.getElementById('video_data').textContent);
var options = {
liveui: true,
playbackRates: [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0],
fontPercent: [0.5, 0.75, 1.25, 1.5, 1.75, 2, 3, 4],
windowOpacity: ['0', '0.5', '1'],
textOpacity: ['0.5', '1'],
persistTextTrackSettings: true,
controlBar: {
children: [
'playToggle',
@@ -134,26 +138,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);
}
});
@@ -174,7 +184,7 @@ var shareOptions = {
};
if (location.pathname.startsWith('/embed/')) {
var overlay_content = '<h1><a rel="noopener" target="_blank" href="' + location.origin + '/watch?v=' + video_data.id + '">' + player_data.title + '</a></h1>';
var overlay_content = '<h1><a rel="noopener noreferrer" target="_blank" href="' + location.origin + '/watch?v=' + video_data.id + '">' + player_data.title + '</a></h1>';
player.overlay({
overlays: [
{ start: 'loadstart', content: overlay_content, end: 'playing', align: 'top'},
@@ -444,7 +454,7 @@ if (!video_data.params.listen && video_data.params.annotations) {
if (target === 'current') {
location.href = path;
} else if (target === 'new') {
open(path, '_blank');
open(path, '_blank', 'noopener,noreferrer');
}
});
@@ -579,6 +589,13 @@ const toggle_captions = (function () {
};
})();
// For real-time updates to captions (if currently showing)
function update_captions() {
if (document.body.querySelector('.vjs-text-track-cue')) {
toggle_captions(); toggle_captions();
}
}
function toggle_fullscreen() {
player.isFullscreen() ? player.exitFullscreen() : player.requestFullscreen();
}
@@ -591,6 +608,34 @@ function increase_playback_rate(steps) {
player.playbackRate(options.playbackRates[newIndex]);
}
function increase_caption_size(steps) {
const maxIndex = options.fontPercent.length - 1;
const fontPercent = player.textTrackSettings.getValues().fontPercent || 1.25;
const curIndex = options.fontPercent.indexOf(fontPercent);
let newIndex = curIndex + steps;
newIndex = helpers.clamp(newIndex, 0, maxIndex);
player.textTrackSettings.setValues({ fontPercent: options.fontPercent[newIndex] });
update_captions();
}
function toggle_caption_window() {
const numOptions = options.windowOpacity.length;
const windowOpacity = player.textTrackSettings.getValues().windowOpacity || '0';
const curIndex = options.windowOpacity.indexOf(windowOpacity);
const newIndex = (curIndex + 1) % numOptions;
player.textTrackSettings.setValues({ windowOpacity: options.windowOpacity[newIndex] });
update_captions();
}
function toggle_caption_opacity() {
const numOptions = options.textOpacity.length;
const textOpacity = player.textTrackSettings.getValues().textOpacity || '1';
const curIndex = options.textOpacity.indexOf(textOpacity);
const newIndex = (curIndex + 1) % numOptions;
player.textTrackSettings.setValues({ textOpacity: options.textOpacity[newIndex] });
update_captions();
}
addEventListener('keydown', function (e) {
if (e.target.tagName.toLowerCase() === 'input') {
// Ignore input when focus is on certain elements, e.g. form fields.
@@ -686,6 +731,12 @@ addEventListener('keydown', function (e) {
case '>': action = increase_playback_rate.bind(this, 1); break;
case '<': action = increase_playback_rate.bind(this, -1); break;
case '=': action = increase_caption_size.bind(this, 1); break;
case '-': action = increase_caption_size.bind(this, -1); break;
case 'w': action = toggle_caption_window; break;
case 'o': action = toggle_caption_opacity; break;
default:
console.info('Unhandled key down event: %s:', decoratedKey, e);

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');

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'}, {

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;
@@ -137,7 +141,7 @@ function get_reddit_comments() {
</b> \
</p> \
<b> \
<a rel="noopener" target="_blank" href="https://reddit.com{permalink}">{redditPermalinkText}</a> \
<a rel="noopener noreferrer" target="_blank" href="https://reddit.com{permalink}">{redditPermalinkText}</a> \
</b> \
</div> \
<div>{contentHtml}</div> \

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}, {

View File

@@ -54,6 +54,54 @@ db:
##
#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 is required for the internal communication
## between Invidious companion and Invidious.
##
## The optional parameter public_url is the public URL from which
## Invidious companion is listening to the requests from the user(s).
## When this setting is commented out, Invidious proxy all requests to
## Invidious companion. Useful for simple setups.
## Otherwise, requests from the user(s) will reach Invidious companion directly.
## And you will need to configure a reverse proxy with separate routes
## for Invidious and Invidious companion.
## Read the post-install documentation for advanced reverse proxy
## documentation: https://docs.invidious.io/installation/#post-install-configuration
##
## Accepted values: "http(s)://<IP-HOSTNAME>:<Port>"
## Default: <none>
##
#invidious_companion:
# - private_url: "http://localhost:8282/companion"
# # Uncomment for advanced reverse proxy configuration (see above).
# # public_url: "http://localhost:8282/companion"
##
## API key for Invidious companion, used for securing the communication
## 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!!"
#########################################
#
@@ -130,6 +178,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)
@@ -178,11 +240,11 @@ https_only: false
##
## If unset, then no HTTP proxy will be used.
##
http_proxy:
user:
password:
host:
port:
#http_proxy:
# user:
# password:
# host:
# port:
##
@@ -797,14 +859,14 @@ default_user_preferences:
## Default video quality.
##
## Accepted values: dash, hd720, medium, small
## Default: hd720
## Default: dash
##
#quality: hd720
#quality: dash
##
## Default dash video quality.
##
## Note: this setting only takes effet if the
## Note: this setting only takes effect if the
## 'quality' parameter is set to "dash".
##
## Accepted values:

View File

@@ -14,6 +14,10 @@ services:
restart: unless-stopped
ports:
- "127.0.0.1:3000:3000"
depends_on:
invidious-db:
condition: service_healthy
restart: true
environment:
# Please read the following file for a comprehensive list of all available
# configuration options and their associated syntax:

View File

@@ -1,4 +1,4 @@
FROM crystallang/crystal:1.12.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,7 +32,7 @@ RUN if [[ "${release}" == 1 ]] ; then \
--link-flags "-lxml2 -llzma"; \
fi
FROM alpine:3.20
FROM alpine:3.21
RUN apk add --no-cache rsvg-convert ttf-opensans tini tzdata
WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \

View File

@@ -1,5 +1,5 @@
FROM alpine:3.20 AS builder
RUN apk add --no-cache 'crystal=1.12.2-r0' shards sqlite-static yaml-static yaml-dev libxml2-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
@@ -22,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 \
@@ -33,7 +33,7 @@ RUN if [[ "${release}" == 1 ]] ; then \
--link-flags "-lxml2 -llzma"; \
fi
FROM alpine:3.20
FROM alpine:3.21
RUN apk add --no-cache rsvg-convert ttf-opensans tini tzdata
WORKDIR /invidious
RUN addgroup -g 1000 -S invidious && \

View File

@@ -39,8 +39,6 @@
"User ID": "مُعرِّف المُستخدم",
"Password": "كلمة المرور",
"Time (h:mm:ss):": "الوقت (h:mm:ss):",
"Text CAPTCHA": "نص الكابتشا",
"Image CAPTCHA": "صورة الكابتشا",
"Sign In": "إنشاء حساب",
"Register": "التسجيل",
"E-mail": "البريد الإلكتروني",
@@ -154,8 +152,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": "إخفاء الردود",
@@ -559,10 +557,18 @@
"toggle_theme": "تبديل الموضوع",
"Add to playlist": "أضف إلى قائمة التشغيل",
"Add to playlist: ": "أضف إلى قائمة التشغيل: ",
"Answer": "الرد",
"Answer": "اجابة",
"Search for videos": "ابحث عن مقاطع الفيديو",
"The Popular feed has been disabled by the administrator.": "تم تعطيل الخلاصة الشائعة من قبل المسؤول.",
"carousel_slide": "الشريحة {{current}} من {{total}}",
"carousel_skip": "تخطي الكاروسيل",
"carousel_go_to": "انتقل إلى الشريحة `x`"
"carousel_go_to": "انتقل إلى الشريحة `x`",
"preferences_preload_label": "التحميل المسبق لبيانات الفيديو: ",
"Filipino (auto-generated)": "الفلبينية (المولدة تلقائيًا)",
"channel_tab_courses_label": "الدورات",
"channel_tab_posts_label": "المنشورات",
"First page": "الصفحة الأولى",
"timeline_parse_error_placeholder_heading": "غير قادر على تحليل العنصر",
"timeline_parse_error_placeholder_message": "واجه Invidious خطأ أثناء محاولة تحليل هذا العنصر. لمزيد من المعلومات انظر أدناه:",
"timeline_parse_error_show_technical_details": "عرض التفاصيل التقنية"
}

View File

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

View File

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

View File

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

View File

@@ -167,7 +167,6 @@
"comments_points_count_plural": "{{count}} punts",
"%A %B %-d, %Y": "%A %B %-d, %Y",
"Create playlist": "Crear llista de reproducció",
"Text CAPTCHA": "Text CAPTCHA",
"Next page": "Pàgina següent",
"preferences_category_visual": "Preferències visuals",
"preferences_unseen_only_label": "Mostra només no vistos: ",
@@ -204,7 +203,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à",
@@ -387,7 +386,6 @@
"Delete account?": "Esborrar compte?",
"Please log in": "Si us plau inicieu sessió",
"Import NewPipe data (.zip)": "Importar dades de NewPipe (.zip)",
"Image CAPTCHA": "Imatge CAPTCHA",
"channel_tab_streams_label": "Transmissions en directe",
"preferences_category_misc": "Preferències diverses",
"preferences_annotations_subscribed_label": "Mostra les anotacions per defecte dels canals subscrits? ",
@@ -489,5 +487,16 @@
"generic_button_delete": "Suprimeix",
"Import YouTube watch history (.json)": "Importa l'historial de visualitzacions de YouTube (.json)",
"Answer": "Resposta",
"toggle_theme": "Commuta el tema"
"toggle_theme": "Commuta el tema",
"Add to playlist": "Afegeix a la llista de reproducció",
"Add to playlist: ": "Afegeix a la llista de reproducció: ",
"Search for videos": "Cercar vídeos",
"carousel_slide": "Diapositiva {{current}} de {{total}}",
"preferences_preload_label": "Precarregar dades del vídeo: ",
"carousel_go_to": "Anar a la diapositiva `x`",
"First page": "Primera pàgina",
"Filipino (auto-generated)": "Filipí (generat automàticament)",
"channel_tab_courses_label": "Cursos",
"channel_tab_posts_label": "Missatges",
"carousel_skip": "Saltar l'exhibició"
}

View File

@@ -39,8 +39,6 @@
"User ID": "ID uživatele",
"Password": "Heslo",
"Time (h:mm:ss):": "Čas (h:mm:ss):",
"Text CAPTCHA": "Textové CAPTCHA",
"Image CAPTCHA": "Obrázkové CAPTCHA",
"Sign In": "Přihlásit se",
"Register": "Vytvořit účet",
"E-mail": "E-mail",
@@ -137,7 +135,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 +292,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 +350,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 +369,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 +378,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",
@@ -513,5 +511,15 @@
"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`"
"carousel_go_to": "Přejít na snímek `x`",
"preferences_preload_label": "Předem načíst data videa: ",
"Filipino (auto-generated)": "Filipínština (vytvořeno automaticky)",
"First page": "První stránka",
"channel_tab_courses_label": "Kurzy",
"channel_tab_posts_label": "Příspěvky",
"timeline_parse_error_show_technical_details": "Zobrazit technické podrobnosti",
"timeline_parse_error_placeholder_message": "Invidious narazil při pokusu o zpracování této položky na chybu. Další informace naleznete níže:",
"timeline_parse_error_placeholder_heading": "Nepodařilo se zpracovat položku",
"preferences_default_playlist": "Výchozí playlist: ",
"preferences_default_playlist_none": "Nenastaven žádný výchozí playlist"
}

View File

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

View File

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

View File

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

View File

@@ -21,7 +21,7 @@
"Import and Export Data": "Εισαγωγή και Εξαγωγή Δεδομένων",
"Import": "Εισαγωγή",
"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)",
@@ -39,8 +39,6 @@
"User ID": "Ταυτότητα χρήστη",
"Password": "Κωδικός πρόσβασης",
"Time (h:mm:ss):": "Ώρα (ω:λλ:δδ):",
"Text CAPTCHA": "Κείμενο CAPTCHA",
"Image CAPTCHA": "Εικόνα CAPTCHA",
"Sign In": "Εγγραφή",
"Register": "Εγγραφή",
"E-mail": "Ηλεκτρονικό ταχυδρομείο",
@@ -455,7 +453,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}} μη αναγνωσμένη ειδοποίηση",
@@ -490,9 +488,16 @@
"Search for videos": "Αναζήτηση βίντεο",
"The Popular feed has been disabled by the administrator.": "Η δημοφιλής ροή έχει απενεργοποιηθεί από τον διαχειριστή.",
"Answer": "Απάντηση",
"Add to playlist": "Λίιστα αναπαραγωγής",
"Add to playlist: ": "Λίστα αναπαραγωγής: ",
"Add to playlist": "Προσθήκη στην λίστα αναπαραγωγής",
"Add to playlist: ": "Προσθήκη στην λίστα αναπαραγωγής : ",
"carousel_slide": "Εικόνα {{current}}απο {{total}}",
"carousel_go_to": "Πήγαινε στην εικόνα`x`",
"toggle_theme": "Αλλαγή θέματος"
"toggle_theme": "Αλλαγή θέματος",
"Import YouTube watch history (.json)": "Εισαγωγή ιστορικού προβολής YouTube (.json)",
"Filipino (auto-generated)": "Φιλιππινέζικα (αυτόματη παραγωγή)",
"preferences_preload_label": "Προφόρτιση δεδομένων βίντεο: ",
"carousel_skip": "Αποφυγή εμφάνισης εικόνων",
"First page": "Πρώτη σελίδα",
"channel_tab_courses_label": "Μαθήματα",
"channel_tab_posts_label": "Δημοσιεύσεις"
}

View File

@@ -33,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",
@@ -63,8 +64,6 @@
"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",
@@ -123,6 +122,8 @@
"Redirect homepage to feed: ": "Redirect homepage to feed: ",
"preferences_max_results_label": "Number of videos shown in feed: ",
"preferences_sort_label": "Sort videos by: ",
"preferences_default_playlist": "Default playlist: ",
"preferences_default_playlist_none": "No default playlist set",
"published": "published",
"published - reverse": "published - reverse",
"alphabetically": "alphabetically",
@@ -492,11 +493,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_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`"
"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"
}

View File

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

View File

@@ -39,8 +39,6 @@
"User ID": "Nombre",
"Password": "Contraseña",
"Time (h:mm:ss):": "Hora (h:mm:ss):",
"Text CAPTCHA": "CAPTCHA en texto",
"Image CAPTCHA": "CAPTCHA en imagen",
"Sign In": "Iniciar sesión",
"Register": "Registrarse",
"E-mail": "Correo",
@@ -78,6 +76,8 @@
"Redirect homepage to feed: ": "Redirigir la página de inicio a la fuente: ",
"preferences_max_results_label": "Número de videos mostrados en la fuente: ",
"preferences_sort_label": "Ordenar los videos por: ",
"preferences_default_playlist": "Lista de reproducción por defecto: ",
"preferences_default_playlist_none": "Ninguna lista de reproducción por defecto establecida",
"published": "fecha de publicación",
"published - reverse": "fecha de publicación: orden inverso",
"alphabetically": "alfabéticamente",
@@ -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",
@@ -317,7 +317,7 @@
"`x` marked it with a ❤": "`x` lo ha marcado con un ❤",
"Audio mode": "Modo de audio",
"Video mode": "Modo de video",
"channel_tab_videos_label": "Videos",
"channel_tab_videos_label": "Vídeos",
"Playlists": "Listas de reproducción",
"channel_tab_community_label": "Comunidad",
"search_filters_sort_option_relevance": "Relevancia",
@@ -412,8 +412,8 @@
"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 reproducciones",
"generic_playlists_count_2": "{{count}} listas de reproducciones",
"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",
@@ -437,7 +437,7 @@
"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_read_the_faq": "lee 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>",
@@ -463,7 +463,7 @@
"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.",
@@ -480,7 +480,7 @@
"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>",
"error_video_not_in_playlist": "El vídeo que has solicitado no existe en esta lista de reproducción. <a href=\"`x`\">Haz clic aquí para acceder a la página de inicio de la lista de reproducción.</a>",
"channel_tab_streams_label": "Directos",
"channel_tab_channels_label": "Canales",
"channel_tab_shorts_label": "Cortos",
@@ -500,7 +500,7 @@
"generic_button_cancel": "Cancelar",
"generic_button_rss": "RSS",
"channel_tab_podcasts_label": "Podcasts",
"channel_tab_releases_label": "Publicaciones",
"channel_tab_releases_label": "Lanzamientos",
"generic_channels_count_0": "{{count}} canal",
"generic_channels_count_1": "{{count}} canales",
"generic_channels_count_2": "{{count}} canales",
@@ -513,5 +513,13 @@
"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`"
"carousel_go_to": "Ir a la diapositiva `x`",
"preferences_preload_label": "Precargar datos del vídeo: ",
"Filipino (auto-generated)": "Filipino (generados automáticamente)",
"channel_tab_posts_label": "Publicaciones",
"First page": "Primera página",
"channel_tab_courses_label": "Cursos",
"timeline_parse_error_show_technical_details": "Enseñar detalles técnicos",
"timeline_parse_error_placeholder_message": "Invidious ha encontrado un error al tratar de procesar este elemento. Para más información ver abajo:",
"timeline_parse_error_placeholder_heading": "Imposible procesar este elemento"
}

View File

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

View File

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

View File

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

View File

@@ -39,8 +39,6 @@
"User ID": "Käyttäjätunnus",
"Password": "Salasana",
"Time (h:mm:ss):": "Aika (h:mm:ss):",
"Text CAPTCHA": "Teksti-CAPTCHA",
"Image CAPTCHA": "Kuva-CAPTCHA",
"Sign In": "Kirjaudu sisään",
"Register": "Rekisteröidy",
"E-mail": "Sähköposti",
@@ -460,7 +458,7 @@
"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ä: ",
@@ -496,5 +494,8 @@
"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"
"toggle_theme": "Vaihda teemaa",
"preferences_preload_label": "Esilataa video data. ",
"timeline_parse_error_show_technical_details": "Näytä tekniset yksityiskohdat",
"First page": "Ensimmäinen sivu"
}

View File

@@ -62,8 +62,6 @@
"User ID": "Identifiant utilisateur",
"Password": "Mot de passe",
"Time (h:mm:ss):": "Heure (h:mm:ss) :",
"Text CAPTCHA": "CAPTCHA textuel",
"Image CAPTCHA": "CAPTCHA pictural",
"Sign In": "S'identifier",
"Register": "S'inscrire",
"E-mail": "Courriel",
@@ -505,7 +503,7 @@
"channel_tab_releases_label": "Parutions",
"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 : ",
"Add to playlist": "Ajouter à la playlist",
"Answer": "Répondre",
"Search for videos": "Rechercher des vidéos",
@@ -513,5 +511,11 @@
"carousel_skip": "Passez le carrousel",
"carousel_slide": "Diapositive {{current}} sur {{total}}",
"carousel_go_to": "Aller à la diapositive `x`",
"toggle_theme": "Changer le Thème"
"toggle_theme": "Changer le Thème",
"Filipino (auto-generated)": "Philippines (automatiquement générer)",
"preferences_preload_label": "Précharger les données de la vidéo : ",
"First page": "Première page",
"channel_tab_courses_label": "Cours",
"channel_tab_posts_label": "Messages",
"timeline_parse_error_show_technical_details": "Afficher les détails techniques"
}

506
locales/gsw.json Normal file
View File

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

View File

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

View File

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

View File

@@ -39,8 +39,6 @@
"User ID": "Korisnički ID",
"Password": "Lozinka",
"Time (h:mm:ss):": "Vrijeme (h:mm:ss):",
"Text CAPTCHA": "Tekstualni CAPTCHA",
"Image CAPTCHA": "Slikovni CAPTCHA",
"Sign In": "Prijavi se",
"Register": "Registriraj se",
"E-mail": "E-mail adresa",
@@ -513,5 +511,13 @@
"toggle_theme": "Uklj./Isklj. temu",
"carousel_slide": "Kadar {{current}} od {{total}}",
"carousel_go_to": "Idi na kadar `x`",
"carousel_skip": "Preskoči vrtuljak"
"carousel_skip": "Preskoči vrtuljak",
"Filipino (auto-generated)": "Filipinski (automatski generirano)",
"preferences_preload_label": "Unaprijed učitaj podatke videa: ",
"channel_tab_posts_label": "Objave",
"timeline_parse_error_placeholder_heading": "Nije moguće obraditi stavku",
"timeline_parse_error_placeholder_message": "Invidious je naišao na grešku prilikom obrade ove stavke. Za više informacija pogledajte niže dolje:",
"timeline_parse_error_show_technical_details": "Prikaži tehničke detalje",
"First page": "Prva stranica",
"channel_tab_courses_label": "Tečajevi"
}

View File

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

View File

@@ -5,7 +5,6 @@
"oldest": "plus ancian",
"published": "data de publication",
"invidious": "Invidious",
"Image CAPTCHA": "Imagine CAPTCHA",
"newest": "plus nove",
"generic_button_save": "Salveguardar",
"Dark mode: ": "Modo obscur: ",

View File

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

View File

@@ -2,7 +2,7 @@
"LIVE": "BEINT",
"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 spilunarlista á YouTube",
"newest": "nýjasta",
@@ -14,8 +14,8 @@
"Clear watch history?": "Hreinsa áhorfsferil?",
"New password": "Nýtt lykilorð",
"New passwords must match": "Nýtt lykilorð verður að passa",
"Authorize token?": "Leyfa teikn?",
"Authorize token for `x`?": "Leyfa teikn fyrir `x`?",
"Authorize token?": "Auðkenna teikn?",
"Authorize token for `x`?": "Auðkenna teikn fyrir `x`?",
"Yes": "Já",
"No": "Nei",
"Import and Export Data": "Inn- og útflutningur gagna",
@@ -36,17 +36,15 @@
"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",
"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_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æsta myndskeið sjálfkrafa: ",
@@ -85,7 +83,7 @@
"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 áhorfsferil",
@@ -104,8 +102,8 @@
"Registration enabled: ": "Nýskráning virkjuð? ",
"Report statistics: ": "Skrá tölfræði? ",
"Save preferences": "Vista stillingar",
"Subscription manager": "Áskriftarstjóri",
"Token manager": "Teiknastjórnun",
"Subscription manager": "Áskriftastýring",
"Token manager": "Teiknastýring",
"Token": "Teikn",
"Import/export": "Flytja inn/út",
"unsubscribe": "afskrá",
@@ -233,7 +231,7 @@
"Korean": "Kóreska",
"Kurdish": "Kúrdíska",
"Kyrgyz": "Kirgisíska",
"Lao": "Laó",
"Lao": "Laóska",
"Latin": "Latína",
"Latvian": "Lettneska",
"Lithuanian": "Litháíska",
@@ -295,18 +293,18 @@
"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",
"Audio mode": "Hljóðhamur",
"Video mode": "Myndhamur",
"channel_tab_videos_label": "Myndskeið",
"Playlists": "Spilunarlistar",
"channel_tab_community_label": "Samfélag",
@@ -388,7 +386,7 @@
"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": "Stuttmyndir",
"channel_tab_shorts_label": "Símamyndir",
"carousel_slide": "Skyggna {{current}} af {{total}}",
"carousel_go_to": "Fara á skyggnu `x`",
"channel_tab_streams_label": "Bein streymi",
@@ -401,8 +399,8 @@
"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ður",
"generic_count_months_plural": "{{count}} mánuðir",
"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>",
@@ -429,11 +427,11 @@
"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}} klukkustundir",
"generic_count_years": "{{count}} ár",
"generic_count_years_plural": "{{count}} ár",
"generic_count_weeks": "{{count}} vika",
"generic_count_weeks_plural": "{{count}} vikur",
"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",
@@ -476,8 +474,8 @@
"preferences_quality_dash_option_144p": "144p",
"invidious": "Invidious",
"Korean (auto-generated)": "Kóreska (sjálfvirkt útbúið)",
"generic_count_days": "{{count}} dagur",
"generic_count_days_plural": "{{count}} dagar",
"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",
@@ -496,5 +494,13 @@
"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_quality_option_dash": "DASH (aðlaganleg gæði)",
"preferences_preload_label": "Forhlaða gögnum myndskeiðs: ",
"Filipino (auto-generated)": "Filippínska (sjálfvirkt útbúin)",
"channel_tab_posts_label": "Færslur",
"First page": "Fyrsta síða",
"channel_tab_courses_label": "Kennsluefni",
"timeline_parse_error_placeholder_heading": "Tekst ekki að meðhöndla þetta atriði",
"timeline_parse_error_placeholder_message": "Invidious rakst á villu við að reyna að meðhöndla þetta atriði. Skoðaðu nánari upplýsingar hér fyrir neðan:",
"timeline_parse_error_show_technical_details": "Sýna nánari tæknilegar upplýsingar"
}

View File

@@ -48,8 +48,6 @@
"User ID": "ID utente",
"Password": "Password",
"Time (h:mm:ss):": "Orario (h:mm:ss):",
"Text CAPTCHA": "Testo del CAPTCHA",
"Image CAPTCHA": "Immagine CAPTCHA",
"Sign In": "Accedi",
"Register": "Registrati",
"E-mail": "E-mail",
@@ -129,7 +127,7 @@
"subscriptions_unseen_notifs_count_0": "{{count}} notifica non visualizzata",
"subscriptions_unseen_notifs_count_1": "{{count}} notifiche non visualizzate",
"subscriptions_unseen_notifs_count_2": "{{count}} notifiche non visualizzate",
"search": "Cerca",
"search": "cerca",
"Log out": "Esci",
"Source available here.": "Codice sorgente.",
"View JavaScript license information.": "Guarda le informazioni di licenza del codice JavaScript.",
@@ -469,8 +467,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",
@@ -513,5 +511,13 @@
"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`"
"carousel_go_to": "Vai al fotogramma `x`",
"preferences_preload_label": "Precarica dati video: ",
"Filipino (auto-generated)": "Filippino (generati automaticamente)",
"First page": "Prima pagina",
"channel_tab_courses_label": "Corsi",
"channel_tab_posts_label": "Post",
"timeline_parse_error_show_technical_details": "Mostra i dettagli tecnici",
"timeline_parse_error_placeholder_message": "Invidious ha riscontrato un errore tentando di leggere questo elemento. Per altre informazioni vedi di seguito:",
"timeline_parse_error_placeholder_heading": "Lettura elemento non riuscita"
}

View File

@@ -25,7 +25,7 @@
"No": "いいえ",
"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)",
@@ -44,8 +44,6 @@
"User ID": "ユーザー ID",
"Password": "パスワード",
"Time (h:mm:ss):": "時間 (時:分分:秒秒):",
"Text CAPTCHA": "テキスト CAPTCHA",
"Image CAPTCHA": "画像 CAPTCHA",
"Sign In": "サインイン",
"Register": "登録",
"E-mail": "メールアドレス",
@@ -68,7 +66,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 +75,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: ": "ホームからフィードにリダイレクト: ",
@@ -125,7 +123,7 @@
"subscriptions_unseen_notifs_count_0": "{{count}}件の未読通知",
"search": "検索",
"Log out": "ログアウト",
"Released under the AGPLv3 on Github.": "GitHub上でAGPLv3の元で公開",
"Released under the AGPLv3 on Github.": "GitHub 上で AGPLv3 の元で公開",
"Source available here.": "ソースはここで閲覧可能です。",
"View JavaScript license information.": "JavaScriptライセンス情報",
"View privacy policy.": "個人情報保護方針",
@@ -143,8 +141,8 @@
"Editing playlist `x`": "再生リスト `x` を編集中",
"Show more": "もっと見る",
"Show less": "表示を少なく",
"Watch on YouTube": "YouTubeで視聴",
"Switch Invidious Instance": "Invidiousインスタンスの変更",
"Watch on YouTube": "YouTube で視聴",
"Switch Invidious Instance": "Invidious インスタンスの変更",
"Hide annotations": "アノテーションを隠す",
"Show annotations": "アノテーションを表示",
"Genre: ": "ジャンル: ",
@@ -330,7 +328,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 +341,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": "今週",
@@ -365,13 +363,13 @@
"Current version: ": "現在のバージョン: ",
"next_steps_error_message": "以下をお試しください: ",
"next_steps_error_message_refresh": "再読み込み",
"next_steps_error_message_go_to_youtube": "YouTubeを開く",
"next_steps_error_message_go_to_youtube": "YouTube を開く",
"search_filters_duration_option_short": "4分未満",
"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": "寄付する",
@@ -399,7 +397,7 @@
"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": "中国語",
@@ -446,7 +444,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": "再生リスト",
@@ -479,5 +477,15 @@
"carousel_go_to": "スライド`x`を表示",
"carousel_slide": "スライド{{current}} / 全{{total}}個中",
"carousel_skip": "画像のスライド表示をスキップ",
"toggle_theme": "テーマの切り替え"
"toggle_theme": "テーマの切り替え",
"preferences_preload_label": "動画データを事前に読み込む: ",
"Filipino (auto-generated)": "フィリピノ語 (自動生成)",
"First page": "最初のページ",
"channel_tab_posts_label": "投稿",
"channel_tab_courses_label": "コース",
"timeline_parse_error_placeholder_message": "Invidious によるこの項目の解析中にエラーが発生。詳細は以下:",
"timeline_parse_error_placeholder_heading": "この項目を解析できません",
"timeline_parse_error_show_technical_details": "技術的詳細を表示",
"preferences_default_playlist": "デフォルトのプレイリスト: ",
"preferences_default_playlist_none": "デフォルトのプレイリストは設定されていません"
}

View File

@@ -36,8 +36,6 @@
"Register": "회원가입",
"Sign In": "로그인",
"preferences_category_misc": "기타 설정",
"Image CAPTCHA": "이미지 캡차",
"Text CAPTCHA": "텍스트 캡차",
"Time (h:mm:ss):": "시각 (h:mm:ss):",
"Password": "비밀번호",
"User ID": "사용자 ID",
@@ -70,7 +68,7 @@
"Next page": "다음 페이지",
"last": "마지막",
"Shared `x` ago": "`x` 전",
"popular": "인기",
"popular": "인기",
"oldest": "과거순",
"newest": "최신순",
"View playlist on YouTube": "유튜브에서 재생목록 보기",
@@ -419,7 +417,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)": "중국어 (중국)",
@@ -479,5 +477,10 @@
"carousel_go_to": "`x` 슬라이드로 이동",
"Search for videos": "비디오 검색",
"toggle_theme": "테마 전환",
"carousel_slide": "{{total}}의 슬라이드 {{current}}"
"carousel_slide": "{{total}}의 슬라이드 {{current}}",
"preferences_preload_label": "비디오 데이터 사전 로드: ",
"First page": "첫 페이지",
"Filipino (auto-generated)": "Filipino (auto-generated)",
"channel_tab_posts_label": "게시글",
"channel_tab_courses_label": "코스"
}

View File

@@ -44,8 +44,6 @@
"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",

View File

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

143
locales/lv.json Normal file
View File

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

View File

@@ -39,8 +39,6 @@
"User ID": "Bruker-ID",
"Password": "Passord",
"Time (h:mm:ss):": "Tid (h:mm:ss):",
"Text CAPTCHA": "Tekst-CAPTCHA",
"Image CAPTCHA": "Bilde-CAPTCHA",
"Sign In": "Innlogging",
"Register": "Registrer",
"E-mail": "E-post",
@@ -496,5 +494,6 @@
"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"
"toggle_theme": "Endre utseende",
"preferences_preload_label": "Last videodata på forhånd: "
}

View File

@@ -39,8 +39,6 @@
"User ID": "Gebruikers-id",
"Password": "Wachtwoord",
"Time (h:mm:ss):": "Tijd (h:mm:ss):",
"Text CAPTCHA": "Tekst-CAPTCHA",
"Image CAPTCHA": "Afbeelding-CAPTCHA",
"Sign In": "Inloggen",
"Register": "Registreren",
"E-mail": "E-mailadres",
@@ -496,5 +494,13 @@
"Answer": "Antwoorden",
"Search for videos": "Naar video's zoeken",
"carousel_skip": "Carousel overslaan",
"toggle_theme": "Thema omschakelen"
"toggle_theme": "Thema omschakelen",
"preferences_preload_label": "Videogegevens vooraf laden: ",
"Filipino (auto-generated)": "Filipijns (automatisch gegenereerd)",
"channel_tab_courses_label": "Cursussen",
"First page": "Eerste pagina",
"channel_tab_posts_label": "Gepost",
"timeline_parse_error_placeholder_heading": "Kan item niet parsen",
"timeline_parse_error_placeholder_message": "Invidious kwam een fout tegen bij het proberen te parsen van dit item. Voor meer informatie, kijk hieronder:",
"timeline_parse_error_show_technical_details": "Technische details weergeven"
}

View File

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

View File

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

View File

@@ -1,27 +1,27 @@
{
"LIVE": "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,36 @@
"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 +72,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 +86,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,28 +107,29 @@
"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",
@@ -139,7 +138,7 @@
"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,27 +149,27 @@
"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`",
@@ -180,20 +179,20 @@
"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 +208,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 +251,7 @@
"Macedonian": "Macedónio",
"Malagasy": "Malgaxe",
"Malay": "Malaio",
"Malayalam": "Malaiala",
"Malayalam": "Malaialaio",
"Maltese": "Maltês",
"Maori": "Maori",
"Marathi": "Marathi",
@@ -297,30 +296,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 +334,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 +344,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 +359,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 +415,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 +446,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 +469,55 @@
"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",
"timeline_parse_error_placeholder_heading": "Incapaz de processar o elemento",
"timeline_parse_error_placeholder_message": "O Invidious encontrou um problema ao processar este elemento. Para mais informações, veja abaixo:",
"timeline_parse_error_show_technical_details": "Mostrar detalhes técnicos"
}

View File

@@ -236,8 +236,6 @@
"Preferences": "Preferências",
"E-mail": "E-mail",
"Register": "Registar",
"Image CAPTCHA": "Imagem CAPTCHA",
"Text CAPTCHA": "Texto CAPTCHA",
"Time (h:mm:ss):": "Tempo (h:mm:ss):",
"Password": "Palavra-passe",
"User ID": "Utilizador",
@@ -513,5 +511,10 @@
"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."
"The Popular feed has been disabled by the administrator.": "O feed Popular foi desativado por um administrador.",
"preferences_preload_label": "Pré-carregamento dos dados: ",
"Filipino (auto-generated)": "Filipino (gerado automaticamente)",
"First page": "Primeira página",
"channel_tab_courses_label": "Cursos",
"channel_tab_posts_label": "Publicações"
}

View File

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

View File

@@ -11,6 +11,7 @@
"last": "последние",
"Next page": "Следующая страница",
"Previous page": "Предыдущая страница",
"First page": "Первая страница",
"Clear watch history?": "Очистить историю просмотров?",
"New password": "Новый пароль",
"New passwords must match": "Новые пароли не совпадают",
@@ -21,7 +22,7 @@
"Import and Export Data": "Импорт и экспорт данных",
"Import": "Импорт",
"Import Invidious data": "Импортировать JSON с данными Invidious",
"Import YouTube subscriptions": "Импортировать подписки из CSV или 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)",
@@ -39,8 +40,6 @@
"User ID": "ИД пользователя",
"Password": "Пароль",
"Time (h:mm:ss):": "Время (ч:мм:сс):",
"Text CAPTCHA": "Текстовая капча (англ.)",
"Image CAPTCHA": "Капча-картинка",
"Sign In": "Войти",
"Register": "Регистрация",
"E-mail": "Эл. почта",
@@ -48,8 +47,8 @@
"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": "Скорость видео по умолчанию: ",
@@ -474,7 +473,7 @@
"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_filters_duration_option_medium": "Средние (4 - 20 минут)",
@@ -510,8 +509,17 @@
"Answer": "Ответить",
"Search for videos": "Поиск видео",
"The Popular feed has been disabled by the administrator.": "Лента популярного была отключена администратором.",
"toggle_theme": "Переключатель тем",
"carousel_slide": "Пролистано {{current}} из {{total}}",
"toggle_theme": "Переключить тему оформления",
"carousel_slide": "Слайд {{current}} из {{total}}",
"carousel_skip": "Пропустить всё",
"carousel_go_to": "Перейти к странице `x`"
"carousel_go_to": "Перейти на слайд `x`",
"preferences_preload_label": "Предзагрузка видеоданных: ",
"channel_tab_courses_label": "Курсы",
"channel_tab_posts_label": "Записи",
"timeline_parse_error_placeholder_message": "Invidious столкнулся с ошибкой, пытаясь разобрать с этот элемент. Подробнее смотрите ниже:",
"timeline_parse_error_placeholder_heading": "Невозможно разобрать элемент",
"timeline_parse_error_show_technical_details": "Показать технические подробности",
"Filipino (auto-generated)": "Филиппинский (автоматически сгенерировано)",
"preferences_default_playlist": "Плейлист по умолчанию: ",
"preferences_default_playlist_none": "Плейлист по умолчанию не указан"
}

View File

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

View File

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

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",
@@ -24,9 +24,7 @@
"User ID": "ID uporabnika",
"Password": "Geslo",
"Time (h:mm:ss):": "Čas (h:mm:ss):",
"Text CAPTCHA": "Besedilo CAPTCHA",
"source": "izvorna koda",
"Image CAPTCHA": "Slika CAPTCHA",
"Sign In": "Prijavi se",
"Register": "Registriraj se",
"E-mail": "E-pošta",
@@ -105,7 +103,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 +460,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",
@@ -521,5 +519,22 @@
"generic_channels_count_1": "{{count}} kanala",
"generic_channels_count_2": "{{count}} kanali",
"generic_channels_count_3": "{{count}} kanalov",
"Import YouTube watch history (.json)": "Uvozi zgodovino gledanja YouTube (.json)"
"Import YouTube watch history (.json)": "Uvozi zgodovino gledanja YouTube (.json)",
"Add to playlist": "Dodaj na seznam predvajanja",
"Add to playlist: ": "Dodaj na seznam predvajanja: ",
"Search for videos": "Iskanje videoposnetkov",
"The Popular feed has been disabled by the administrator.": "Administrator je onemogočil priljubljeni vir.",
"Answer": "Odgovor",
"Filipino (auto-generated)": "filipinščina (samodejno ustvarjeno)",
"toggle_theme": "Preklopi temo",
"carousel_slide": "Diapozitiv {{current}} od {{total}}",
"carousel_skip": "Preskoči galerijo",
"carousel_go_to": "Pojdi na diapozitiv `x`",
"preferences_preload_label": "Predhodno naloži video podatke: ",
"First page": "Prva stran",
"channel_tab_courses_label": "Tečaji",
"channel_tab_posts_label": "Objave",
"timeline_parse_error_placeholder_heading": "Elementa ni mogoče razčleniti",
"timeline_parse_error_placeholder_message": "Invidious je naletel na napako pri poskusu razčlenitve tega elementa. Za več informacij glej spodaj:",
"timeline_parse_error_show_technical_details": "Pokaži tehnične podrobnosti"
}

View File

@@ -42,8 +42,6 @@
"User ID": "ID Përdoruesi",
"Password": "Fjalëkalim",
"Time (h:mm:ss):": "Kohë (h:mm:ss):",
"Text CAPTCHA": "CAPTCHA Tekst",
"Image CAPTCHA": "CAPTCHA Figurë",
"Sign In": "Hyni",
"Register": "Regjistrohuni",
"E-mail": "Email",
@@ -492,5 +490,11 @@
"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`"
"carousel_go_to": "Kalo te diapozitivi `x`",
"Filipino (auto-generated)": "Filipineze (të prodhuara automatikisht)",
"preferences_preload_label": "Parangarko të dhëna videoje: ",
"toggle_theme": "Ndërroni Temë",
"channel_tab_courses_label": "Kurse",
"channel_tab_posts_label": "Postime",
"First page": "Faqja e parë"
}

View File

@@ -39,8 +39,6 @@
"User ID": "ID korisnika",
"Password": "Lozinka",
"Time (h:mm:ss):": "Vreme (č:mm:ss):",
"Text CAPTCHA": "Tekst CAPTCHA",
"Image CAPTCHA": "Slika CAPTCHA",
"Sign In": "Prijava",
"Register": "Registracija",
"E-mail": "Imejl",
@@ -513,5 +511,13 @@
"Answer": "Odgovor",
"Search for videos": "Pretražite video snimke",
"carousel_skip": "Preskoči karusel",
"toggle_theme": "Подеси тему"
"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",
"timeline_parse_error_placeholder_heading": "Nije moguće raščlaniti predmet",
"timeline_parse_error_show_technical_details": "Prikaži tehničke detalje",
"timeline_parse_error_placeholder_message": "Invidious je naišao na grešku prilikom pokušaja raščlanjivanja ovog predmeta. Za više informacija pogledajte ispod:"
}

View File

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

View File

@@ -39,8 +39,6 @@
"User ID": "Användar-ID",
"Password": "Lösenord",
"Time (h:mm:ss):": "Tid (h:mm:ss):",
"Text CAPTCHA": "Text-CAPTCHA",
"Image CAPTCHA": "Bild-CAPTCHA",
"Sign In": "Inloggning",
"Register": "Registrera",
"E-mail": "E-post",
@@ -496,5 +494,10 @@
"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`"
"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"
}

506
locales/ta.json Normal file
View File

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

View File

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

1
locales/tok.json Normal file
View File

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

View File

@@ -39,8 +39,6 @@
"User ID": "Kullanıcı Kimliği",
"Password": "Parola",
"Time (h:mm:ss):": "Zaman (h:mm:ss):",
"Text CAPTCHA": "Metin CAPTCHA",
"Image CAPTCHA": "Resim CAPTCHA",
"Sign In": "Oturum Aç",
"Register": "Kayıt Ol",
"E-mail": "E-Posta",
@@ -496,5 +494,13 @@
"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ı."
"The Popular feed has been disabled by the administrator.": "Popüler akışı yönetici tarafından devre dışı bırakıldı.",
"preferences_preload_label": "Video verilerini önceden yükle: ",
"First page": "İlk sayfa",
"Filipino (auto-generated)": "Filipince (oto-oluşturuldu)",
"channel_tab_courses_label": "Kurslar",
"channel_tab_posts_label": "Yazılar",
"timeline_parse_error_placeholder_heading": "Öge ayrıştıramıyor",
"timeline_parse_error_placeholder_message": "Invidious, bu ögeyi ayrıştırmaya çalışırken bir hatayla karşılaştı. Daha fazla bilgi için aşağıya bakın:",
"timeline_parse_error_show_technical_details": "Teknik ayrıntıları göster"
}

View File

@@ -39,8 +39,6 @@
"User ID": "ID користувача",
"Password": "Пароль",
"Time (h:mm:ss):": "Час (г:хх:сс):",
"Text CAPTCHA": "Текст CAPTCHA",
"Image CAPTCHA": "Зображення CAPTCHA",
"Sign In": "Увійти",
"Register": "Зареєструватися",
"E-mail": "Електронна пошта",
@@ -513,5 +511,13 @@
"The Popular feed has been disabled by the administrator.": "Стрічка Популярні вимкнена адміністратором.",
"carousel_slide": "Слайд {{current}} з {{total}}",
"carousel_skip": "Пропустити карусель",
"carousel_go_to": "Перейти до слайда `x`"
"carousel_go_to": "Перейти до слайда `x`",
"preferences_preload_label": "Попереднє завантаження відеоданих: ",
"Filipino (auto-generated)": "Філіппінська (згенеровано автоматично)",
"First page": "Перша сторінка",
"channel_tab_courses_label": "Курси",
"channel_tab_posts_label": "Дописи",
"timeline_parse_error_placeholder_heading": "Неможливо розібрати елемент",
"timeline_parse_error_show_technical_details": "Показати технічні подробиці",
"timeline_parse_error_placeholder_message": "Invidious зіткнувся з помилкою під час спроби розібрати цей елемент. Докладнішу інформацію читайте нижче:"
}

View File

@@ -41,8 +41,6 @@
"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": "CAPTCHA dạng chữ",
"Image CAPTCHA": "CAPTCHA dạng ảnh",
"Sign In": "Đăng nhập",
"Register": "Đăng ký",
"E-mail": "E-mail",
@@ -314,11 +312,11 @@
"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ờ qua",
"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 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",
@@ -479,5 +477,8 @@
"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ý."
"The Popular feed has been disabled by the administrator.": "Bảng tin phổ biến đã bị tắt bởi ban quản lý.",
"preferences_preload_label": "Tải trước dữ liệu video: ",
"Filipino (auto-generated)": "Tiếng Philippines (tự động tạo)",
"First page": "Trang đầu"
}

View File

@@ -44,8 +44,6 @@
"User ID": "用户 ID",
"Password": "密码",
"Time (h:mm:ss):": "时间 (h:mm:ss):",
"Text CAPTCHA": "文本验证码",
"Image CAPTCHA": "图片验证码",
"Sign In": "登录",
"Register": "注册",
"E-mail": "E-mail",
@@ -420,7 +418,7 @@
"Chinese": "中文",
"Chinese (China)": "中文 (中国)",
"Chinese (Hong Kong)": "中文 (中国香港)",
"Chinese (Taiwan)": "中文 (中国台湾)",
"Chinese (Taiwan)": "中文 (台湾)",
"German (auto-generated)": "德语 (自动生成)",
"Indonesian (auto-generated)": "印尼语 (自动生成)",
"Interlingue": "国际语",
@@ -479,5 +477,15 @@
"The Popular feed has been disabled by the administrator.": "“流行”源已被管理员禁用。",
"carousel_slide": "当前为第 {{current}} 张图,共 {{total}} 张图",
"carousel_skip": "跳过图集",
"carousel_go_to": "转到图 `x`"
"carousel_go_to": "转到图 `x`",
"preferences_preload_label": "预加载视频数据: ",
"Filipino (auto-generated)": "菲律宾语 (自动生成)",
"channel_tab_posts_label": "帖子",
"First page": "第一页",
"channel_tab_courses_label": "课程",
"timeline_parse_error_show_technical_details": "显示技术细节",
"timeline_parse_error_placeholder_heading": "无法解析项目",
"timeline_parse_error_placeholder_message": "Invidious 在尝试解析此项目时遇到一个错误。更多信息请见下方:",
"preferences_default_playlist": "默认播放列表: ",
"preferences_default_playlist_none": "尚无默认播放列表"
}

View File

@@ -44,8 +44,6 @@
"User ID": "使用者 ID",
"Password": "密碼",
"Time (h:mm:ss):": "時間 (h:mm:ss):",
"Text CAPTCHA": "文字 CAPTCHA",
"Image CAPTCHA": "圖片 CAPTCHA",
"Sign In": "登入",
"Register": "註冊",
"E-mail": "電子郵件",
@@ -479,5 +477,15 @@
"carousel_slide": "第 {{current}} 張投影片,共 {{total}} 張",
"carousel_skip": "略過輪播",
"carousel_go_to": "跳到投影片 `x`",
"The Popular feed has been disabled by the administrator.": "熱門 feed 已被管理員停用。"
"The Popular feed has been disabled by the administrator.": "熱門 feed 已被管理員停用。",
"preferences_preload_label": "預先載入影片資訊 ",
"Filipino (auto-generated)": "菲律賓語(自動產生)",
"channel_tab_courses_label": "課程",
"First page": "第一頁",
"channel_tab_posts_label": "貼文",
"timeline_parse_error_show_technical_details": "顯示技術細節",
"timeline_parse_error_placeholder_heading": "無法解析項目",
"timeline_parse_error_placeholder_message": "Invidious 在嘗試解析此項目時遇到錯誤。要取得更多資訊,請見下方:",
"preferences_default_playlist": "預設播放清單: ",
"preferences_default_playlist_none": "未設定預設播放清單"
}

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")

View File

@@ -18,7 +18,7 @@ shards:
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
@@ -26,11 +26,7 @@ shards:
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

View File

@@ -1,5 +1,5 @@
name: invidious
version: 2.20241110.0
version: 2.20250913.0
authors:
- Invidious team <contact@invidious.io>
@@ -17,10 +17,7 @@ dependencies:
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

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

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")

View File

@@ -17,10 +17,8 @@
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"
@@ -49,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
@@ -61,7 +60,13 @@ alias IV = Invidious
CONFIG = Config.load
HMAC_KEY = CONFIG.hmac_key
PG_DB = DB.open CONFIG.database_url
PG_DB = begin
DB.open CONFIG.database_url
rescue ex
puts "Failed to connect to PostgreSQL database: #{ex.cause.try &.message}"
puts "Check your 'config.yml' database settings or PostgreSQL settings."
exit(1)
end
ARCHIVE_URL = URI.parse("https://archive.org")
PUBSUB_URL = URI.parse("https://pubsubhubbub.appspot.com")
REDDIT_URL = URI.parse("https://www.reddit.com")
@@ -97,6 +102,10 @@ YT_POOL = YoutubeConnectionPool.new(YT_URL, capacity: CONFIG.pool_size)
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]"
@@ -192,8 +201,9 @@ 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
@@ -217,12 +227,12 @@ error 404 do |env|
Invidious::Routes::ErrorRoutes.error_404(env)
end
error 500 do |env, ex|
error_template(500, ex)
error 500 do |env, exception|
error_template(500, exception)
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
@@ -239,8 +249,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.
@@ -249,4 +257,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

View File

@@ -249,11 +249,7 @@ def fetch_channel(ucid, pull_all_videos : Bool)
if was_insert
LOGGER.trace("fetch_channel: #{ucid} : video #{video_id} : Inserted, updating subscriptions")
if CONFIG.enable_user_notifications
Invidious::Database::Users.add_notification(video)
else
Invidious::Database::Users.feed_needs_update(video)
end
NOTIFICATION_CHANNEL.send(VideoNotification.from_video(video))
else
LOGGER.trace("fetch_channel: #{ucid} : video #{video_id} : Updated")
end
@@ -285,11 +281,7 @@ def fetch_channel(ucid, pull_all_videos : Bool)
if Time.utc - video.published > 1.minute
was_insert = Invidious::Database::ChannelVideos.insert(video)
if was_insert
if CONFIG.enable_user_notifications
Invidious::Database::Users.add_notification(video)
else
Invidious::Database::Users.feed_needs_update(video)
end
NOTIFICATION_CHANNEL.send(VideoNotification.from_video(video))
end
end
end

View File

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

View File

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

View File

@@ -16,23 +16,27 @@ module Invidious::Comments
return parse_youtube(id, response, format, locale, thin_mode, sort_by)
end
def fetch_community_post_comments(ucid, post_id)
def fetch_community_post_comments(ucid, post_id, sort_by = "top")
case sort_by
when "top"
sort_by_val = 0_i64
when "new", "newest"
sort_by_val = 1_i64
else # top
sort_by_val = 0_i64
end
object = {
"2:string" => "community",
"25:embedded" => {
"22:string" => post_id,
},
"45:embedded" => {
"2:varint" => 1_i64,
"3:varint" => 1_i64,
},
"2:string" => "posts",
"53:embedded" => {
"4:embedded" => {
"6:varint" => 0_i64,
"27:varint" => 1_i64,
"6:varint" => sort_by_val,
"15:varint" => 2_i64,
"25:varint" => 0_i64,
"29:string" => post_id,
"30:string" => ucid,
},
"7:varint" => 0_i64,
"8:string" => "comments-section",
},
}
@@ -43,7 +47,7 @@ module Invidious::Comments
object2 = {
"80226972:embedded" => {
"2:string" => ucid,
"2:string" => "FEcomment_post_detail_page_web_top_level",
"3:string" => object_parsed,
},
}
@@ -320,6 +324,15 @@ module Invidious::Comments
end
def produce_continuation(video_id, cursor = "", sort_by = "top")
case sort_by
when "top"
sort_by_val = 0_i64
when "new", "newest"
sort_by_val = 1_i64
else # top
sort_by_val = 0_i64
end
object = {
"2:embedded" => {
"2:string" => video_id,
@@ -340,21 +353,12 @@ module Invidious::Comments
"1:string" => cursor,
"4:embedded" => {
"4:string" => video_id,
"6:varint" => 0_i64,
"6:varint" => sort_by_val,
},
"5:varint" => 20_i64,
},
}
case sort_by
when "top"
object["6:embedded"].as(Hash)["4:embedded"].as(Hash)["6:varint"] = 0_i64
when "new", "newest"
object["6:embedded"].as(Hash)["4:embedded"].as(Hash)["6:varint"] = 1_i64
else # top
object["6:embedded"].as(Hash)["4:embedded"].as(Hash)["6:varint"] = 0_i64
end
continuation = object.try { |i| Protodec::Any.cast_json(i) }
.try { |i| Protodec::Any.from_json(i) }
.try { |i| Base64.urlsafe_encode(i) }

View File

@@ -8,6 +8,13 @@ struct DBConfig
property dbname : String
end
struct SocketBindingConfig
include YAML::Serializable
property path : String
property permissions : String
end
struct ConfigPreferences
include YAML::Serializable
@@ -28,7 +35,7 @@ struct ConfigPreferences
property max_results : Int32 = 40
property notifications_only : Bool = false
property player_style : String = "invidious"
property quality : String = "hd720"
property quality : String = "dash"
property quality_dash : String = "auto"
property default_home : String? = "Popular"
property feed_menu : Array(String) = ["Popular", "Trending", "Subscriptions", "Playlists"]
@@ -45,6 +52,8 @@ struct ConfigPreferences
property vr_mode : Bool = true
property show_nick : Bool = true
property save_player_pos : Bool = false
@[YAML::Field(ignore: true)]
property default_playlist : String? = nil
def to_tuple
{% begin %}
@@ -67,6 +76,19 @@ end
class Config
include YAML::Serializable
class CompanionConfig
include YAML::Serializable
@[YAML::Field(converter: Preferences::URIConverter)]
property private_url : URI = URI.parse("")
@[YAML::Field(converter: Preferences::URIConverter)]
property public_url : URI = URI.parse("")
# Indicates if this companion instance uses the built-in proxy
property builtin_proxy : Bool = false
end
# Number of threads to use for crawling videos from channels (for updating subscriptions)
property channel_threads : Int32 = 1
# Time interval between two executions of the job that crawls channel videos (subscriptions update).
@@ -138,6 +160,8 @@ class Config
property port : Int32 = 3000
# Host to bind (overridden by command line argument)
property host_binding : String = "0.0.0.0"
# Path and permissions to make Invidious listen on a UNIX socket instead of a TCP port
property socket_binding : SocketBindingConfig? = nil
# Pool size for HTTP requests to youtube.com and ytimg.com (each domain has a separate pool of `pool_size`)
property pool_size : Int32 = 100
# HTTP Proxy configuration
@@ -151,6 +175,12 @@ class Config
# poToken for passing bot attestation
property po_token : String? = nil
# Invidious companion
property invidious_companion : Array(CompanionConfig) = [] of CompanionConfig
# Invidious companion API key
property invidious_companion_key : String = ""
# Saved cookies in "name1=value1; name2=value2..." format
@[YAML::Field(converter: Preferences::StringToCookies)]
property cookies : HTTP::Cookies = HTTP::Cookies.new
@@ -184,6 +214,9 @@ class Config
config = Config.from_yaml(config_yaml)
# Update config from env vars (upcased and prefixed with "INVIDIOUS_")
#
# Also checks if any top-level config options are set to "CHANGE_ME!!"
# TODO: Support non-top-level config options such as the ones in DBConfig
{% for ivar in Config.instance_vars %}
{% env_id = "INVIDIOUS_#{ivar.id.upcase}" %}
@@ -220,16 +253,48 @@ class Config
exit(1)
end
end
# Warn when any config attribute is set to "CHANGE_ME!!"
if config.{{ivar.id}} == "CHANGE_ME!!"
puts "Config: The value of '#{ {{ivar.stringify}} }' needs to be changed!!"
exit(1)
end
{% end %}
if config.invidious_companion.present?
# invidious_companion and signature_server can't work together
if config.signature_server
puts "Config: You can not run inv_sig_helper and invidious_companion at the same time."
exit(1)
elsif config.invidious_companion_key.empty?
puts "Config: Please configure a key if you are using invidious companion."
exit(1)
elsif config.invidious_companion_key == "CHANGE_ME!!"
puts "Config: The value of 'invidious_companion_key' needs to be changed!!"
exit(1)
elsif config.invidious_companion_key.size != 16
puts "Config: The value of 'invidious_companion_key' needs to be a size of 16 characters."
exit(1)
end
# Set public_url to built-in proxy path when omitted
config.invidious_companion.each do |companion|
if companion.public_url.to_s.empty?
companion.public_url = URI.parse("/companion")
companion.builtin_proxy = true
end
end
elsif config.signature_server
puts("WARNING: inv-sig-helper is deprecated. Please switch to Invidious companion: https://docs.invidious.io/companion-installation/")
else
puts("WARNING: Invidious companion is required to view and playback videos. For more information see https://docs.invidious.io/companion-installation/")
end
# HMAC_key is mandatory
# See: https://github.com/iv-org/invidious/issues/3854
if config.hmac_key.empty?
puts "Config: 'hmac_key' is required/can't be empty"
exit(1)
elsif config.hmac_key == "CHANGE_ME!!"
puts "Config: The value of 'hmac_key' needs to be changed!!"
exit(1)
end
# Build database_url from db.* if it's not set directly
@@ -249,6 +314,24 @@ class Config
end
end
# Check if the socket configuration is valid
if sb = config.socket_binding
if sb.path.ends_with?("/") || File.directory?(sb.path)
puts "Config: The socket path " + sb.path + " must not be a directory!"
exit(1)
end
d = File.dirname(sb.path)
if !File.directory?(d)
puts "Config: Socket directory " + sb.path + " does not exist or is not a directory!"
exit(1)
end
p = sb.permissions.to_i?(base: 8)
if !p || p < 0 || p > 0o777
puts "Config: Socket permissions must be an octal between 0 and 777!"
exit(1)
end
end
return config
end
end

View File

@@ -91,7 +91,7 @@ module Invidious::Database::Playlists
end
# -------------------
# Salect
# Select
# -------------------
def select(*, id : String) : InvidiousPlaylist?
@@ -113,7 +113,7 @@ module Invidious::Database::Playlists
end
# -------------------
# Salect (filtered)
# Select (filtered)
# -------------------
def select_like_iv(email : String) : Array(InvidiousPlaylist)
@@ -213,7 +213,7 @@ module Invidious::Database::PlaylistVideos
end
# -------------------
# Salect
# Select
# -------------------
def select(plid : String, index : VideoIndex, offset, limit = 100) : Array(PlaylistVideo)

View File

@@ -119,15 +119,15 @@ module Invidious::Database::Users
# Update (notifs)
# -------------------
def add_notification(video : ChannelVideo)
def add_multiple_notifications(channel_id : String, video_ids : Array(String))
request = <<-SQL
UPDATE users
SET notifications = array_append(notifications, $1),
SET notifications = array_cat(notifications, $1),
feed_needs_update = true
WHERE $2 = ANY(subscriptions)
SQL
PG_DB.exec(request, video.id, video.ucid)
PG_DB.exec(request, video_ids, channel_id)
end
def remove_notification(user : User, vid : String)
@@ -154,14 +154,14 @@ module Invidious::Database::Users
# Update (misc)
# -------------------
def feed_needs_update(video : ChannelVideo)
def feed_needs_update(channel_id : String)
request = <<-SQL
UPDATE users
SET feed_needs_update = true
WHERE $1 = ANY(subscriptions)
SQL
PG_DB.exec(request, video.ucid)
PG_DB.exec(request, channel_id)
end
def update_preferences(user : User)

View File

@@ -7,8 +7,9 @@ module Invidious::Frontend::ChannelPage
Streams
Podcasts
Releases
Courses
Playlists
Community
Posts
Channels
end

View File

@@ -3,6 +3,24 @@ require "uri"
module Invidious::Frontend::Pagination
extend self
private def first_page(str : String::Builder, locale : String?, url : String)
str << %(<a href=") << url << %(" class="pure-button pure-button-secondary">)
if locale_is_rtl?(locale)
# Inverted arrow ("first" points to the right)
str << translate(locale, "First page")
str << "&nbsp;&nbsp;"
str << %(<i class="icon ion-ios-arrow-forward"></i>)
else
# Regular arrow ("first" points to the left)
str << %(<i class="icon ion-ios-arrow-back"></i>)
str << "&nbsp;&nbsp;"
str << translate(locale, "First page")
end
str << "</a>"
end
private def previous_page(str : String::Builder, locale : String?, url : String)
# Link
str << %(<a href=") << url << %(" class="pure-button pure-button-secondary">)
@@ -72,18 +90,24 @@ module Invidious::Frontend::Pagination
end
end
def nav_ctoken(locale : String?, *, base_url : String | URI, ctoken : String?)
def nav_ctoken(locale : String?, *, base_url : String | URI, ctoken : String?, first_page : Bool, params : URI::Params)
return String.build do |str|
str << %(<div class="h-box">\n)
str << %(<div class="page-nav-container flexible">\n)
str << %(<div class="page-prev-container flex-left"></div>\n)
str << %(<div class="page-prev-container flex-left">)
if !first_page
self.first_page(str, locale, base_url.to_s)
end
str << %(</div>\n)
str << %(<div class="page-next-container flex-right">)
if !ctoken.nil?
params_next = URI::Params{"continuation" => ctoken}
url_next = HttpServer::Utils.add_params_to_url(base_url, params_next)
params["continuation"] = ctoken
url_next = HttpServer::Utils.add_params_to_url(base_url, params)
self.next_page(str, locale, url_next.to_s)
end

View File

@@ -13,7 +13,7 @@ module Invidious::Frontend::WatchPage
@full_videos,
@video_streams,
@audio_streams,
@captions
@captions,
)
end
end
@@ -23,12 +23,18 @@ module Invidious::Frontend::WatchPage
return "<p id=\"download\">#{translate(locale, "Download is disabled")}</p>"
end
url = "/download"
if (CONFIG.invidious_companion.present?)
invidious_companion = CONFIG.invidious_companion.sample
url = "#{invidious_companion.public_url}/download?check=#{invidious_companion_encrypt(video.id)}"
end
return String.build(4000) do |str|
str << "<form"
str << " class=\"pure-form pure-form-stacked\""
str << " action='/download'"
str << " action='#{url}'"
str << " method='post'"
str << " rel='noopener'"
str << " rel='noopener noreferrer'"
str << " target='_blank'>"
str << '\n'

View File

@@ -18,40 +18,6 @@ end
class HTTP::Client
property family : Socket::Family = Socket::Family::UNSPEC
# Override stdlib to automatically initialize proxy if configured
#
# Accurate as of crystal 1.12.1
def initialize(@host : String, port = nil, tls : TLSContext = nil)
check_host_only(@host)
{% if flag?(:without_openssl) %}
if tls
raise "HTTP::Client TLS is disabled because `-D without_openssl` was passed at compile time"
end
@tls = nil
{% else %}
@tls = case tls
when true
OpenSSL::SSL::Context::Client.new
when OpenSSL::SSL::Context::Client
tls
when false, nil
nil
end
{% end %}
@port = (port || (@tls ? 443 : 80)).to_i
self.proxy = make_configured_http_proxy_client() if CONFIG.http_proxy
end
def initialize(@io : IO, @host = "", @port = 80)
@reconnect = false
self.proxy = make_configured_http_proxy_client() if CONFIG.http_proxy
end
private def io
io = @io
return io if io

View File

@@ -18,16 +18,7 @@ def github_details(summary : String, content : String)
return HTML.escape(details)
end
def error_template_helper(env : HTTP::Server::Context, status_code : Int32, exception : Exception)
if exception.is_a?(InfoException)
return error_template_helper(env, status_code, exception.message || "")
end
locale = env.get("preferences").as(Preferences).locale
env.response.content_type = "text/html"
env.response.status_code = status_code
def get_issue_template(env : HTTP::Server::Context, exception : Exception) : Tuple(String, String)
issue_title = "#{exception.message} (#{exception.class})"
issue_template = <<-TEXT
@@ -40,6 +31,24 @@ def error_template_helper(env : HTTP::Server::Context, status_code : Int32, exce
issue_template += github_details("Backtrace", exception.inspect_with_backtrace)
return issue_title, issue_template
end
def error_template_helper(env : HTTP::Server::Context, status_code : Int32, exception : Exception)
if exception.is_a?(InfoException)
return error_template_helper(env, status_code, exception.message || "")
end
locale = env.get("preferences").as(Preferences).locale
env.response.content_type = "text/html"
env.response.status_code = status_code
# Unpacking into issue_title, issue_template directly causes a compiler error
# I have no idea why.
issue_template_components = get_issue_template(env, exception)
issue_title, issue_template = issue_template_components
# URLs for the error message below
url_faq = "https://github.com/iv-org/documentation/blob/master/docs/faq.md"
url_search_issues = "https://github.com/iv-org/invidious/issues"
@@ -69,7 +78,7 @@ def error_template_helper(env : HTTP::Server::Context, status_code : Int32, exce
<p>#{translate(locale, "crash_page_report_issue", url_new_issue)}</p>
<!-- TODO: Add a "copy to clipboard" button -->
<pre style="padding: 20px; background: rgba(0, 0, 0, 0.12345);">#{issue_template}</pre>
<pre class="error-issue-template">#{issue_template}</pre>
</div>
END_HTML
@@ -130,7 +139,7 @@ def error_json_helper(
env : HTTP::Server::Context,
status_code : Int32,
exception : Exception,
additional_fields : Hash(String, Object) | Nil = nil
additional_fields : Hash(String, Object) | Nil = nil,
)
if exception.is_a?(InfoException)
return error_json_helper(env, status_code, exception.message || "", additional_fields)
@@ -152,7 +161,7 @@ def error_json_helper(
env : HTTP::Server::Context,
status_code : Int32,
message : String,
additional_fields : Hash(String, Object) | Nil = nil
additional_fields : Hash(String, Object) | Nil = nil,
)
env.response.content_type = "application/json"
env.response.status_code = status_code

View File

@@ -27,6 +27,7 @@ class Kemal::RouteHandler
# Processes the route if it's a match. Otherwise renders 404.
private def process_request(context)
raise Kemal::Exceptions::RouteNotFound.new(context) unless context.route_found?
return if context.response.closed?
content = context.route.handler.call(context)
if !Kemal.config.error_handlers.empty? && Kemal.config.error_handlers.has_key?(context.response.status_code) && exclude_match?(context)
@@ -60,28 +61,13 @@ class Kemal::ExceptionHandler
end
end
class FilteredCompressHandler < Kemal::Handler
class FilteredCompressHandler < HTTP::CompressHandler
exclude ["/videoplayback", "/videoplayback/*", "/vi/*", "/sb/*", "/ggpht/*", "/api/v1/auth/notifications"]
exclude ["/api/v1/auth/notifications", "/data_control"], "POST"
def call(env)
return call_next env if exclude_match? env
{% if flag?(:without_zlib) %}
call_next env
{% else %}
request_headers = env.request.headers
if request_headers.includes_word?("Accept-Encoding", "gzip")
env.response.headers["Content-Encoding"] = "gzip"
env.response.output = Compress::Gzip::Writer.new(env.response.output, sync_close: true)
elsif request_headers.includes_word?("Accept-Encoding", "deflate")
env.response.headers["Content-Encoding"] = "deflate"
env.response.output = Compress::Deflate::Writer.new(env.response.output, sync_close: true)
end
call_next env
{% end %}
def call(context)
return call_next context if exclude_match? context
super
end
end

View File

@@ -54,6 +54,7 @@ LOCALES_LIST = {
"sr" => "Srpski (latinica)", # Serbian (Latin)
"sr_Cyrl" => "Српски (ћирилица)", # Serbian (Cyrillic)
"sv-SE" => "Svenska", # Swedish
"ta" => "தமிழ்", # Tamil
"tr" => "Türkçe", # Turkish
"uk" => "Українська", # Ukrainian
"vi" => "Tiếng Việt", # Vietnamese

View File

@@ -55,12 +55,11 @@ macro templated(_filename, template = "template", navbar_search = true)
{{ layout = "src/invidious/views/" + template + ".ecr" }}
__content_filename__ = {{filename}}
content = Kilt.render({{filename}})
Kilt.render({{layout}})
render {{filename}}, {{layout}}
end
macro rendered(filename)
Kilt.render("src/invidious/views/#{{{filename}}}.ecr")
render("src/invidious/views/#{{{filename}}}.ecr")
end
# Similar to Kemals halt method but works in a

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