Compare commits
1647 Commits
0.20.0
...
disable-no
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
72f03cd9de | ||
|
|
7f445f6167 | ||
|
|
bf599284ed | ||
|
|
a21c10e209 | ||
|
|
56ee44ee09 | ||
|
|
c6df54a103 | ||
|
|
575b039170 | ||
|
|
7a32269d7f | ||
|
|
004e371051 | ||
|
|
d5f43bae92 | ||
|
|
e215a20a0a | ||
|
|
919413e2b9 | ||
|
|
45839f8d59 | ||
|
|
55b62f9fde | ||
|
|
4c3529f3d5 | ||
|
|
ab7580c0da | ||
|
|
25c079fded | ||
|
|
d8bb75be63 | ||
|
|
a8021e09a7 | ||
|
|
16530ac6de | ||
|
|
5d1a1fef0f | ||
|
|
6082887070 | ||
|
|
8da336b7aa | ||
|
|
897f871f99 | ||
|
|
2f335b3d2c | ||
|
|
3b1837a99b | ||
|
|
cc59de0c93 | ||
|
|
997d936e9c | ||
|
|
253256bf37 | ||
|
|
e60a1836fe | ||
|
|
b417ea8e3a | ||
|
|
b58b0440d6 | ||
|
|
a9d2d2211a | ||
|
|
fe057c7873 | ||
|
|
dfcaed93ea | ||
|
|
5e3fcad1fb | ||
|
|
555bb711c9 | ||
|
|
afa3eff313 | ||
|
|
9e91fd5241 | ||
|
|
d90d347006 | ||
|
|
385fe4be22 | ||
|
|
7ec88741a6 | ||
|
|
86cb68413d | ||
|
|
05c5d293eb | ||
|
|
fd0ac3a671 | ||
|
|
f109d812a1 | ||
|
|
5d2f2690e2 | ||
|
|
505a81d087 | ||
|
|
dfab62ce48 | ||
|
|
31699468fc | ||
|
|
857096ba5f | ||
|
|
36c7d4270b | ||
|
|
d77586d02d | ||
|
|
c8fbb74835 | ||
|
|
dfee375b98 | ||
|
|
9268258773 | ||
|
|
9031ca5c3f | ||
|
|
18d68184a9 | ||
|
|
3816f92095 | ||
|
|
fd55b08a1d | ||
|
|
d0d8ba0068 | ||
|
|
18197e7e3e | ||
|
|
f75a81c9ee | ||
|
|
9979a1b910 | ||
|
|
dbba9d7687 | ||
|
|
d199b7264e | ||
|
|
b4c532f062 | ||
|
|
b24a89f820 | ||
|
|
7112f35793 | ||
|
|
85ba04b715 | ||
|
|
8af202e86b | ||
|
|
57353fe0c6 | ||
|
|
6c116e34c4 | ||
|
|
9ff26ea4d4 | ||
|
|
2194bd2812 | ||
|
|
1e6cd0b18f | ||
|
|
85d178ff8b | ||
|
|
e0d09c3cda | ||
|
|
47f529dc09 | ||
|
|
dde850a2e9 | ||
|
|
34e1a465be | ||
|
|
7d756209b1 | ||
|
|
60e870b277 | ||
|
|
ddf1e84f7c | ||
|
|
ec183e3c9a | ||
|
|
01135db80a | ||
|
|
955e3de56d | ||
|
|
cdd473e195 | ||
|
|
34fe7f04fa | ||
|
|
55c280af5d | ||
|
|
ea5a4f6d6e | ||
|
|
d169f91d64 | ||
|
|
8b29895ef3 | ||
|
|
3cfc5c164d | ||
|
|
4e55d9937c | ||
|
|
03fe8d1716 | ||
|
|
d6d7d209c1 | ||
|
|
fa044a2971 | ||
|
|
72fce387db | ||
|
|
da10cdd5ab | ||
|
|
83de3a51ea | ||
|
|
8faf8b8e57 | ||
|
|
5a349ae88b | ||
|
|
e2fc64296d | ||
|
|
ec55b905cb | ||
|
|
492d1144e0 | ||
|
|
4f4b19a962 | ||
|
|
febd785428 | ||
|
|
8642c66710 | ||
|
|
76cc8ac66b | ||
|
|
53d349a648 | ||
|
|
b344e1aadb | ||
|
|
3c882cff6e | ||
|
|
f73aef33f0 | ||
|
|
d12dff9dcf | ||
|
|
99d770be64 | ||
|
|
71a8867a4a | ||
|
|
2bbd424fce | ||
|
|
ef8dc7272b | ||
|
|
ad4a06fca5 | ||
|
|
c04f45d5e3 | ||
|
|
fb36155022 | ||
|
|
7ace3fc989 | ||
|
|
170e754998 | ||
|
|
6a75fa08dc | ||
|
|
1c5db46a4d | ||
|
|
7e4690e43c | ||
|
|
698a6f3886 | ||
|
|
1668e4187e | ||
|
|
df599c0fc3 | ||
|
|
e98aeaf293 | ||
|
|
5026698ebf | ||
|
|
bd221b7b2c | ||
|
|
ba37259258 | ||
|
|
eca8d2e7d7 | ||
|
|
cb0f7bf6b0 | ||
|
|
1ec15dc073 | ||
|
|
f124e8cf93 | ||
|
|
9621175dc9 | ||
|
|
e6ddd6d6c1 | ||
|
|
d7ebd763f5 | ||
|
|
99091e919c | ||
|
|
6ddbccbc95 | ||
|
|
0ca333715b | ||
|
|
4e44a91d08 | ||
|
|
fc5f84a0cd | ||
|
|
2289f98c1e | ||
|
|
49edf0ee33 | ||
|
|
8532727d54 | ||
|
|
336653b02c | ||
|
|
d546f1870e | ||
|
|
15c66e2b01 | ||
|
|
be92bfd4af | ||
|
|
f5cb7ba96c | ||
|
|
f013a6b1d7 | ||
|
|
519c227c4f | ||
|
|
6f4665588f | ||
|
|
eba311baa9 | ||
|
|
e92b3779ad | ||
|
|
a82d21ff78 | ||
|
|
63e1165936 | ||
|
|
84cc732281 | ||
|
|
971b6ec96f | ||
|
|
46f7ca9ffa | ||
|
|
e85bc3e0f6 | ||
|
|
dee20f92a7 | ||
|
|
12b818a83c | ||
|
|
1c91110464 | ||
|
|
4cd7a3e83f | ||
|
|
fa99c9aa85 | ||
|
|
2d949834e9 | ||
|
|
c7b74aa8b4 | ||
|
|
5e3c9cf290 | ||
|
|
508f137b30 | ||
|
|
67dd2b419a | ||
|
|
0749baae4b | ||
|
|
df9f897ebe | ||
|
|
8ef1e81294 | ||
|
|
d755d05f88 | ||
|
|
ce4a52325b | ||
|
|
714a001332 | ||
|
|
c78f84d5c6 | ||
|
|
a6c9b263da | ||
|
|
5ad2fc64b4 | ||
|
|
2ae074a9a4 | ||
|
|
c5967ad572 | ||
|
|
5ece07a807 | ||
|
|
e00f9a869d | ||
|
|
662cf2f633 | ||
|
|
16f1a23c54 | ||
|
|
fb364b532c | ||
|
|
2bebf578c7 | ||
|
|
a5b9c83256 | ||
|
|
dc0e242a63 | ||
|
|
178e317d11 | ||
|
|
3aa740d877 | ||
|
|
951d7d8339 | ||
|
|
b5bd1f507e | ||
|
|
7b9368ae75 | ||
|
|
b2c3d9fb0a | ||
|
|
6bd48ca645 | ||
|
|
cdc007c83c | ||
|
|
7dbbe27cdd | ||
|
|
b91874355c | ||
|
|
8b0ed8b110 | ||
|
|
574e35a720 | ||
|
|
32ae38b933 | ||
|
|
56e505164d | ||
|
|
d4f3139b73 | ||
|
|
97dceb3a5a | ||
|
|
212f6d6bf5 | ||
|
|
36904fa72e | ||
|
|
8c2495a399 | ||
|
|
2d1f6128be | ||
|
|
9233f71549 | ||
|
|
b2a738cf13 | ||
|
|
34a79c5f1e | ||
|
|
fd30f5775a | ||
|
|
a2600acfa9 | ||
|
|
fa2c8f42b3 | ||
|
|
db4e36ad9b | ||
|
|
38697ade31 | ||
|
|
2cf3c7eb41 | ||
|
|
4ea932dc1f | ||
|
|
7b587d8e00 | ||
|
|
9612a4d0de | ||
|
|
7141a716e7 | ||
|
|
0d33566bbc | ||
|
|
2d341c53f2 | ||
|
|
b20443241d | ||
|
|
fb28431cdc | ||
|
|
2602df8ef7 | ||
|
|
9e7ff8f8f5 | ||
|
|
5b5473e794 | ||
|
|
73c000fd44 | ||
|
|
ef51661f5d | ||
|
|
6bb9e8442a | ||
|
|
9b1721f8ad | ||
|
|
15532fdb11 | ||
|
|
39e0b3f6c5 | ||
|
|
329bf7895e | ||
|
|
61feb5a851 | ||
|
|
da06560fa9 | ||
|
|
fd120ab275 | ||
|
|
14a57fd229 | ||
|
|
0be2ab582d | ||
|
|
d00037d1d4 | ||
|
|
e10827bf1c | ||
|
|
98a5a7cb4f | ||
|
|
748282cff3 | ||
|
|
f3df1e8d3c | ||
|
|
a93058d385 | ||
|
|
89135a9cf5 | ||
|
|
47a02e3423 | ||
|
|
c9fd8167f5 | ||
|
|
c9b9ded518 | ||
|
|
250a9191cb | ||
|
|
6fab5d0554 | ||
|
|
461fae4f77 | ||
|
|
8aed1e11c3 | ||
|
|
6cf6c56dd1 | ||
|
|
042ff8da64 | ||
|
|
8b72481b8c | ||
|
|
aa0724f204 | ||
|
|
eff8b23f57 | ||
|
|
81a2300af8 | ||
|
|
2a541cb4d5 | ||
|
|
0120f44fd6 | ||
|
|
b65dced646 | ||
|
|
e7394fe7a1 | ||
|
|
fb673639f9 | ||
|
|
dc62b6ffdb | ||
|
|
1f2ccac8a0 | ||
|
|
46e4d35ccd | ||
|
|
eb7e79fdf7 | ||
|
|
37c953e633 | ||
|
|
5bb2cb7d71 | ||
|
|
692f4e5be2 | ||
|
|
7bb1471207 | ||
|
|
4752e16ad2 | ||
|
|
2a156e7313 | ||
|
|
0314dd44ea | ||
|
|
b80a3d5401 | ||
|
|
8c4ef9f955 | ||
|
|
67d2635e41 | ||
|
|
71a1ad307c | ||
|
|
9a48fd81a3 | ||
|
|
d928b9eaad | ||
|
|
790b7afcca | ||
|
|
7b9f5d74dc | ||
|
|
6eadba784d | ||
|
|
3a39045617 | ||
|
|
67cb8b7107 | ||
|
|
4962c00ba8 | ||
|
|
6764185543 | ||
|
|
0a66a68db8 | ||
|
|
8d47ec714e | ||
|
|
9607fe03af | ||
|
|
62057e676a | ||
|
|
43ff3be751 | ||
|
|
7cbd79fee5 | ||
|
|
3fba342ed2 | ||
|
|
2419c4d8ae | ||
|
|
e37fb09d41 | ||
|
|
86b1357a68 | ||
|
|
b782ab5787 | ||
|
|
6c0486646f | ||
|
|
dffe8fc49e | ||
|
|
1336ecbef2 | ||
|
|
d00e430f50 | ||
|
|
5a728243a2 | ||
|
|
37f38dbf6c | ||
|
|
2eb7c5c037 | ||
|
|
ba0bc72d0b | ||
|
|
e1219cbdef | ||
|
|
bf0a48847c | ||
|
|
3bb7fbb2f1 | ||
|
|
326a362eb8 | ||
|
|
fdc380e7f7 | ||
|
|
db04f1556e | ||
|
|
444b1c99d0 | ||
|
|
3b1a286290 | ||
|
|
6c8a5a1e7f | ||
|
|
1769b0fdce | ||
|
|
68cbc11810 | ||
|
|
edcc155482 | ||
|
|
8231216371 | ||
|
|
e1215584b4 | ||
|
|
a905175e8c | ||
|
|
e98ed41656 | ||
|
|
fd139841f4 | ||
|
|
dac0f42777 | ||
|
|
f0788162a4 | ||
|
|
c963e50cde | ||
|
|
b4a4767fb3 | ||
|
|
d6918b2976 | ||
|
|
47e273c402 | ||
|
|
ba25e8e720 | ||
|
|
058ae5cc29 | ||
|
|
f8be5d2559 | ||
|
|
792d25594c | ||
|
|
9f9020e422 | ||
|
|
302fecbdcb | ||
|
|
d74873fed1 | ||
|
|
40ed4a0506 | ||
|
|
c25d664edc | ||
|
|
9bad7e2940 | ||
|
|
6704ce3214 | ||
|
|
914cfbd953 | ||
|
|
85cf27119c | ||
|
|
7691f53520 | ||
|
|
094f835642 | ||
|
|
92eea3b18b | ||
|
|
c021b93b5c | ||
|
|
d94d4c2045 | ||
|
|
46d08237c6 | ||
|
|
3deafe9f8d | ||
|
|
998edba6f0 | ||
|
|
4f219362fe | ||
|
|
c427444946 | ||
|
|
d59323a601 | ||
|
|
a779cdd463 | ||
|
|
73a142fd9b | ||
|
|
0453d08eed | ||
|
|
a18068aedf | ||
|
|
12fba3bb7a | ||
|
|
fc2b9031d4 | ||
|
|
28a6589a1e | ||
|
|
cf9c790499 | ||
|
|
3d6dceae10 | ||
|
|
130a14d0d9 | ||
|
|
f07b4f8fc4 | ||
|
|
75f655aafc | ||
|
|
a3fd9ccea7 | ||
|
|
4136ac633a | ||
|
|
2724456882 | ||
|
|
b396a2cbfd | ||
|
|
ddb06b0cac | ||
|
|
f54e247eb4 | ||
|
|
2ac19eb8fc | ||
|
|
6cdaafdc37 | ||
|
|
ed6476b5ea | ||
|
|
b90bceb2dc | ||
|
|
f31bd5ffb9 | ||
|
|
5abe7fe123 | ||
|
|
b6792cf02e | ||
|
|
1261323c66 | ||
|
|
2a45b4eba0 | ||
|
|
a6a0bbf398 | ||
|
|
7f3ef12297 | ||
|
|
da2f592de6 | ||
|
|
ee91effb7a | ||
|
|
b13f9c25b3 | ||
|
|
f85563eb66 | ||
|
|
7b689a186d | ||
|
|
092d7df761 | ||
|
|
6c444707d7 | ||
|
|
81c006cc04 | ||
|
|
7cbd1e413f | ||
|
|
f34f8ef188 | ||
|
|
c3eb385cd3 | ||
|
|
be34f03157 | ||
|
|
4964785b13 | ||
|
|
1b7757c14f | ||
|
|
58c9f20226 | ||
|
|
f19be0c3ce | ||
|
|
f236a6872b | ||
|
|
3e0096f360 | ||
|
|
438b334320 | ||
|
|
4aa96ecab9 | ||
|
|
e5557b515e | ||
|
|
7b9d26d688 | ||
|
|
8d4b4cd14c | ||
|
|
342fc202a7 | ||
|
|
4436359d07 | ||
|
|
91f8395222 | ||
|
|
de00e86cd5 | ||
|
|
c6e086c6ff | ||
|
|
82f3eda82b | ||
|
|
05f9613e14 | ||
|
|
50bb591826 | ||
|
|
2ca23c714d | ||
|
|
b030d822f1 | ||
|
|
65b5183f01 | ||
|
|
33431844b7 | ||
|
|
325a67155d | ||
|
|
6876f88f43 | ||
|
|
ad9d3f4425 | ||
|
|
5eca7a8a30 | ||
|
|
de153ece4e | ||
|
|
2d8964d37d | ||
|
|
ceb1feb350 | ||
|
|
2ea0590b03 | ||
|
|
80a513baa5 | ||
|
|
ba48f68fc3 | ||
|
|
319587e2f1 | ||
|
|
bf7952d9c7 | ||
|
|
f29ab53aff | ||
|
|
b5b0c58de7 | ||
|
|
a1bb421eec | ||
|
|
139786b9ef | ||
|
|
301444563b | ||
|
|
9966c21c6b | ||
|
|
12c219ee6c | ||
|
|
008f79df61 | ||
|
|
fd54cf2d05 | ||
|
|
e0d26f4055 | ||
|
|
6c2170960b | ||
|
|
950deaca40 | ||
|
|
2bd286f195 | ||
|
|
75792bfa7b | ||
|
|
737c49b689 | ||
|
|
2c447a42f2 | ||
|
|
dad8f9a0ce | ||
|
|
2eac23a0b3 | ||
|
|
6a204753c0 | ||
|
|
19bb26a789 | ||
|
|
00904ae3f2 | ||
|
|
d214a0b333 | ||
|
|
4940759627 | ||
|
|
be1a390b50 | ||
|
|
f707f990e6 | ||
|
|
a120f143d7 | ||
|
|
65fbdbff6a | ||
|
|
6ec4dcfafd | ||
|
|
48191aca6e | ||
|
|
83556bace2 | ||
|
|
814c9e6c3a | ||
|
|
547abe17d9 | ||
|
|
6b8450558d | ||
|
|
c3747c2d49 | ||
|
|
245122104a | ||
|
|
b0f127d4d8 | ||
|
|
d379a36c0e | ||
|
|
a12571e748 | ||
|
|
21879da80d | ||
|
|
6cabc96f75 | ||
|
|
f4f9e75c27 | ||
|
|
2f235adadf | ||
|
|
afb284fa9b | ||
|
|
93252f33ff | ||
|
|
6cf0ff6b49 | ||
|
|
86f75758a7 | ||
|
|
0ec94405ce | ||
|
|
33780f1995 | ||
|
|
1cb715ac9f | ||
|
|
f65b628bf3 | ||
|
|
60fa552469 | ||
|
|
437bdedb07 | ||
|
|
a531f4f057 | ||
|
|
bb396a310e | ||
|
|
66e7285108 | ||
|
|
2b81a82620 | ||
|
|
b555df8377 | ||
|
|
232730e909 | ||
|
|
2c1b4b0dd8 | ||
|
|
1e0712625a | ||
|
|
88752f32bd | ||
|
|
7a93d4c7e4 | ||
|
|
c3c767eed8 | ||
|
|
6f19a3a21e | ||
|
|
06be0fb351 | ||
|
|
e2bbc9a6fa | ||
|
|
17e481c107 | ||
|
|
b8f27a42a7 | ||
|
|
575c66efd3 | ||
|
|
88ad7c8d8d | ||
|
|
1adcac175e | ||
|
|
dd8c412abc | ||
|
|
e969c1490a | ||
|
|
e91421253e | ||
|
|
35d15c7c2b | ||
|
|
20cb751ff6 | ||
|
|
0614b52f03 | ||
|
|
a629521c37 | ||
|
|
5eb83bb39c | ||
|
|
0e17d026f2 | ||
|
|
ea0b1fdf44 | ||
|
|
1d78d67af3 | ||
|
|
d9c58c4837 | ||
|
|
129779a757 | ||
|
|
c8a985cc77 | ||
|
|
db7e7aae46 | ||
|
|
cb9b84f940 | ||
|
|
33d9be0ffb | ||
|
|
2571e420f3 | ||
|
|
e17c8b1f4d | ||
|
|
8805ee7c8c | ||
|
|
7df2fd0bc8 | ||
|
|
f7f0910953 | ||
|
|
d300797e22 | ||
|
|
56dbe15943 | ||
|
|
736d63c08f | ||
|
|
5f65e92500 | ||
|
|
a65b9b2b53 | ||
|
|
cc10e8ca5d | ||
|
|
dfe0c738d6 | ||
|
|
21b96a3159 | ||
|
|
888c7e2c29 | ||
|
|
d6eaeef8a6 | ||
|
|
961c5740b7 | ||
|
|
22e8f7e287 | ||
|
|
c26b383a1b | ||
|
|
2cec1fe4bb | ||
|
|
9da1c6c6de | ||
|
|
806ddf1aca | ||
|
|
0ad2793b68 | ||
|
|
585e4617e8 | ||
|
|
76c6886791 | ||
|
|
91bc6599c6 | ||
|
|
4d44b2c3a4 | ||
|
|
b49b5fbda9 | ||
|
|
17e6093abb | ||
|
|
3dc980e800 | ||
|
|
c44c1003af | ||
|
|
39c27f0c66 | ||
|
|
678b10dbcf | ||
|
|
a1d6411f1f | ||
|
|
c4c8a10507 | ||
|
|
ee94ccdeb0 | ||
|
|
e3df9f9ead | ||
|
|
62dc629337 | ||
|
|
dccdf38ce7 | ||
|
|
84124b837d | ||
|
|
6176da3cbb | ||
|
|
24bc3e2704 | ||
|
|
f13fb80b42 | ||
|
|
0a9e19646a | ||
|
|
65e45c4079 | ||
|
|
440105976f | ||
|
|
7eba7fbcc7 | ||
|
|
d9bfb3d305 | ||
|
|
4246c7a523 | ||
|
|
e3054ccdd2 | ||
|
|
df968d1919 | ||
|
|
7661c3c061 | ||
|
|
57ed047025 | ||
|
|
bda3a26423 | ||
|
|
080d9a8dc7 | ||
|
|
984a4acc7b | ||
|
|
b10f37bea9 | ||
|
|
0947c26612 | ||
|
|
f5e7fe34a5 | ||
|
|
c6f088d6ca | ||
|
|
21e29411af | ||
|
|
f85930700b | ||
|
|
707ef1d0f7 | ||
|
|
adc12addfa | ||
|
|
bfef9d4b6e | ||
|
|
fd29cb9023 | ||
|
|
d806310665 | ||
|
|
4982bff74d | ||
|
|
347c189f3f | ||
|
|
81b12b8001 | ||
|
|
3e781b7d13 | ||
|
|
9c44e41a4c | ||
|
|
402bb01151 | ||
|
|
82a1d9dffa | ||
|
|
570541ba49 | ||
|
|
73eabb6ca2 | ||
|
|
5a52b4fe45 | ||
|
|
caa08a6379 | ||
|
|
cd02078e26 | ||
|
|
0341faeb13 | ||
|
|
77131cff91 | ||
|
|
0c7726d4e1 | ||
|
|
1f1e14fba5 | ||
|
|
9be8263f26 | ||
|
|
7b2aa5f98e | ||
|
|
26b28cea49 | ||
|
|
23049e026f | ||
|
|
9ab242ca2e | ||
|
|
aa59925374 | ||
|
|
43ea8fa706 | ||
|
|
6df85718e6 | ||
|
|
82e6f6e095 | ||
|
|
9ba3e1cdb4 | ||
|
|
b20f72b963 | ||
|
|
092b8a4e52 | ||
|
|
e5f07dedbf | ||
|
|
ca9eb0d539 | ||
|
|
142317c2be | ||
|
|
3dea670091 | ||
|
|
8435e79913 | ||
|
|
30e85b40f9 | ||
|
|
be1a43a337 | ||
|
|
abca8f7a7c | ||
|
|
7b60dac526 | ||
|
|
ea6434662d | ||
|
|
0b7a108a59 | ||
|
|
57c63f3598 | ||
|
|
ae30f32c36 | ||
|
|
a50f64f6e9 | ||
|
|
1323b94b7a | ||
|
|
6d68fbc31d | ||
|
|
d97e128dc0 | ||
|
|
86ca568d6d | ||
|
|
92b04a30f3 | ||
|
|
2b0bb69a4f | ||
|
|
67b01506c9 | ||
|
|
b20b802a8d | ||
|
|
87f46a7532 | ||
|
|
45a1407144 | ||
|
|
4a0359c04e | ||
|
|
4e629ca858 | ||
|
|
c32cae00d5 | ||
|
|
02431b3f98 | ||
|
|
0323202a03 | ||
|
|
b6670a7e3d | ||
|
|
62c1991b88 | ||
|
|
3a6085ad31 | ||
|
|
6e1b62aedf | ||
|
|
2451497b31 | ||
|
|
6699c80357 | ||
|
|
1af1474d04 | ||
|
|
06a1d2ac41 | ||
|
|
f47b588b91 | ||
|
|
262131f68e | ||
|
|
ceae48088e | ||
|
|
e655af251c | ||
|
|
3351ad8197 | ||
|
|
5054510d15 | ||
|
|
947fe4fbb3 | ||
|
|
50c8afb525 | ||
|
|
a539de4f97 | ||
|
|
8d5a867271 | ||
|
|
6a1954f8f7 | ||
|
|
0044178d49 | ||
|
|
387bddb51b | ||
|
|
41ba19b615 | ||
|
|
0e37e42abd | ||
|
|
a28945273d | ||
|
|
fd6f03655e | ||
|
|
8b62c05fe2 | ||
|
|
0e92a63d14 | ||
|
|
a4ff0b62ce | ||
|
|
dd141daefd | ||
|
|
a1001ada47 | ||
|
|
f938aa530e | ||
|
|
8d419da277 | ||
|
|
8e3ff79f22 | ||
|
|
d0c12caae9 | ||
|
|
17a99a524b | ||
|
|
41a757c3be | ||
|
|
61fc6539c2 | ||
|
|
99f04012a7 | ||
|
|
891116f13b | ||
|
|
4fcd0964cd | ||
|
|
5005212bec | ||
|
|
a279d6f433 | ||
|
|
5c74196f60 | ||
|
|
33724d40a8 | ||
|
|
d78e5281fe | ||
|
|
fceb8093f1 | ||
|
|
d984a898d4 | ||
|
|
52688106e4 | ||
|
|
66b45a8fe2 | ||
|
|
0db23f9252 | ||
|
|
23b2abc273 | ||
|
|
0350d0784a | ||
|
|
83219a499c | ||
|
|
3f4d5bc85c | ||
|
|
83b790950c | ||
|
|
16b10ec3d7 | ||
|
|
1d4dd4484d | ||
|
|
8bd2669d3d | ||
|
|
b5d2eb5c70 | ||
|
|
25362f16a0 | ||
|
|
39b34eece8 | ||
|
|
b3426fdc94 | ||
|
|
6aa65593ef | ||
|
|
66becbf46f | ||
|
|
cbf3d75087 | ||
|
|
0b0036813f | ||
|
|
c06a20e085 | ||
|
|
c60fccd7f6 | ||
|
|
46f8b04e40 | ||
|
|
12b46bbd41 | ||
|
|
f2b69fd812 | ||
|
|
0aae728e33 | ||
|
|
cea38de4ad | ||
|
|
3e4fab7070 | ||
|
|
6745ca7775 | ||
|
|
88c5e3b6fa | ||
|
|
2fdb2c7c9a | ||
|
|
7afa027b95 | ||
|
|
637a5cc14f | ||
|
|
81e77693b2 | ||
|
|
d49f884f69 | ||
|
|
34eeb29436 | ||
|
|
0495347c64 | ||
|
|
023f9b44d3 | ||
|
|
5248814053 | ||
|
|
7ddab5b8cd | ||
|
|
a26adb162c | ||
|
|
ef5df36a8a | ||
|
|
9b74cf3225 | ||
|
|
1321c90920 | ||
|
|
4b46313e19 | ||
|
|
e9add69e26 | ||
|
|
5b020e81ca | ||
|
|
c76bd7b45b | ||
|
|
21b7ae3ac3 | ||
|
|
e45da7161f | ||
|
|
7a3c000955 | ||
|
|
f75c5db372 | ||
|
|
7cd1d82d26 | ||
|
|
0085c3b0d8 | ||
|
|
4251c6cb99 | ||
|
|
ac973df8e7 | ||
|
|
a76a955a1b | ||
|
|
c89b98a1e0 | ||
|
|
dda4596c0c | ||
|
|
4ac863203d | ||
|
|
be5831d9bd | ||
|
|
1e2fa27af7 | ||
|
|
fcbaf2a978 | ||
|
|
b5c172974e | ||
|
|
7bb70924c1 | ||
|
|
a62fb6dcd1 | ||
|
|
e9c06237f2 | ||
|
|
bdb1eca741 | ||
|
|
29000a5209 | ||
|
|
88f0867442 | ||
|
|
3de06174bf | ||
|
|
5187894add | ||
|
|
d58f7bb935 | ||
|
|
84594b0e1e | ||
|
|
578bbcd181 | ||
|
|
0cdf13742a | ||
|
|
b00d24579d | ||
|
|
5c76cdaad9 | ||
|
|
5d994d179e | ||
|
|
8930020776 | ||
|
|
0637bf0dcb | ||
|
|
2abec5b62f | ||
|
|
bc937a6434 | ||
|
|
3a84e3abcf | ||
|
|
e4c223ca59 | ||
|
|
31de2d304c | ||
|
|
c83113d49b | ||
|
|
d95980b3ba | ||
|
|
08a88af965 | ||
|
|
4d4f61c922 | ||
|
|
110b77f453 | ||
|
|
ba0d205457 | ||
|
|
1ee4cae802 | ||
|
|
095c894548 | ||
|
|
9f5f5da894 | ||
|
|
aa3608f0af | ||
|
|
56ebef4352 | ||
|
|
3e5c353298 | ||
|
|
0d57a887ea | ||
|
|
b5fdd29cd5 | ||
|
|
ae61662f61 | ||
|
|
b633f8d207 | ||
|
|
c4c813fd0a | ||
|
|
f9c4cc274a | ||
|
|
cc45a0ca28 | ||
|
|
9ed1d28f76 | ||
|
|
7ca2acd24e | ||
|
|
fdca468049 | ||
|
|
c0e8feb66e | ||
|
|
0dd710c195 | ||
|
|
39110ad21c | ||
|
|
57bb8c610a | ||
|
|
cf619f24a9 | ||
|
|
fd313f0d66 | ||
|
|
67a18dcff6 | ||
|
|
54b19a04bb | ||
|
|
ca4df29670 | ||
|
|
7da0b2fd7f | ||
|
|
cfcb64c516 | ||
|
|
135ae11c20 | ||
|
|
ce68d09d26 | ||
|
|
aa55e67389 | ||
|
|
f7992d2d09 | ||
|
|
eecfc155b8 | ||
|
|
9cef7945c0 | ||
|
|
1b1932f787 | ||
|
|
9e4fd193c6 | ||
|
|
d16a748f37 | ||
|
|
f616b8e518 | ||
|
|
97b469f59c | ||
|
|
7ec93825b6 | ||
|
|
4a4867deeb | ||
|
|
965a8ea9fd | ||
|
|
3e8ddabcc1 | ||
|
|
50267a6dd6 | ||
|
|
5a8825d016 | ||
|
|
e6bdcff0dd | ||
|
|
4803285e50 | ||
|
|
bab263f426 | ||
|
|
03d5509b44 | ||
|
|
4a5f193e94 | ||
|
|
fdd66f12f0 | ||
|
|
349f073b8e | ||
|
|
84e271be4b | ||
|
|
f215fa936b | ||
|
|
75d04a92c8 | ||
|
|
90c907710c | ||
|
|
00425670d7 | ||
|
|
cb525af0a2 | ||
|
|
09f7e38eed | ||
|
|
7c49a0ba7a | ||
|
|
45e57f1ad3 | ||
|
|
eb911de928 | ||
|
|
b393e31b76 | ||
|
|
4a095eb98e | ||
|
|
d793d4ba78 | ||
|
|
2f54ec4e18 | ||
|
|
b9cd40fe1e | ||
|
|
173cd7c15e | ||
|
|
950c8f7104 | ||
|
|
b63bebb519 | ||
|
|
cf72b34866 | ||
|
|
d06cf2a07b | ||
|
|
10804927bb | ||
|
|
f178297452 | ||
|
|
311e7684b2 | ||
|
|
37ff2ac2b9 | ||
|
|
4786d586cf | ||
|
|
b7aaae4a19 | ||
|
|
008598b56f | ||
|
|
f3bc55e37e | ||
|
|
31fa3dfd59 | ||
|
|
5b47438b71 | ||
|
|
c33ee83d87 | ||
|
|
835dd1abcc | ||
|
|
576f5496c0 | ||
|
|
ff460c7736 | ||
|
|
22adbe2073 | ||
|
|
b8f0b4b583 | ||
|
|
f88e5f09b4 | ||
|
|
2b9c6c95b1 | ||
|
|
3f34db549f | ||
|
|
f4c0ee49a7 | ||
|
|
2fc0a6df93 | ||
|
|
0a9c804940 | ||
|
|
96faa9d12b | ||
|
|
42d9fd9c88 | ||
|
|
908bc7561b | ||
|
|
3de92b337d | ||
|
|
31466785ad | ||
|
|
e38b602b7d | ||
|
|
a2f5342a83 | ||
|
|
d432732959 | ||
|
|
4eb3de7b4e | ||
|
|
2e6adfb44a | ||
|
|
c85c6d0ac5 | ||
|
|
6c9dd8deb6 | ||
|
|
fe64e6dbf2 | ||
|
|
4fd51ec880 | ||
|
|
0323c521be | ||
|
|
992125febc | ||
|
|
f0bd0abc0f | ||
|
|
5c0d4c4408 | ||
|
|
5f8e47a14d | ||
|
|
9407b91060 | ||
|
|
a6e38e2ad2 | ||
|
|
8701de64ce | ||
|
|
114cac99e7 | ||
|
|
78194599e2 | ||
|
|
49d9491fda | ||
|
|
392a363d02 | ||
|
|
0a87ba6930 | ||
|
|
065c104f27 | ||
|
|
7f272f1293 | ||
|
|
e67f50f157 | ||
|
|
dd13392e36 | ||
|
|
2638c66638 | ||
|
|
1d40225159 | ||
|
|
08f11d2f22 | ||
|
|
ee20ab3041 | ||
|
|
e0402919e1 | ||
|
|
086e156a02 | ||
|
|
d0b9292aee | ||
|
|
7b0cb69938 | ||
|
|
479dd684f8 | ||
|
|
573738443c | ||
|
|
0268629c3b | ||
|
|
cf9e6c5d06 | ||
|
|
ad44c6eeee | ||
|
|
2b79d76541 | ||
|
|
cfaf3180f9 | ||
|
|
7881efa269 | ||
|
|
1ac52ce18f | ||
|
|
bb123ae0df | ||
|
|
4859b67a7b | ||
|
|
586e8b1479 | ||
|
|
5a526e2077 | ||
|
|
d3452775b3 | ||
|
|
d82734641b | ||
|
|
abbc2bad35 | ||
|
|
b491d69eec | ||
|
|
d93514d327 | ||
|
|
49ed485145 | ||
|
|
1a2ca8634d | ||
|
|
60cceabaa6 | ||
|
|
56df6b5e08 | ||
|
|
ca5d5668d9 | ||
|
|
4a45d10a8b | ||
|
|
82e1e9f0e5 | ||
|
|
2e1b93b857 | ||
|
|
37e9cefc52 | ||
|
|
1807b1492e | ||
|
|
460a6b4e99 | ||
|
|
96d87a288f | ||
|
|
a0d00410ca | ||
|
|
445ff856fe | ||
|
|
b7fe212a18 | ||
|
|
cbabf0ae7e | ||
|
|
344ccf3b03 | ||
|
|
26a7e1b049 | ||
|
|
43bd331e48 | ||
|
|
8bbb016fa4 | ||
|
|
ea43ba7124 | ||
|
|
5a59bd9998 | ||
|
|
993d731c92 | ||
|
|
f529948d81 | ||
|
|
4f3f51c583 | ||
|
|
5ba9a1f87d | ||
|
|
a0fb75efcb | ||
|
|
6e6f4d5a37 | ||
|
|
f06053b1cf | ||
|
|
df0cd30236 | ||
|
|
8806c57c63 | ||
|
|
f66cfa1299 | ||
|
|
9e84a4dbab | ||
|
|
59ab066518 | ||
|
|
960bd2a6be | ||
|
|
2cdaef1371 | ||
|
|
9b6c5c08d8 | ||
|
|
268ce4fefc | ||
|
|
bca8dace80 | ||
|
|
75e5b49c3a | ||
|
|
3cf08dc451 | ||
|
|
76c9cf62ff | ||
|
|
7a93af1786 | ||
|
|
6f899d998f | ||
|
|
73da8463ca | ||
|
|
b38fab9738 | ||
|
|
45e4d64b20 | ||
|
|
e6fba5d802 | ||
|
|
50ba3c5d5c | ||
|
|
65663fb857 | ||
|
|
8df2f38d34 | ||
|
|
c5fae84263 | ||
|
|
533d0a1fd4 | ||
|
|
a0fe229c7a | ||
|
|
f876cd5a6a | ||
|
|
62e9e9a662 | ||
|
|
a51c5c3ae7 | ||
|
|
26636eda0d | ||
|
|
074df7637b | ||
|
|
4fc8905ebf | ||
|
|
8cbb2278a7 | ||
|
|
fe7f8c3c3a | ||
|
|
91430738e7 | ||
|
|
d6585d7583 | ||
|
|
1924d75c2b | ||
|
|
06b27d932d | ||
|
|
ac1ac2cfed | ||
|
|
53cdb04be7 | ||
|
|
c106de02e9 | ||
|
|
8bc91ced4f | ||
|
|
2d0b9597cc | ||
|
|
b92fbb893b | ||
|
|
957a40df1f | ||
|
|
1eea5b350d | ||
|
|
c8e7080d1d | ||
|
|
629d0e441f | ||
|
|
5cfb878131 | ||
|
|
bfd02ac13d | ||
|
|
bd50bb1aa4 | ||
|
|
1045062147 | ||
|
|
492def3b76 | ||
|
|
afde9ac8a3 | ||
|
|
d977258c6c | ||
|
|
62943f8803 | ||
|
|
22e0859538 | ||
|
|
2c47ef31c0 | ||
|
|
d69b9f9cf8 | ||
|
|
a52e9be3e8 | ||
|
|
21f9141500 | ||
|
|
0e000e44aa | ||
|
|
ad9fe3be09 | ||
|
|
3829bdf198 | ||
|
|
6933a049b1 | ||
|
|
e3544bf4bc | ||
|
|
d5d0cb6a0c | ||
|
|
cac5f20a28 | ||
|
|
beea32661a | ||
|
|
b9e57d0283 | ||
|
|
5c0458a887 | ||
|
|
65942cd46c | ||
|
|
9a8f1a0b0a | ||
|
|
edb37c95e1 | ||
|
|
896882958d | ||
|
|
45d687c4e1 | ||
|
|
42be1321b2 | ||
|
|
f2cc16009f | ||
|
|
4336a55c2e | ||
|
|
bc5c0f65b8 | ||
|
|
b7eba3bc17 | ||
|
|
661d715446 | ||
|
|
d2c166243b | ||
|
|
5ed5eabbfe | ||
|
|
18b4b141d9 | ||
|
|
cd1e478b95 | ||
|
|
cf0ecaaf41 | ||
|
|
5f466eed79 | ||
|
|
93198438b8 | ||
|
|
1057d0eaa6 | ||
|
|
73b1284234 | ||
|
|
5f2e87f0e3 | ||
|
|
d9528f5cc3 | ||
|
|
877bb5c821 | ||
|
|
ae353cef2e | ||
|
|
909606826d | ||
|
|
e6e2d51b58 | ||
|
|
ea16c01fa2 | ||
|
|
f20d420aa7 | ||
|
|
a8649f286c | ||
|
|
fe879e6d94 | ||
|
|
94f285695e | ||
|
|
428747ab69 | ||
|
|
049e8e07ef | ||
|
|
716a845e92 | ||
|
|
47dfd4e681 | ||
|
|
555108c7fd | ||
|
|
e1af3d9bf3 | ||
|
|
e864c7541c | ||
|
|
b4a6cbbd09 | ||
|
|
fe4eef5855 | ||
|
|
c0997f951c | ||
|
|
cb378c1754 | ||
|
|
20b961c1c8 | ||
|
|
c4c2e01213 | ||
|
|
4b6d0fb517 | ||
|
|
62e46b7a36 | ||
|
|
052c5c67b8 | ||
|
|
b794c5cfcf | ||
|
|
be8a4013a7 | ||
|
|
87c25f83a4 | ||
|
|
e08bea5f51 | ||
|
|
739f610507 | ||
|
|
608313c1d1 | ||
|
|
2c1cf42994 | ||
|
|
196db1e1d0 | ||
|
|
a2f5435c48 | ||
|
|
75ec0b4fcf | ||
|
|
b4bfe27786 | ||
|
|
7617382114 | ||
|
|
b2f67cb154 | ||
|
|
c5107ddd3d | ||
|
|
8b75590d3e | ||
|
|
a7624d4724 | ||
|
|
b3099001be | ||
|
|
533c6cefee | ||
|
|
acfa9e8a55 | ||
|
|
8823753b46 | ||
|
|
c5ccefe6f7 | ||
|
|
148071a744 | ||
|
|
56fab9d178 | ||
|
|
f422a77014 | ||
|
|
e248e7ebaf | ||
|
|
aa4c623a06 | ||
|
|
cbdba66ef3 | ||
|
|
d652ab9920 | ||
|
|
e49aaa0216 | ||
|
|
61d49a1215 | ||
|
|
c481ca924b | ||
|
|
23e5b6ba72 | ||
|
|
3e88b72316 | ||
|
|
7566243151 | ||
|
|
aaefa38602 | ||
|
|
de6db4141f | ||
|
|
a61735e29a | ||
|
|
9bdfb0a32b | ||
|
|
94ecd29e35 | ||
|
|
980f5f1299 | ||
|
|
f99d62a2bc | ||
|
|
89be1975ea | ||
|
|
fec82df451 | ||
|
|
89fd35e02d | ||
|
|
3286328de4 | ||
|
|
977c34c0d7 | ||
|
|
5ec23df460 | ||
|
|
7f307e3bea | ||
|
|
fa050fb8a8 | ||
|
|
d741cbf6fd | ||
|
|
fa09327403 | ||
|
|
e27aaf9ba1 | ||
|
|
c0063ea09b | ||
|
|
e3e07aa3e6 | ||
|
|
502e8daedd | ||
|
|
3035f0119f | ||
|
|
48a3c3a0c1 | ||
|
|
fab9ae64a0 | ||
|
|
b56ebd13b6 | ||
|
|
3de39698dd | ||
|
|
b86476410f | ||
|
|
57ea45ff51 | ||
|
|
ec30f7c5d4 | ||
|
|
3cc9114f81 | ||
|
|
790167e914 | ||
|
|
9687d432fd | ||
|
|
378c0d049e | ||
|
|
abe283b38e | ||
|
|
3af42079e0 | ||
|
|
eb4843649c | ||
|
|
9432efeba5 | ||
|
|
4a3ed75ae5 | ||
|
|
fc8c555519 | ||
|
|
44f30c0e05 | ||
|
|
83b5fd252e | ||
|
|
9ae18b0b3b | ||
|
|
84487b2e52 | ||
|
|
9689376de6 | ||
|
|
a2f79a163f | ||
|
|
489d0151ad | ||
|
|
bcb44ab600 | ||
|
|
1a78bb4b58 | ||
|
|
2600695927 | ||
|
|
705e4fca06 | ||
|
|
a4ba4cf6ce | ||
|
|
0b2109576a | ||
|
|
c8cdc50d29 | ||
|
|
b29e60a97a | ||
|
|
209a986fe4 | ||
|
|
295e5c9731 | ||
|
|
08c93e94e4 | ||
|
|
ec28e9fb27 | ||
|
|
7081e8a226 | ||
|
|
01a2383d7b | ||
|
|
903b569f6c | ||
|
|
9b79e35d52 | ||
|
|
237100da18 | ||
|
|
1e33c0c288 | ||
|
|
cbc7603248 | ||
|
|
8d53f3abb8 | ||
|
|
2dcfec2639 | ||
|
|
dacb1a70ee | ||
|
|
93200c00f2 | ||
|
|
3b484c362e | ||
|
|
fbee9fe51e | ||
|
|
c451aab150 | ||
|
|
48bff9a5d2 | ||
|
|
db36d80669 | ||
|
|
6c8d3232a0 | ||
|
|
e6418fe79b | ||
|
|
34a0bb04f7 | ||
|
|
28302c82a3 | ||
|
|
5025c40ab2 | ||
|
|
6fdd30d97f | ||
|
|
b7c000e435 | ||
|
|
5ef2bbe5d6 | ||
|
|
e1d37c3b98 | ||
|
|
ec475e5783 | ||
|
|
c4b67b4cae | ||
|
|
b2cfebcce2 | ||
|
|
2bf445e165 | ||
|
|
121224b1b0 | ||
|
|
55ce1ce3ec | ||
|
|
2b14633047 | ||
|
|
88042d27ec | ||
|
|
148f3002ec | ||
|
|
ec82c1f957 | ||
|
|
9919520c28 | ||
|
|
689795e8bc | ||
|
|
5c8ab35f55 | ||
|
|
ddd7f3f384 | ||
|
|
c2f74879da | ||
|
|
5311683d43 | ||
|
|
5f03a583d1 | ||
|
|
a6970e02f9 | ||
|
|
1f7f013e0a | ||
|
|
991a04dc2a | ||
|
|
685902adab | ||
|
|
26ce0eb4b9 | ||
|
|
b30db728cc | ||
|
|
5eb098b5aa | ||
|
|
a2995ea03a | ||
|
|
82da5cfd01 | ||
|
|
909285ea46 | ||
|
|
a0bc0641c7 | ||
|
|
e7ada61881 | ||
|
|
79e99908de | ||
|
|
f1d7644184 | ||
|
|
5f365927b3 | ||
|
|
bd893cb24c | ||
|
|
e3352c3658 | ||
|
|
63d3d6049e | ||
|
|
668810858d | ||
|
|
b7131a5cd5 | ||
|
|
c9a316ad35 | ||
|
|
ec8fe21485 | ||
|
|
4a0b10984a | ||
|
|
69406b00d1 | ||
|
|
a1f3ae730a | ||
|
|
fedaef5d17 | ||
|
|
e35345f135 | ||
|
|
d0dbbd1cb1 | ||
|
|
70e14f92a4 | ||
|
|
b45f371911 | ||
|
|
f1a7ee997b | ||
|
|
51ebec7c13 | ||
|
|
c3ed1ad040 | ||
|
|
85ebf2e484 | ||
|
|
1996e6afaa | ||
|
|
799f97e847 | ||
|
|
dd2a7f91cc | ||
|
|
c86e9dfc8a | ||
|
|
40a2579821 | ||
|
|
380b64071e | ||
|
|
5ce0b1c18e | ||
|
|
a00453e151 | ||
|
|
a1aa40f500 | ||
|
|
1ad4685bb7 | ||
|
|
d8629e61d6 | ||
|
|
d4ddd7204d | ||
|
|
5f18799d8f | ||
|
|
15ba3325d9 | ||
|
|
3046350cb2 | ||
|
|
ffa9e5dfab | ||
|
|
8584654f11 | ||
|
|
c7e65ce795 | ||
|
|
cc3f019b28 | ||
|
|
920785631b | ||
|
|
b7fe1db89a | ||
|
|
5a08dfa72f | ||
|
|
c28b1f6fb9 | ||
|
|
c81ca187f8 | ||
|
|
ba148d749f | ||
|
|
606dd11b4f | ||
|
|
e254d2de8e | ||
|
|
b0b8ba7000 | ||
|
|
4d512d908d | ||
|
|
168376b046 | ||
|
|
df9e7f284c | ||
|
|
6365ee7487 | ||
|
|
7a8620a570 | ||
|
|
2c24bf3222 | ||
|
|
e036d89a86 | ||
|
|
36e9fb9d68 | ||
|
|
8b56a038b7 | ||
|
|
d5f0e23e29 | ||
|
|
3a2bd4e928 | ||
|
|
c5136ca4d6 | ||
|
|
28dac81a90 | ||
|
|
c89632d2a8 | ||
|
|
82c8f3b556 | ||
|
|
29278ff916 | ||
|
|
608b9e66f4 | ||
|
|
ac0ed14eae | ||
|
|
a06dfaf82a | ||
|
|
dfd5e30015 | ||
|
|
b19524d56a | ||
|
|
e0d25ff887 | ||
|
|
198dfffaeb | ||
|
|
c4ef055248 | ||
|
|
420ceffbb0 | ||
|
|
eeeecf9763 | ||
|
|
8df591e8d4 | ||
|
|
702ed5bfa8 | ||
|
|
75c6844b66 | ||
|
|
b39f01dcdf | ||
|
|
dba7dc4e96 | ||
|
|
ef96a50cea | ||
|
|
eed78c960d | ||
|
|
eea7ca9b72 | ||
|
|
c7c732ebc0 | ||
|
|
fb06482916 | ||
|
|
1bb24efbbc | ||
|
|
13800589a9 | ||
|
|
848add1b1b | ||
|
|
fc67dd18d0 | ||
|
|
b3e9b92344 | ||
|
|
a291b29c6f | ||
|
|
b566c4ba1a | ||
|
|
2349a6ab0c | ||
|
|
70eaf41acb | ||
|
|
912091981e | ||
|
|
aca42ff6a5 | ||
|
|
3fd885a188 | ||
|
|
2dacdf0210 | ||
|
|
5e8856e65b | ||
|
|
d42539949e | ||
|
|
28ca5b2b57 | ||
|
|
eea6f5cbfa | ||
|
|
b55dcc16ae | ||
|
|
0cb442d40e | ||
|
|
680dc1f962 | ||
|
|
30c92ce1b7 | ||
|
|
e55a09241e | ||
|
|
5f02237119 | ||
|
|
68552b6d65 | ||
|
|
44a4cea3a2 | ||
|
|
77c13e10ec | ||
|
|
0f66ff50a4 | ||
|
|
af515856c2 | ||
|
|
62e8c09183 | ||
|
|
cb40a74aaf | ||
|
|
a2c3ef94ec | ||
|
|
4184fb3ae7 | ||
|
|
20d2d141e4 | ||
|
|
0cfc3bfb79 | ||
|
|
2de206cb81 | ||
|
|
64c6dfd307 | ||
|
|
03d0b296e1 | ||
|
|
ca4408b343 | ||
|
|
527f408f6a | ||
|
|
adccca366e | ||
|
|
76cad41382 | ||
|
|
501db8f276 | ||
|
|
cc684ff0b1 | ||
|
|
7823c07f1a | ||
|
|
eb6d3d68a9 | ||
|
|
c98c7d47db | ||
|
|
194694a59b | ||
|
|
555cee3500 | ||
|
|
f4bb854372 | ||
|
|
d04b8e2fc6 | ||
|
|
21c1450e4a | ||
|
|
2b6b0e62f4 | ||
|
|
4fb360b19f | ||
|
|
0fa1567793 | ||
|
|
d7377015a2 | ||
|
|
139017ba7c | ||
|
|
ff3b53e34a | ||
|
|
b409cdece5 | ||
|
|
2478e67d16 | ||
|
|
dd35877eda | ||
|
|
4acfd2c342 | ||
|
|
df3f9a2ae8 | ||
|
|
78ae9ff093 | ||
|
|
ca781651cb | ||
|
|
417fa3cf3c | ||
|
|
92bb477f68 | ||
|
|
0f08cc5aa9 | ||
|
|
3dac33ffba | ||
|
|
fe73eccb90 | ||
|
|
b9544d9534 | ||
|
|
99ba9874b1 | ||
|
|
b41ca72d2b | ||
|
|
1ba17a0e14 | ||
|
|
480d31eb5e | ||
|
|
1973f93d4a | ||
|
|
3a2f4d4def | ||
|
|
192d2b86b6 | ||
|
|
6ca948ac3c | ||
|
|
5f932e9749 | ||
|
|
ff46c18164 | ||
|
|
de777907f2 | ||
|
|
72c4fd868a | ||
|
|
4bc2cd003d | ||
|
|
c9c6c1f769 | ||
|
|
bb7d8735cb | ||
|
|
557b0d76ab | ||
|
|
13073411cc | ||
|
|
0530045536 | ||
|
|
6d29e9c1b7 | ||
|
|
d3e4739745 | ||
|
|
3379f3ef61 | ||
|
|
9da7919062 | ||
|
|
aeed7deb2d | ||
|
|
38b617d848 | ||
|
|
dda02f783f | ||
|
|
cda322e311 | ||
|
|
934d3178a2 | ||
|
|
2cded8dcac | ||
|
|
babe0c31ad | ||
|
|
aa2ae37365 | ||
|
|
9a8b81fcbe | ||
|
|
138f38aade | ||
|
|
42914bff6f | ||
|
|
59acf95bf5 | ||
|
|
31c1046771 | ||
|
|
ec4a22687f | ||
|
|
22d9d16a7a | ||
|
|
0520e67303 | ||
|
|
d571573e52 | ||
|
|
0f643daac6 | ||
|
|
989317e5d3 | ||
|
|
cce6db4aeb | ||
|
|
46109abde5 | ||
|
|
2e16774190 | ||
|
|
812a21bce6 | ||
|
|
17e0207120 | ||
|
|
e02608edf8 | ||
|
|
1a7e160956 | ||
|
|
59d966356e | ||
|
|
5937e0289e | ||
|
|
85c212aee3 | ||
|
|
1978c3d3bd | ||
|
|
30a2c28d74 | ||
|
|
94a330532d | ||
|
|
f65e57ee82 | ||
|
|
750064c06f | ||
|
|
651fd79325 | ||
|
|
b53f988fca | ||
|
|
1595eaeb74 | ||
|
|
a54cbe896d | ||
|
|
9995a8d53f | ||
|
|
b88872d54b | ||
|
|
f02ac01f7e | ||
|
|
3ab3a5a236 | ||
|
|
fa3eb185ab | ||
|
|
4a56ba34d4 | ||
|
|
b860c69fd7 | ||
|
|
8408ceffe8 | ||
|
|
da9133c3c3 | ||
|
|
4a6e920d0e | ||
|
|
13f58d602f | ||
|
|
45fda595c3 | ||
|
|
1f15ea0bd8 | ||
|
|
99eebfa10f | ||
|
|
ccbbe81141 | ||
|
|
ad2da5969e | ||
|
|
2ce82f3da5 | ||
|
|
6bc9479e00 | ||
|
|
740e52229f | ||
|
|
1efd2390e3 | ||
|
|
564328abf9 | ||
|
|
926f819e31 | ||
|
|
45f0b9ac45 | ||
|
|
9a82e86ce9 | ||
|
|
0ad974c57b | ||
|
|
62f015fc34 | ||
|
|
b508787037 | ||
|
|
176ef19cca | ||
|
|
db83ede73c | ||
|
|
452d1e8307 | ||
|
|
92f337c67e | ||
|
|
1e4022680a | ||
|
|
e16d951da0 | ||
|
|
7b2b19b4ba | ||
|
|
8ebfaed546 | ||
|
|
0b52d52f4a | ||
|
|
6901d10d54 | ||
|
|
7caa2ae9bc | ||
|
|
cc50859912 | ||
|
|
6c16780144 | ||
|
|
b5f79444f9 | ||
|
|
b73c6e94c0 | ||
|
|
07616a9d34 | ||
|
|
e88ee26e3b | ||
|
|
7422c38e66 | ||
|
|
8ed1c77e47 | ||
|
|
8c65b8c16f | ||
|
|
1f435522b4 | ||
|
|
eb880e8de0 | ||
|
|
83b1d80a5b | ||
|
|
529aff3126 | ||
|
|
bf2bd519eb | ||
|
|
38c7dda00f | ||
|
|
056e7432bd | ||
|
|
074497b0f6 | ||
|
|
1eca969cf6 | ||
|
|
c1cbdae5ee | ||
|
|
4d4b6a2fa0 | ||
|
|
d30a972a90 | ||
|
|
24013af3bb | ||
|
|
338dc3223c | ||
|
|
c422a6dd4f | ||
|
|
8305af8f10 | ||
|
|
6435c7b921 | ||
|
|
af7c57b082 | ||
|
|
80941eacbd | ||
|
|
ceb252986e | ||
|
|
5d8de5fde2 | ||
|
|
750ef296c6 | ||
|
|
454ae8656a | ||
|
|
75450dcdbc | ||
|
|
bd2c7e3bb9 | ||
|
|
9d23cf33fd | ||
|
|
97eb01a28d | ||
|
|
9a2a636aed | ||
|
|
61c8256ef0 | ||
|
|
8e1791570e | ||
|
|
aa30d1f359 | ||
|
|
326f4bd681 | ||
|
|
7690c6c33d | ||
|
|
fece1077f2 | ||
|
|
75fc7db50d | ||
|
|
96da04576e | ||
|
|
001ec3663e | ||
|
|
21a00b77bd | ||
|
|
408f3852ec | ||
|
|
61150c74d2 | ||
|
|
7bb7003c9d | ||
|
|
920463f2ff | ||
|
|
ca1185d0be | ||
|
|
be655ee328 | ||
|
|
02d4186b11 | ||
|
|
3f97bebd69 | ||
|
|
2e378da922 | ||
|
|
b37f51bd7f | ||
|
|
eb8b0f72cc | ||
|
|
d8fe9a4d29 | ||
|
|
c97cdf551e | ||
|
|
80fc60b5e2 | ||
|
|
3b2e142542 | ||
|
|
0e58d99f4e | ||
|
|
92798abb5d | ||
|
|
bd7950b757 | ||
|
|
59a15ceef6 | ||
|
|
4011a113cc | ||
|
|
70cbe91776 | ||
|
|
f92027c44b | ||
|
|
1443335315 | ||
|
|
6ff2229a09 | ||
|
|
bb72672dd9 | ||
|
|
d96dee3aa6 | ||
|
|
bd0aaa343b | ||
|
|
3126e1ac94 | ||
|
|
a117d87f33 | ||
|
|
9dc4f8a1aa | ||
|
|
0d536d11e3 | ||
|
|
72a4962fd0 | ||
|
|
a3045a3953 | ||
|
|
c620a22017 | ||
|
|
e3593fe197 | ||
|
|
856ec03cc7 | ||
|
|
c80c5631f0 | ||
|
|
ef70668a77 | ||
|
|
ebd4691462 | ||
|
|
28554235be | ||
|
|
efbbb6fd20 | ||
|
|
9de57021a3 | ||
|
|
e21f770485 | ||
|
|
697c00dccf | ||
|
|
1caf6a3298 | ||
|
|
02fd02d482 | ||
|
|
239fb0db94 | ||
|
|
fe1d73c3e5 | ||
|
|
43da06a354 | ||
|
|
fea6b67067 | ||
|
|
f065ae54d5 | ||
|
|
3cf417766d | ||
|
|
0fb41b10e9 | ||
|
|
bc9dc3bf1e | ||
|
|
3cde5e28a8 | ||
|
|
cb8e7181c4 | ||
|
|
9a3becdecc | ||
|
|
e3c10d779d | ||
|
|
dd9f1024f4 | ||
|
|
9841f74adc | ||
|
|
b56e493d92 | ||
|
|
a2c5211b20 | ||
|
|
b7a7abed48 | ||
|
|
72bfdfd925 | ||
|
|
b80d34612a | ||
|
|
648cc0f006 | ||
|
|
1fc9506442 | ||
|
|
830692dd60 | ||
|
|
95a6759381 | ||
|
|
960b37b1c2 | ||
|
|
b1d17dea4f | ||
|
|
6b06471953 | ||
|
|
4ca957d3eb | ||
|
|
eb9b63477c | ||
|
|
80c01b055c | ||
|
|
50aec67069 | ||
|
|
7baced75e5 | ||
|
|
99743a94fb | ||
|
|
9bdfd6025b | ||
|
|
91400d2ce0 | ||
|
|
7b88d0efe3 | ||
|
|
4aada65dae | ||
|
|
0560d2cfb7 | ||
|
|
58c1a68ad9 | ||
|
|
588fc6df85 | ||
|
|
2c9e4ded40 | ||
|
|
88a538e71b | ||
|
|
513363504f | ||
|
|
0e844edacb | ||
|
|
5751bb2481 | ||
|
|
28669d940a | ||
|
|
3d87bdb6b4 | ||
|
|
1499ce43bf | ||
|
|
4d22b43d65 | ||
|
|
823603650f | ||
|
|
062867a38d | ||
|
|
f3e0c5d653 | ||
|
|
fc7f48b7db | ||
|
|
04d56420d1 | ||
|
|
a017574f74 | ||
|
|
ae24360c02 | ||
|
|
3fea1976c8 | ||
|
|
cf97dd9fcd | ||
|
|
0e3a48ff76 | ||
|
|
48cbe45a9d | ||
|
|
276bf09238 | ||
|
|
05988c1c49 | ||
|
|
d46b26e3bc | ||
|
|
236c172c6f | ||
|
|
59fcb56972 | ||
|
|
c07cd3a856 | ||
|
|
37766347a5 | ||
|
|
79da61782b | ||
|
|
8af87f1a8b | ||
|
|
494c954cbb | ||
|
|
71bc9eea28 | ||
|
|
e3b2bcfd06 | ||
|
|
142d974641 |
92
.ameba.yml
Normal file
92
.ameba.yml
Normal file
@@ -0,0 +1,92 @@
|
||||
#
|
||||
# Lint
|
||||
#
|
||||
|
||||
# Exclude assigns for ECR files
|
||||
Lint/UselessAssign:
|
||||
Excluded:
|
||||
- src/invidious.cr
|
||||
- src/invidious/helpers/errors.cr
|
||||
- src/invidious/routes/**/*.cr
|
||||
|
||||
# Ignore false negative (if !db.query_one?...)
|
||||
Lint/UnreachableCode:
|
||||
Excluded:
|
||||
- src/invidious/database/base.cr
|
||||
|
||||
# Ignore shadowed variable `key` (it works for now, and that's
|
||||
# a sensitive part of the code)
|
||||
Lint/ShadowingOuterLocalVar:
|
||||
Excluded:
|
||||
- src/invidious/helpers/tokens.cr
|
||||
|
||||
|
||||
#
|
||||
# Style
|
||||
#
|
||||
|
||||
Style/RedundantBegin:
|
||||
Enabled: false
|
||||
|
||||
Style/RedundantReturn:
|
||||
Enabled: false
|
||||
|
||||
|
||||
#
|
||||
# Metrics
|
||||
#
|
||||
|
||||
# Ignore function complexity (number of if/else & case/when branches)
|
||||
# For some functions that can hardly be simplified for now
|
||||
Metrics/CyclomaticComplexity:
|
||||
Excluded:
|
||||
# get_about_info(ucid, locale) => [17/10]
|
||||
- src/invidious/channels/about.cr
|
||||
|
||||
# fetch_channel_community(ucid, continuation, ...) => [34/10]
|
||||
- src/invidious/channels/community.cr
|
||||
|
||||
# create_notification_stream(env, topics, connection_channel) => [14/10]
|
||||
- src/invidious/helpers/helpers.cr:84:5
|
||||
|
||||
# get_index(plural_form, count) => [25/10]
|
||||
- src/invidious/helpers/i18next.cr
|
||||
|
||||
# call(context) => [18/10]
|
||||
- src/invidious/helpers/static_file_handler.cr
|
||||
|
||||
# show(env) => [38/10]
|
||||
- src/invidious/routes/embed.cr
|
||||
|
||||
# get_video_playback(env) => [45/10]
|
||||
- src/invidious/routes/video_playback.cr
|
||||
|
||||
# handle(env) => [40/10]
|
||||
- src/invidious/routes/watch.cr
|
||||
|
||||
# playlist_ajax(env) => [24/10]
|
||||
- src/invidious/routes/playlists.cr
|
||||
|
||||
# fetch_youtube_comments(id, cursor, ....) => [40/10]
|
||||
# template_youtube_comments(comments, locale, ...) => [16/10]
|
||||
# content_to_comment_html(content) => [14/10]
|
||||
- src/invidious/comments.cr
|
||||
|
||||
# to_json(locale, json) => [21/10]
|
||||
# extract_video_info(video_id, ...) => [44/10]
|
||||
# process_video_params(query, preferences) => [20/10]
|
||||
- src/invidious/videos.cr
|
||||
|
||||
# produce_search_params(page, sort, ...) => [29/10]
|
||||
# process_search_query(query, page, ...) => [14/10]
|
||||
- src/invidious/search.cr
|
||||
|
||||
|
||||
|
||||
#src/invidious/playlists.cr:327:5
|
||||
#[C] Metrics/CyclomaticComplexity: Cyclomatic complexity too high [19/10]
|
||||
# fetch_playlist(plid : String)
|
||||
|
||||
#src/invidious/playlists.cr:436:5
|
||||
#[C] Metrics/CyclomaticComplexity: Cyclomatic complexity too high [11/10]
|
||||
# extract_playlist_videos(initial_data : Hash(String, JSON::Any))
|
||||
3
.gitattributes
vendored
Normal file
3
.gitattributes
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# https://github.community/t/how-to-change-the-category/2261/3
|
||||
videojs-*.js linguist-detectable=false
|
||||
video.min.js linguist-detectable=false
|
||||
18
.github/CODEOWNERS
vendored
Normal file
18
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1,18 @@
|
||||
# Default and lowest precedence. If none of the below matches, @iv-org/developers would be requested for review.
|
||||
* @iv-org/developers
|
||||
|
||||
docker-compose.yml @unixfox
|
||||
docker/ @unixfox
|
||||
kubernetes/ @unixfox
|
||||
|
||||
README.md @thefrenchghosty
|
||||
config/config.example.yml @thefrenchghosty @SamantazFox @unixfox
|
||||
|
||||
scripts/ @syeopite
|
||||
shards.lock @syeopite
|
||||
shards.yml @syeopite
|
||||
|
||||
locales/ @SamantazFox
|
||||
src/invidious/helpers/i18n.cr @SamantazFox
|
||||
|
||||
src/invidious/helpers/youtube_api.cr @SamantazFox
|
||||
1
.github/FUNDING.yml
vendored
Normal file
1
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1 @@
|
||||
custom: https://invidious.io/donate/
|
||||
42
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
42
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a bug report to help us improve Invidious
|
||||
title: '[Bug] '
|
||||
labels: bug
|
||||
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!
|
||||
|
||||
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
|
||||
-->
|
||||
|
||||
|
||||
**Describe the bug**
|
||||
<!-- A clear and concise description of what the bug is. -->
|
||||
|
||||
**Steps to Reproduce**
|
||||
<!-- Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
-->
|
||||
|
||||
**Logs**
|
||||
<!-- If applicable, copy the log that appear in the browser page where the error is reported. -->
|
||||
|
||||
**Screenshots**
|
||||
<!-- If applicable, add screenshots to help explain your problem. -->
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context about the problem here.
|
||||
- Browser (if applicable):
|
||||
- OS (if applicable):
|
||||
-->
|
||||
24
.github/ISSUE_TEMPLATE/enhancement.md
vendored
Normal file
24
.github/ISSUE_TEMPLATE/enhancement.md
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
---
|
||||
name: Enhancement
|
||||
about: Suggest an enhancement for an existing feature
|
||||
title: '[Enhancement] '
|
||||
labels: enhancement
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!-- Please use the search function to check if the desired function has already been requested by someone else -->
|
||||
<!-- If you want to suggest a new feature please use "Feature request" instead -->
|
||||
<!-- If you want to report a bug, please use "Bug report" instead -->
|
||||
|
||||
**Is your enhancement request related to a problem? Please describe.**
|
||||
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
||||
|
||||
**Describe the solution you'd like**
|
||||
<!-- A clear and concise description of what you want to happen. -->
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context or screenshots about the enhancement here. -->
|
||||
24
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
24
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: '[Feature request] '
|
||||
labels: feature-request
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!-- Please use the search function to check if the desired function has already been requested by someone else -->
|
||||
<!-- If you want to suggest an enhancement to an existing feature please use "Enhancement" instead -->
|
||||
<!-- If you want to report a bug, please use "Bug report" instead -->
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
<!-- A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] -->
|
||||
|
||||
**Describe the solution you'd like**
|
||||
<!-- A clear and concise description of what you want to happen. -->
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
<!-- A clear and concise description of any alternative solutions or features you've considered. -->
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context or screenshots about the feature request here. -->
|
||||
124
.github/workflows/ci.yml
vendored
Normal file
124
.github/workflows/ci.yml
vendored
Normal file
@@ -0,0 +1,124 @@
|
||||
name: Invidious CI
|
||||
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 0 * * *" # Every day at 00:00
|
||||
push:
|
||||
branches:
|
||||
- "master"
|
||||
- "api-only"
|
||||
pull_request:
|
||||
branches: "*"
|
||||
paths-ignore:
|
||||
- "*.md"
|
||||
- LICENCE
|
||||
- TRANSLATION
|
||||
- invidious.service
|
||||
- .git*
|
||||
- .editorconfig
|
||||
|
||||
- screenshots/*
|
||||
- assets/**
|
||||
- locales/*
|
||||
- config/**
|
||||
- .github/ISSUE_TEMPLATE/*
|
||||
- kubernetes/**
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
name: "build - crystal: ${{ matrix.crystal }}, stable: ${{ matrix.stable }}"
|
||||
|
||||
continue-on-error: ${{ !matrix.stable }}
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
stable: [true]
|
||||
crystal:
|
||||
- 1.0.0
|
||||
- 1.1.1
|
||||
- 1.2.2
|
||||
include:
|
||||
- crystal: nightly
|
||||
stable: false
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Install Crystal
|
||||
uses: crystal-lang/install-crystal@v1.5.3
|
||||
with:
|
||||
crystal: ${{ matrix.crystal }}
|
||||
|
||||
- name: Cache Shards
|
||||
uses: actions/cache@v2
|
||||
with:
|
||||
path: ./lib
|
||||
key: shards-${{ hashFiles('shard.lock') }}
|
||||
|
||||
- name: Install Shards
|
||||
run: |
|
||||
if ! shards check; then
|
||||
shards install
|
||||
fi
|
||||
|
||||
- name: Run tests
|
||||
run: crystal spec
|
||||
|
||||
- name: Run lint
|
||||
run: |
|
||||
if ! crystal tool format --check; then
|
||||
crystal tool format
|
||||
git diff
|
||||
exit 1
|
||||
fi
|
||||
|
||||
- name: Build
|
||||
run: crystal build --warnings all --error-on-warnings --error-trace src/invidious.cr
|
||||
|
||||
build-docker:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Build Docker
|
||||
run: docker-compose build --build-arg release=0
|
||||
|
||||
- name: Run Docker
|
||||
run: docker-compose up -d
|
||||
|
||||
- name: Test Docker
|
||||
run: while curl -Isf http://localhost:3000; do sleep 1; done
|
||||
|
||||
build-docker-arm64:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v1
|
||||
with:
|
||||
platforms: arm64
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
|
||||
- name: Build Docker ARM64 image
|
||||
uses: docker/build-push-action@v2
|
||||
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
|
||||
|
||||
|
||||
77
.github/workflows/container-release.yml
vendored
Normal file
77
.github/workflows/container-release.yml
vendored
Normal file
@@ -0,0 +1,77 @@
|
||||
name: Build and release container
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- "master"
|
||||
paths-ignore:
|
||||
- "*.md"
|
||||
- LICENCE
|
||||
- TRANSLATION
|
||||
- invidious.service
|
||||
- .git*
|
||||
- .editorconfig
|
||||
|
||||
- screenshots/*
|
||||
- .github/ISSUE_TEMPLATE/*
|
||||
- kubernetes/**
|
||||
|
||||
jobs:
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v2
|
||||
|
||||
- name: Install Crystal
|
||||
uses: oprypin/install-crystal@v1.2.4
|
||||
with:
|
||||
crystal: 1.2.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@v1
|
||||
with:
|
||||
platforms: arm64
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
|
||||
- name: Login to registry
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
registry: quay.io
|
||||
username: ${{ secrets.QUAY_USERNAME }}
|
||||
password: ${{ secrets.QUAY_PASSWORD }}
|
||||
|
||||
- name: Build and push Docker AMD64 image for Push Event
|
||||
if: github.ref == 'refs/heads/master'
|
||||
uses: docker/build-push-action@v2
|
||||
with:
|
||||
context: .
|
||||
file: docker/Dockerfile
|
||||
platforms: linux/amd64
|
||||
labels: quay.expires-after=12w
|
||||
push: true
|
||||
tags: quay.io/invidious/invidious:${{ github.sha }},quay.io/invidious/invidious:latest
|
||||
build-args: release=1
|
||||
|
||||
- name: Build and push Docker ARM64 image for Push Event
|
||||
if: github.ref == 'refs/heads/master'
|
||||
uses: docker/build-push-action@v2
|
||||
with:
|
||||
context: .
|
||||
file: docker/Dockerfile.arm64
|
||||
platforms: linux/arm64/v8
|
||||
labels: quay.expires-after=12w
|
||||
push: true
|
||||
tags: quay.io/invidious/invidious:${{ github.sha }}-arm64,quay.io/invidious/invidious:latest-arm64
|
||||
build-args: release=1
|
||||
24
.github/workflows/stale.yml
vendored
Normal file
24
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
# Documentation: https://github.com/marketplace/actions/close-stale-issues
|
||||
|
||||
name: "Stale issue handler"
|
||||
on:
|
||||
workflow_dispatch:
|
||||
schedule:
|
||||
- cron: "0 */12 * * *"
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v3
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
days-before-stale: 365
|
||||
days-before-pr-stale: 45 # PRs should be active. Anything that hasn't had activity in more than 45 days should be considered abandoned.
|
||||
days-before-close: 30
|
||||
exempt-pr-labels: blocked
|
||||
stale-issue-message: 'This issue has been automatically marked as stale and will be closed in 30 days because it has not had recent activity and is much likely outdated. If you think this issue is still relevant and applicable, you just have to post a comment and it will be unmarked.'
|
||||
stale-pr-message: 'This pull request has been automatically marked as stale and will be closed in 30 days because it has not had recent activity and is much likely abandoned or outdated. If you think this pull request is still relevant and applicable, you just have to post a comment and it will be unmarked.'
|
||||
stale-issue-label: "stale"
|
||||
stale-pr-label: "stale"
|
||||
ascending: true
|
||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -6,4 +6,4 @@
|
||||
/.vscode/
|
||||
/invidious
|
||||
/sentry
|
||||
shard.lock
|
||||
/config/config.yml
|
||||
|
||||
34
.travis.yml
34
.travis.yml
@@ -1,34 +0,0 @@
|
||||
dist: bionic
|
||||
|
||||
jobs:
|
||||
include:
|
||||
- stage: build
|
||||
# TODO: Shallowly clone again once the .git folder is no longer required for building
|
||||
git:
|
||||
depth: false
|
||||
language: crystal
|
||||
crystal: latest
|
||||
before_install:
|
||||
- shards update
|
||||
- shards install
|
||||
install:
|
||||
- crystal build --warnings all --error-on-warnings src/invidious.cr
|
||||
script:
|
||||
- crystal tool format --check
|
||||
- crystal spec
|
||||
|
||||
- stage: build_docker
|
||||
# TODO: Shallowly clone again once the .git folder is no longer required for building
|
||||
git:
|
||||
depth: false
|
||||
language: minimal
|
||||
services:
|
||||
- docker
|
||||
install:
|
||||
- docker-compose build
|
||||
script:
|
||||
- docker-compose up -d
|
||||
- sleep 15 # Wait for cluster to become ready, TODO: do not sleep
|
||||
- HEADERS="$(curl -I -s http://localhost:3000/)"
|
||||
- STATUS="$(echo $HEADERS | head -n1)"
|
||||
- if [[ "$STATUS" != *"200 OK"* ]]; then echo "$HEADERS"; exit 1; fi
|
||||
@@ -1,3 +1,5 @@
|
||||
# Note: This is no longer updated and links to omarroths repo, which doesn't exist anymore.
|
||||
|
||||
# 0.20.0 (2019-011-06)
|
||||
|
||||
# Version 0.20.0: Custom Playlists
|
||||
@@ -400,7 +402,7 @@ An `/api/v1/stats` endpoint has been added with [#356](https://github.com/omarro
|
||||
|
||||
## For Developers
|
||||
|
||||
`/api/v1/channels/:ucid` now provides an `autoGenerated` tag, which returns true for [topic channels](https://www.youtube.com/channel/UCE80FOXpJydkkMo-BYoJdEg), and larger [genre channels](https://www.youtube.com/channel/UC-9-kyTW8ZkZNDHQJ6FgpwQ) generated by YouTube. These channels don't have any videos of their own, so `latestVideos` will be empty. It is recommended instead to display a list of playlists generated by YouTube.
|
||||
`/api/v1/channels/:ucid` now provides an `autoGenerated` tag, which returns true for topic channels, and larger genre channels generated by YouTube. These channels don't have any videos of their own, so `latestVideos` will be empty. It is recommended instead to display a list of playlists generated by YouTube.
|
||||
|
||||
You can now pull a list of playlists from a channel with `/api/v1/channels/playlists/:ucid`. Supported options are documented in the [wiki](https://github.com/omarroth/invidious/wiki/API#get-apiv1channelsplaylistsucid-apiv1channelsucidplaylists). Pagination is handled with a `continuation` token, which is generated on each call. Of note is that auto-generated channels currently have one page of results, and subsequent calls will be empty.
|
||||
|
||||
|
||||
119
Makefile
Normal file
119
Makefile
Normal file
@@ -0,0 +1,119 @@
|
||||
# -----------------------
|
||||
# Compilation options
|
||||
# -----------------------
|
||||
|
||||
RELEASE := 1
|
||||
STATIC := 0
|
||||
|
||||
DISABLE_QUIC := 0
|
||||
NO_DBG_SYMBOLS := 0
|
||||
|
||||
|
||||
FLAGS ?=
|
||||
|
||||
|
||||
ifeq ($(RELEASE), 1)
|
||||
FLAGS += --release
|
||||
endif
|
||||
|
||||
ifeq ($(STATIC), 1)
|
||||
FLAGS += --static
|
||||
endif
|
||||
|
||||
|
||||
ifeq ($(NO_DBG_SYMBOLS), 1)
|
||||
FLAGS += --no-debug
|
||||
else
|
||||
FLAGS += --debug
|
||||
endif
|
||||
|
||||
ifeq ($(DISABLE_QUIC), 1)
|
||||
FLAGS += -Ddisable_quic
|
||||
endif
|
||||
|
||||
|
||||
# -----------------------
|
||||
# Main
|
||||
# -----------------------
|
||||
|
||||
all: invidious
|
||||
|
||||
get-libs:
|
||||
shards install --production
|
||||
|
||||
# TODO: add support for ARM64 via cross-compilation
|
||||
invidious: get-libs
|
||||
crystal build src/invidious.cr $(FLAGS) --progress --stats --error-trace
|
||||
|
||||
|
||||
run: invidious
|
||||
./invidious
|
||||
|
||||
|
||||
# -----------------------
|
||||
# Development
|
||||
# -----------------------
|
||||
|
||||
|
||||
format:
|
||||
crystal tool format
|
||||
|
||||
test:
|
||||
crystal spec
|
||||
|
||||
verify:
|
||||
crystal build src/invidious.cr -Dskip_videojs_download \
|
||||
--no-codegen --progress --stats --error-trace
|
||||
|
||||
|
||||
# -----------------------
|
||||
# (Un)Install
|
||||
# -----------------------
|
||||
|
||||
# TODO
|
||||
|
||||
|
||||
# -----------------------
|
||||
# Cleaning
|
||||
# -----------------------
|
||||
|
||||
clean:
|
||||
rm invidious
|
||||
|
||||
distclean: clean
|
||||
rm -rf libs
|
||||
|
||||
|
||||
# -----------------------
|
||||
# Help page
|
||||
# -----------------------
|
||||
|
||||
help:
|
||||
@echo "Targets available in this Makefile:"
|
||||
@echo ""
|
||||
@echo " get-libs Fetch Crystal libraries"
|
||||
@echo " invidious Build Invidious"
|
||||
@echo " run Launch Invidious"
|
||||
@echo ""
|
||||
@echo " format Run the Crystal formatter"
|
||||
@echo " test Run tests"
|
||||
@echo " verify Just make sure that the code compiles, but without"
|
||||
@echo " generating any binaries. Useful to search for errors"
|
||||
@echo ""
|
||||
@echo " clean Remove build artifacts"
|
||||
@echo " distclean Remove build artifacts and libraries"
|
||||
@echo ""
|
||||
@echo ""
|
||||
@echo "Build options available for this Makefile:"
|
||||
@echo ""
|
||||
@echo " RELEASE Make a release build (Default: 1)"
|
||||
@echo " STATIC Link libraries statically (Default: 0)"
|
||||
@echo ""
|
||||
@echo " DISABLE_QUIC Disable support for QUIC (Default: 0)"
|
||||
@echo " NO_DBG_SYMBOLS Strip debug symbols (Default: 0)"
|
||||
|
||||
|
||||
|
||||
# No targets generates an output named after themselves
|
||||
.PHONY: all get-libs build amd64 run
|
||||
.PHONY: format test verify clean distclean help
|
||||
342
README.md
342
README.md
@@ -1,235 +1,175 @@
|
||||
# Invidious
|
||||
<div align="center">
|
||||
<img src="assets/invidious-colored-vector.svg" width="192" height="192" alt="Invidious logo">
|
||||
<h1>Invidious</h1>
|
||||
|
||||
[](https://travis-ci.org/omarroth/invidious)
|
||||
<a href="https://www.gnu.org/licenses/agpl-3.0.en.html">
|
||||
<img alt="License: AGPLv3" src="https://shields.io/badge/License-AGPL%20v3-blue.svg">
|
||||
</a>
|
||||
<a href="https://github.com/iv-org/invidious/actions">
|
||||
<img alt="Build Status" src="https://github.com/iv-org/invidious/workflows/Invidious%20CI/badge.svg">
|
||||
</a>
|
||||
<a href="https://github.com/iv-org/invidious/commits/master">
|
||||
<img alt="GitHub commits" src="https://img.shields.io/github/commit-activity/y/iv-org/invidious?color=red&label=commits">
|
||||
</a>
|
||||
<a href="https://github.com/iv-org/invidious/issues">
|
||||
<img alt="GitHub issues" src="https://img.shields.io/github/issues/iv-org/invidious?color=important">
|
||||
</a>
|
||||
<a href="https://github.com/iv-org/invidious/pulls">
|
||||
<img alt="GitHub pull requests" src="https://img.shields.io/github/issues-pr/iv-org/invidious?color=blueviolet">
|
||||
</a>
|
||||
<a href="https://hosted.weblate.org/engage/invidious/">
|
||||
<img alt="Translation Status" src="https://hosted.weblate.org/widgets/invidious/-/translations/svg-badge.svg">
|
||||
</a>
|
||||
|
||||
<a href="https://github.com/humanetech-community/awesome-humane-tech">
|
||||
<img alt="Awesome Humane Tech" src="https://raw.githubusercontent.com/humanetech-community/awesome-humane-tech/main/humane-tech-badge.svg?sanitize=true">
|
||||
</a>
|
||||
|
||||
## Invidious is an alternative front-end to YouTube
|
||||
<h3>An open source alternative front-end to YouTube</h3>
|
||||
|
||||
- Audio-only mode (and no need to keep window open on mobile)
|
||||
- [Free software](https://github.com/omarroth/invidious) (AGPLv3 licensed)
|
||||
- No ads
|
||||
- No need to create a Google account to save subscriptions
|
||||
- Lightweight (homepage is ~4 KB compressed)
|
||||
- Tools for managing subscriptions:
|
||||
- Only show unseen videos
|
||||
- Only show latest (or latest unseen) video from each channel
|
||||
- Delivers notifications from all subscribed channels
|
||||
- Automatically redirect homepage to feed
|
||||
- Import subscriptions from YouTube
|
||||
- Dark mode
|
||||
- Embed support
|
||||
- Set default player options (speed, quality, autoplay, loop)
|
||||
- Does not require JS to play videos
|
||||
- Support for Reddit comments in place of YT comments
|
||||
- Import/Export subscriptions, watch history, preferences
|
||||
- Does not use any of the official YouTube APIs
|
||||
- Developer [API](https://github.com/omarroth/invidious/wiki/API)
|
||||
<a href="https://invidious.io/">Website</a>
|
||||
•
|
||||
<a href="https://instances.invidious.io/">Instances list</a>
|
||||
•
|
||||
<a href="https://docs.invidious.io/FAQ.md">FAQ</a>
|
||||
•
|
||||
<a href="https://docs.invidious.io/">Documentation</a>
|
||||
•
|
||||
<a href="#contribute">Contribute</a>
|
||||
•
|
||||
<a href="https://invidious.io/donate/">Donate</a>
|
||||
|
||||
<h5>Chat with us:</h5>
|
||||
<a href="https://matrix.to/#/#invidious:matrix.org">
|
||||
<img alt="Matrix" src="https://img.shields.io/matrix/invidious:matrix.org?label=Matrix&color=darkgreen">
|
||||
</a>
|
||||
<a href="https://web.libera.chat/?channel=#invidious">
|
||||
<img alt="Libera.chat (IRC)" src="https://img.shields.io/badge/IRC%20%28Libera.chat%29-%23invidious-darkgreen">
|
||||
</a>
|
||||
<br>
|
||||
<a rel="me" href="https://social.tchncs.de/@invidious">
|
||||
<img alt="Mastodon: @invidious@social.tchncs.de" src="https://img.shields.io/badge/Mastodon-%40invidious%40social.tchncs.de-darkgreen">
|
||||
</a>
|
||||
<br>
|
||||
<a href="https://invidious.io/contact/">
|
||||
<img alt="E-mail" src="https://img.shields.io/badge/E%2d%2dmail-darkgreen">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
Liberapay: https://liberapay.com/omarroth
|
||||
BTC: 356DpZyMXu6rYd55Yqzjs29n79kGKWcYrY
|
||||
BCH: qq4ptclkzej5eza6a50et5ggc58hxsq5aylqut2npk
|
||||
|
||||
## Invidious Instances
|
||||
|
||||
See [Invidious Instances](https://github.com/omarroth/invidious/wiki/Invidious-Instances) for a full list of publicly available instances.
|
||||
|
||||
### Official Instances
|
||||
|
||||
- [invidio.us](https://invidio.us) 🇺🇸
|
||||
Issuer: Let's Encrypt, [SSLLabs Verification](https://www.ssllabs.com/ssltest/analyze.html?d=invidio.us)
|
||||
- [kgg2m7yk5aybusll.onion](http://kgg2m7yk5aybusll.onion)
|
||||
- [axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion](http://axqzx4s6s54s32yentfqojs3x5i7faxza6xo3ehd4bzzsg2ii4fv2iid.onion)
|
||||
|
||||
## Screenshots
|
||||
|
||||
| Player | Preferences | Subscriptions |
|
||||
| ----------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
|
||||
| [<img src="screenshots/01_player.png?raw=true" height="140" width="280">](screenshots/01_player.png?raw=true) | [<img src="screenshots/02_preferences.png?raw=true" height="140" width="280">](screenshots/02_preferences.png?raw=true) | [<img src="screenshots/03_subscriptions.png?raw=true" height="140" width="280">](screenshots/03_subscriptions.png?raw=true) |
|
||||
| [<img src="screenshots/04_description.png?raw=true" height="140" width="280">](screenshots/04_description.png?raw=true) | [<img src="screenshots/05_preferences.png?raw=true" height="140" width="280">](screenshots/05_preferences.png?raw=true) | [<img src="screenshots/06_subscriptions.png?raw=true" height="140" width="280">](screenshots/06_subscriptions.png?raw=true) |
|
||||
| Player | Preferences | Subscriptions |
|
||||
|-------------------------------------|-------------------------------------|---------------------------------------|
|
||||
|  |  |  |
|
||||
|  |  |  |
|
||||
|
||||
## Installation
|
||||
|
||||
See [Invidious-Updater](https://github.com/tmiland/Invidious-Updater) for a self-contained script that can automatically install and update Invidious.
|
||||
## Features
|
||||
|
||||
### Docker:
|
||||
**User features**
|
||||
- Lightweight
|
||||
- No ads
|
||||
- No tracking
|
||||
- No JavaScript required
|
||||
- Light/Dark themes
|
||||
- Customizable homepage
|
||||
- Subscriptions independent from Google
|
||||
- Notifications for all subscribed channels
|
||||
- Audio-only mode (with background play on mobile)
|
||||
- Support for Reddit comments
|
||||
- [Available in many languages](locales/), thanks to [our translators](#contribute)
|
||||
|
||||
#### Build and start cluster:
|
||||
**Data import/export**
|
||||
- Import subscriptions from YouTube, NewPipe and Freetube
|
||||
- Import watch history from NewPipe
|
||||
- Export subscriptions to NewPipe and Freetube
|
||||
- Import/Export Invidious user data
|
||||
|
||||
```bash
|
||||
$ docker-compose up
|
||||
```
|
||||
**Technical features**
|
||||
- Embedded video support
|
||||
- [Developer API](https://docs.invidious.io/API.md)
|
||||
- Does not use official YouTube APIs
|
||||
- No Contributor License Agreement (CLA)
|
||||
|
||||
And visit `localhost:3000` in your browser.
|
||||
|
||||
#### Rebuild cluster:
|
||||
## Quick start
|
||||
|
||||
```bash
|
||||
$ docker-compose build
|
||||
```
|
||||
**Using invidious:**
|
||||
|
||||
#### Delete data and rebuild:
|
||||
- [Select a public instance from the list](https://instances.invidious.io) and start watching videos right now!
|
||||
|
||||
```bash
|
||||
$ docker volume rm invidious_postgresdata
|
||||
$ docker-compose build
|
||||
```
|
||||
**Hosting invidious:**
|
||||
|
||||
### Linux:
|
||||
- [Follow the installation instructions](https://docs.invidious.io/Installation.md)
|
||||
|
||||
#### Install dependencies
|
||||
|
||||
```bash
|
||||
# Arch Linux
|
||||
$ sudo pacman -S shards crystal librsvg postgresql
|
||||
|
||||
# Ubuntu or Debian
|
||||
# First you have to add the repository to your APT configuration. For easy setup just run in your command line:
|
||||
$ curl -sSL https://dist.crystal-lang.org/apt/setup.sh | sudo bash
|
||||
# That will add the signing key and the repository configuration. If you prefer to do it manually, execute the following commands:
|
||||
$ curl -sL "https://keybase.io/crystal/pgp_keys.asc" | sudo apt-key add -
|
||||
$ echo "deb https://dist.crystal-lang.org/apt crystal main" | sudo tee /etc/apt/sources.list.d/crystal.list
|
||||
$ sudo apt-get update
|
||||
$ sudo apt install crystal libssl-dev libxml2-dev libyaml-dev libgmp-dev libreadline-dev postgresql librsvg2-bin libsqlite3-dev
|
||||
```
|
||||
|
||||
#### Add invidious user and clone repository
|
||||
|
||||
```bash
|
||||
$ useradd -m invidious
|
||||
$ sudo -i -u invidious
|
||||
$ git clone https://github.com/omarroth/invidious
|
||||
$ exit
|
||||
```
|
||||
|
||||
#### Setup PostgresSQL
|
||||
|
||||
```bash
|
||||
$ sudo systemctl enable postgresql
|
||||
$ sudo systemctl start postgresql
|
||||
$ sudo -i -u postgres
|
||||
$ psql -c "CREATE USER kemal WITH PASSWORD 'kemal';" # Change 'kemal' here to a stronger password, and update `password` in config/config.yml
|
||||
$ createdb -O kemal invidious
|
||||
$ psql invidious kemal < /home/invidious/invidious/config/sql/channels.sql
|
||||
$ psql invidious kemal < /home/invidious/invidious/config/sql/videos.sql
|
||||
$ psql invidious kemal < /home/invidious/invidious/config/sql/channel_videos.sql
|
||||
$ psql invidious kemal < /home/invidious/invidious/config/sql/users.sql
|
||||
$ psql invidious kemal < /home/invidious/invidious/config/sql/session_ids.sql
|
||||
$ psql invidious kemal < /home/invidious/invidious/config/sql/nonces.sql
|
||||
$ psql invidious kemal < /home/invidious/invidious/config/sql/annotations.sql
|
||||
$ exit
|
||||
```
|
||||
|
||||
#### Setup Invidious
|
||||
|
||||
```bash
|
||||
$ sudo -i -u invidious
|
||||
$ cd invidious
|
||||
$ shards update && shards install
|
||||
$ crystal build src/invidious.cr --release
|
||||
# test compiled binary
|
||||
$ ./invidious # stop with ctrl c
|
||||
$ exit
|
||||
```
|
||||
|
||||
#### systemd service
|
||||
|
||||
```bash
|
||||
$ sudo cp /home/invidious/invidious/invidious.service /etc/systemd/system/invidious.service
|
||||
$ sudo systemctl enable invidious.service
|
||||
$ sudo systemctl start invidious.service
|
||||
```
|
||||
|
||||
### OSX:
|
||||
|
||||
```bash
|
||||
# Install dependencies
|
||||
$ brew update
|
||||
$ brew install shards crystal postgres imagemagick librsvg
|
||||
|
||||
# Clone repository and setup postgres database
|
||||
$ git clone https://github.com/omarroth/invidious
|
||||
$ cd invidious
|
||||
$ brew services start postgresql
|
||||
$ psql -c "CREATE ROLE kemal WITH PASSWORD 'kemal';" # Change 'kemal' here to a stronger password, and update `password` in config/config.yml
|
||||
$ createdb -O kemal invidious
|
||||
$ psql invidious kemal < config/sql/channels.sql
|
||||
$ psql invidious kemal < config/sql/videos.sql
|
||||
$ psql invidious kemal < config/sql/channel_videos.sql
|
||||
$ psql invidious kemal < config/sql/users.sql
|
||||
$ psql invidious kemal < config/sql/session_ids.sql
|
||||
$ psql invidious kemal < config/sql/nonces.sql
|
||||
$ psql invidious kemal < config/sql/annotations.sql
|
||||
|
||||
# Setup Invidious
|
||||
$ shards update && shards install
|
||||
$ crystal build src/invidious.cr --release
|
||||
```
|
||||
|
||||
## Update Invidious
|
||||
|
||||
You can see how to update Invidious [here](https://github.com/omarroth/invidious/wiki/Updating).
|
||||
|
||||
## Usage:
|
||||
|
||||
```bash
|
||||
$ ./invidious -h
|
||||
Usage: invidious [arguments]
|
||||
-b HOST, --bind HOST Host to bind (defaults to 0.0.0.0)
|
||||
-p PORT, --port PORT Port to listen for connections (defaults to 3000)
|
||||
-s, --ssl Enables SSL
|
||||
--ssl-key-file FILE SSL key file
|
||||
--ssl-cert-file FILE SSL certificate file
|
||||
-h, --help Shows this help
|
||||
-c THREADS, --channel-threads=THREADS
|
||||
Number of threads for refreshing channels (default: 1)
|
||||
-f THREADS, --feed-threads=THREADS
|
||||
Number of threads for refreshing feeds (default: 1)
|
||||
-o OUTPUT, --output=OUTPUT Redirect output (default: STDOUT)
|
||||
-v, --version Print version
|
||||
```
|
||||
|
||||
Or for development:
|
||||
|
||||
```bash
|
||||
$ curl -fsSLo- https://raw.githubusercontent.com/samueleaton/sentry/master/install.cr | crystal eval
|
||||
$ ./sentry
|
||||
🤖 Your SentryBot is vigilant. beep-boop...
|
||||
```
|
||||
|
||||
## Documentation
|
||||
|
||||
[Documentation](https://github.com/omarroth/invidious/wiki) can be found in the wiki.
|
||||
The full documentation can be accessed online at https://docs.invidious.io/
|
||||
|
||||
## Extensions
|
||||
The documentation's source code is available in this repository:
|
||||
https://github.com/iv-org/documentation
|
||||
|
||||
[Extensions](https://github.com/omarroth/invidious/wiki/Extensions) can be found in the wiki, as well as documentation for integrating it into other projects.
|
||||
### Extensions
|
||||
|
||||
## Made with Invidious
|
||||
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.
|
||||
|
||||
- [FreeTube](https://github.com/FreeTubeApp/FreeTube): An Open Source YouTube app for privacy.
|
||||
- [CloudTube](https://cadence.moe/cloudtube/subscriptions): A JS-rich alternate YouTube player
|
||||
- [PeerTubeify](https://gitlab.com/Ealhad/peertubeify): On YouTube, displays a link to the same video on PeerTube, if it exists.
|
||||
- [MusicPiped](https://github.com/deep-gaurav/MusicPiped): A materialistic music player that streams music from YouTube.
|
||||
The documentation contains a list of browser extensions that we recommended to use along with Invidious.
|
||||
|
||||
## Contributing
|
||||
You can read more here: https://docs.invidious.io/Extensions.md
|
||||
|
||||
1. Fork it ( https://github.com/omarroth/invidious/fork )
|
||||
2. Create your feature branch (git checkout -b my-new-feature)
|
||||
3. Commit your changes (git commit -am 'Add some feature')
|
||||
4. Push to the branch (git push origin my-new-feature)
|
||||
5. Create a new Pull Request
|
||||
|
||||
## Contact
|
||||
## Contribute
|
||||
|
||||
Feel free to send an email to omarroth@protonmail.com or join our [Matrix Server](https://riot.im/app/#/room/#invidious:matrix.org), or #invidious on Freenode.
|
||||
### Code
|
||||
|
||||
You can also view release notes on the [releases](https://github.com/omarroth/invidious/releases) page or in the CHANGELOG.md included in the repository.
|
||||
1. Fork it ( https://github.com/iv-org/invidious/fork ).
|
||||
1. Create your feature branch (`git checkout -b my-new-feature`).
|
||||
1. Stage your files (`git add .`).
|
||||
1. Commit your changes (`git commit -am 'Add some feature'`).
|
||||
1. Push to the branch (`git push origin my-new-feature`).
|
||||
1. Create a new pull request ( https://github.com/iv-org/invidious/compare ).
|
||||
|
||||
## License
|
||||
### Translations
|
||||
|
||||
[](http://www.gnu.org/licenses/agpl-3.0.en.html)
|
||||
We use [Weblate](https://weblate.org) to manage Invidious translations.
|
||||
|
||||
Invidious is Free Software: You can use, study share and improve it at your
|
||||
will. Specifically you can redistribute and/or modify it under the terms of the
|
||||
[GNU Affero General Public License](https://www.gnu.org/licenses/agpl.html) as
|
||||
published by the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
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, ...
|
||||
|
||||
|
||||
## Projects using Invidious
|
||||
|
||||
- [FreeTube](https://github.com/FreeTubeApp/FreeTube): A libre software YouTube app for privacy.
|
||||
- [CloudTube](https://sr.ht/~cadence/tube/): A JavaScript-rich alternate YouTube player.
|
||||
- [PeerTubeify](https://gitlab.com/Cha_deL/peertubeify): On YouTube, displays a link to the same video on PeerTube, if it exists.
|
||||
- [MusicPiped](https://github.com/deep-gaurav/MusicPiped): A material design music player that streams music from YouTube.
|
||||
- [HoloPlay](https://github.com/stephane-r/HoloPlay): Funny Android application connecting on Invidious API's with search, playlists and favorites.
|
||||
|
||||
|
||||
## Liability
|
||||
|
||||
We take no responsibility for the use of our tool, or external instances
|
||||
provided by third parties. We strongly recommend you abide by the valid
|
||||
official regulations in your country. Furthermore, we refuse liability
|
||||
for any inappropriate use of Invidious, such as illegal downloading.
|
||||
This tool is provided to you in the spirit of free, open software.
|
||||
|
||||
You may view the LICENSE in which this software is provided to you [here](./LICENSE).
|
||||
|
||||
> 16. Limitation of Liability.
|
||||
>
|
||||
> IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
1
TRANSLATION
Normal file
1
TRANSLATION
Normal file
@@ -0,0 +1 @@
|
||||
https://hosted.weblate.org/projects/invidious/
|
||||
@@ -1,37 +0,0 @@
|
||||
a:hover,
|
||||
a:active {
|
||||
color: rgb(0, 182, 240);
|
||||
}
|
||||
|
||||
a {
|
||||
color: #a0a0a0;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
body {
|
||||
background-color: rgba(35, 35, 35, 1);
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.pure-form legend {
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.pure-menu-heading {
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
input,
|
||||
select,
|
||||
textarea {
|
||||
color: rgba(35, 35, 35, 1);
|
||||
}
|
||||
|
||||
.pure-form input[type="file"] {
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.navbar > .searchbar input {
|
||||
background-color: inherit;
|
||||
color: inherit;
|
||||
}
|
||||
@@ -5,6 +5,12 @@ body {
|
||||
Arial, sans-serif;
|
||||
}
|
||||
|
||||
#contents {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.deleted {
|
||||
background-color: rgb(255, 0, 0, 0.5);
|
||||
}
|
||||
@@ -13,6 +19,7 @@ body {
|
||||
font-size: 1.17em;
|
||||
font-weight: bold;
|
||||
vertical-align: middle;
|
||||
border-radius: 50%;
|
||||
}
|
||||
|
||||
.channel-profile > img {
|
||||
@@ -20,7 +27,7 @@ body {
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.channel-owner {
|
||||
body a.channel-owner {
|
||||
background-color: #008bec;
|
||||
color: #fff;
|
||||
border-radius: 9px;
|
||||
@@ -60,6 +67,22 @@ body {
|
||||
color: rgb(255, 0, 0);
|
||||
}
|
||||
|
||||
.feed-menu {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.feed-menu-item {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 640px) {
|
||||
.feed-menu-item {
|
||||
flex: 0 0 40%;
|
||||
}
|
||||
}
|
||||
|
||||
.h-box {
|
||||
padding-left: 1em;
|
||||
padding-right: 1em;
|
||||
@@ -85,15 +108,19 @@ div {
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
body a.pure-button {
|
||||
color: rgba(0,0,0,.8);
|
||||
}
|
||||
|
||||
button.pure-button-primary,
|
||||
a.pure-button-primary,
|
||||
body a.pure-button-primary,
|
||||
.channel-owner:hover {
|
||||
background-color: #a0a0a0;
|
||||
color: rgba(35, 35, 35, 1);
|
||||
}
|
||||
|
||||
button.pure-button-primary:hover,
|
||||
a.pure-button-primary:hover {
|
||||
body a.pure-button-primary:hover {
|
||||
background-color: rgba(0, 182, 240, 1);
|
||||
color: #fff;
|
||||
}
|
||||
@@ -152,7 +179,7 @@ img.thumbnail {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.navbar > .searchbar {
|
||||
.searchbar {
|
||||
flex-grow: 2; /* take double the space of the other items */
|
||||
}
|
||||
|
||||
@@ -165,20 +192,24 @@ img.thumbnail {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.navbar > .searchbar .pure-form input[type="search"] {
|
||||
margin-bottom: 1px;
|
||||
.searchbar .pure-form fieldset { padding: 0; }
|
||||
|
||||
border-top: 0;
|
||||
border-left: 0;
|
||||
border-right: 0;
|
||||
border-bottom: 1px solid #ccc;
|
||||
border-radius: 0;
|
||||
.searchbar input[type="search"] {
|
||||
width: 100%;
|
||||
margin: 1px;
|
||||
|
||||
padding: initial 0;
|
||||
border: 1px solid;
|
||||
border-color: #0000 #0000 #CCC #0000;
|
||||
border-radius: 0;
|
||||
|
||||
box-shadow: none;
|
||||
box-shadow: none;
|
||||
-webkit-appearance: none;
|
||||
}
|
||||
|
||||
-webkit-appearance: none;
|
||||
.searchbar input[type="search"]:focus {
|
||||
margin: 0 0 0.5px 0;
|
||||
border: 2px solid;
|
||||
border-color: #0000 #0000 #FED #0000;
|
||||
}
|
||||
|
||||
/* https://stackoverflow.com/a/55170420 */
|
||||
@@ -190,16 +221,6 @@ input[type="search"]::-webkit-search-cancel-button {
|
||||
background-size: 14px;
|
||||
}
|
||||
|
||||
.navbar > .searchbar .pure-form fieldset {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
/* attract focus to the searchbar by adding a subtle transition */
|
||||
.navbar > .searchbar .pure-form input[type="search"]:focus {
|
||||
margin-bottom: 0px;
|
||||
border-bottom: 2px solid #aaa;
|
||||
}
|
||||
|
||||
.user-field {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
@@ -256,21 +277,43 @@ input[type="search"]::-webkit-search-cancel-button {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Video "cards" (results/playlist/channel videos)
|
||||
*/
|
||||
|
||||
.video-card-row { margin: 15px 0; }
|
||||
|
||||
.flexible { display: flex; }
|
||||
.flex-left { flex: 1 1 100%; flex-wrap: wrap; }
|
||||
.flex-right { flex: 1 0 max-content; flex-wrap: nowrap; }
|
||||
|
||||
p.channel-name { margin: 0; }
|
||||
p.video-data { margin: 0; font-weight: bold; font-size: 80%; }
|
||||
|
||||
|
||||
/*
|
||||
* Footer
|
||||
*/
|
||||
|
||||
.footer {
|
||||
color: #666666;
|
||||
margin: 2em 0;
|
||||
footer {
|
||||
color: #919191;
|
||||
margin-top: auto;
|
||||
padding: 1.5em 0;
|
||||
text-align: center;
|
||||
max-height: 30vh;
|
||||
}
|
||||
|
||||
.footer a {
|
||||
color: inherit;
|
||||
footer a {
|
||||
color: #919191 !important;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
footer span {
|
||||
margin: 4px 0;
|
||||
display: block;
|
||||
}
|
||||
|
||||
/* keyframes */
|
||||
|
||||
@keyframes spin {
|
||||
@@ -282,190 +325,224 @@ input[type="search"]::-webkit-search-cancel-button {
|
||||
}
|
||||
}
|
||||
|
||||
/* Control Bar */
|
||||
@media screen and (max-width: 640px) {
|
||||
.video-js .vjs-control-bar,
|
||||
.vjs-menu-button-popup .vjs-menu .vjs-menu-content {
|
||||
overflow-x: scroll;
|
||||
}
|
||||
}
|
||||
|
||||
ul.vjs-menu-content::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.vjs-user-inactive {
|
||||
cursor: none;
|
||||
}
|
||||
|
||||
.video-js .vjs-text-track-display > div > div > div {
|
||||
background-color: rgba(0, 0, 0, 0.75) !important;
|
||||
border-radius: 9px !important;
|
||||
padding: 5px !important;
|
||||
}
|
||||
|
||||
.vjs-play-control,
|
||||
.vjs-volume-panel,
|
||||
.vjs-current-time,
|
||||
.vjs-time-control,
|
||||
.vjs-duration,
|
||||
.vjs-progress-control,
|
||||
.vjs-remaining-time {
|
||||
order: 1;
|
||||
}
|
||||
|
||||
.vjs-captions-button {
|
||||
order: 2;
|
||||
}
|
||||
|
||||
.vjs-quality-selector,
|
||||
.video-js .vjs-http-source-selector {
|
||||
order: 3;
|
||||
}
|
||||
|
||||
.vjs-playback-rate {
|
||||
order: 4;
|
||||
}
|
||||
|
||||
.vjs-share-control {
|
||||
order: 5;
|
||||
}
|
||||
|
||||
.vjs-fullscreen-control {
|
||||
order: 6;
|
||||
}
|
||||
|
||||
.vjs-playback-rate > .vjs-menu {
|
||||
width: 50px;
|
||||
}
|
||||
|
||||
.vjs-control-bar {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
scrollbar-width: none;
|
||||
}
|
||||
|
||||
.vjs-control-bar::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.video-js .vjs-icon-cog {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.video-js .vjs-control-bar,
|
||||
.vjs-menu-button-popup .vjs-menu .vjs-menu-content {
|
||||
background-color: rgba(35, 35, 35, 0.75);
|
||||
}
|
||||
|
||||
.vjs-menu li.vjs-menu-item:focus,
|
||||
.vjs-menu li.vjs-menu-item:hover {
|
||||
background-color: rgba(255, 255, 255, 0.75);
|
||||
color: rgba(49, 49, 51, 0.75);
|
||||
}
|
||||
|
||||
.vjs-menu li.vjs-selected,
|
||||
.vjs-menu li.vjs-selected:focus,
|
||||
.vjs-menu li.vjs-selected:hover {
|
||||
background-color: rgba(0, 182, 240, 0.75);
|
||||
}
|
||||
|
||||
/* Progress Bar */
|
||||
.video-js .vjs-slider {
|
||||
background-color: rgba(15, 15, 15, 0.5);
|
||||
}
|
||||
|
||||
fieldset > select,
|
||||
span > select {
|
||||
color: rgba(49, 49, 51, 1);
|
||||
}
|
||||
|
||||
.video-js .vjs-load-progress,
|
||||
.video-js .vjs-load-progress div {
|
||||
background: rgba(87, 87, 88, 1);
|
||||
}
|
||||
|
||||
.video-js .vjs-slider:hover,
|
||||
.video-js button:hover {
|
||||
color: rgba(0, 182, 240, 1);
|
||||
}
|
||||
|
||||
.video-js .vjs-play-progress {
|
||||
background-color: rgba(0, 182, 240, 1);
|
||||
}
|
||||
|
||||
/* Overlay */
|
||||
.video-js .vjs-overlay {
|
||||
background-color: rgba(35, 35, 35, 0.75);
|
||||
color: rgba(255, 255, 255, 1);
|
||||
}
|
||||
|
||||
/* ProgressBar marker */
|
||||
.vjs-marker {
|
||||
background-color: rgba(255, 255, 255, 1);
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
/* Big "Play" Button */
|
||||
.video-js .vjs-big-play-button {
|
||||
background-color: rgba(35, 35, 35, 0.5);
|
||||
}
|
||||
|
||||
.video-js:hover .vjs-big-play-button {
|
||||
background-color: rgba(35, 35, 35, 0.75);
|
||||
}
|
||||
|
||||
.video-js .vjs-current-time,
|
||||
.video-js .vjs-time-divider,
|
||||
.video-js .vjs-duration {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.video-js .vjs-time-divider {
|
||||
min-width: 0px;
|
||||
padding-left: 0px;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
.video-js .vjs-poster {
|
||||
background-size: cover;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.player-dimensions.vjs-fluid {
|
||||
padding-top: 82vh;
|
||||
}
|
||||
|
||||
video.video-js {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#player-container {
|
||||
position: relative;
|
||||
padding-bottom: 82vh;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.pure-control-group label {
|
||||
word-wrap: normal;
|
||||
}
|
||||
|
||||
.video-js.player-style-invidious {
|
||||
/* This is already the default */
|
||||
/*
|
||||
* Light theme
|
||||
*/
|
||||
|
||||
.light-theme a:hover,
|
||||
.light-theme a:active,
|
||||
.light-theme summary:hover {
|
||||
color: #075A9E !important;
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-control-bar {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
.light-theme a.pure-button-primary:hover {
|
||||
color: #fff !important;
|
||||
}
|
||||
.video-js.player-style-youtube .vjs-big-play-button {
|
||||
/*
|
||||
Styles copied from video-js.min.css, definition of
|
||||
.vjs-big-play-centered .vjs-big-play-button
|
||||
*/
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
margin-top: -0.81666em;
|
||||
margin-left: -1.5em;
|
||||
|
||||
.light-theme a {
|
||||
color: #335d7a;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* All links that do not fit with the default color goes here */
|
||||
.light-theme a:not([data-id]) > .icon,
|
||||
.light-theme .pure-u-lg-1-5 > .h-box > a[href^="/watch?"],
|
||||
.light-theme .playlist-restricted > ol > li > a {
|
||||
color: #303030;
|
||||
}
|
||||
|
||||
.light-theme .pure-menu-heading {
|
||||
color: #565d64;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
.no-theme a:hover,
|
||||
.no-theme a:active,
|
||||
.no-theme summary:hover {
|
||||
color: #075A9E !important;
|
||||
}
|
||||
|
||||
.no-theme a.pure-button-primary:hover {
|
||||
color: #fff !important;
|
||||
}
|
||||
|
||||
.no-theme a {
|
||||
color: #335d7a;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* All links that do not fit with the default color goes here */
|
||||
.no-theme a:not([data-id]) > .icon,
|
||||
.no-theme .pure-u-lg-1-5 > .h-box > a[href^="/watch?"],
|
||||
.no-theme .playlist-restricted > ol > li > a {
|
||||
color: #303030;
|
||||
}
|
||||
|
||||
.light-theme .pure-menu-heading {
|
||||
color: #565d64;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Dark theme
|
||||
*/
|
||||
|
||||
.dark-theme a:hover,
|
||||
.dark-theme a:active,
|
||||
.dark-theme summary:hover {
|
||||
color: rgb(0, 182, 240);
|
||||
}
|
||||
|
||||
.dark-theme a {
|
||||
color: #a0a0a0;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
body.dark-theme {
|
||||
background-color: rgba(35, 35, 35, 1);
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.dark-theme .pure-form legend {
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.dark-theme .pure-menu-heading {
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.dark-theme input,
|
||||
.dark-theme select,
|
||||
.dark-theme textarea {
|
||||
color: rgba(35, 35, 35, 1);
|
||||
}
|
||||
|
||||
.dark-theme .pure-form input[type="file"] {
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.dark-theme .searchbar input {
|
||||
background-color: inherit;
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.no-theme a:hover,
|
||||
.no-theme a:active {
|
||||
color: rgb(0, 182, 240);
|
||||
}
|
||||
|
||||
.no-theme a {
|
||||
color: #a0a0a0;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
body.no-theme {
|
||||
background-color: rgba(35, 35, 35, 1);
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.no-theme .pure-form legend {
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.no-theme .pure-menu-heading {
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.no-theme input,
|
||||
.no-theme select,
|
||||
.no-theme textarea {
|
||||
color: rgba(35, 35, 35, 1);
|
||||
}
|
||||
|
||||
.no-theme .pure-form input[type="file"] {
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
.no-theme .searchbar input {
|
||||
background-color: inherit;
|
||||
color: inherit;
|
||||
}
|
||||
}
|
||||
|
||||
#filters {
|
||||
display: inline;
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
#filters > div {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#filters > summary {
|
||||
display: block;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
#filters > summary::before {
|
||||
content: "[ + ]";
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
#filters[open] > summary::before {
|
||||
content: "[ - ]";
|
||||
font-size: 1.5em;
|
||||
}
|
||||
|
||||
/*With commit d9528f5 all contents of the page is now within a flexbox. However,
|
||||
the hr element is rendered improperly within one.
|
||||
See https://stackoverflow.com/a/34372979 for more info */
|
||||
hr {
|
||||
margin: 10px 0 10px 0;
|
||||
}
|
||||
|
||||
/* Description Expansion Styling*/
|
||||
#descexpansionbutton {
|
||||
display: none
|
||||
}
|
||||
|
||||
#descexpansionbutton ~ div {
|
||||
overflow: hidden;
|
||||
height: 8.3em;
|
||||
}
|
||||
|
||||
#descexpansionbutton:checked ~ div {
|
||||
overflow: unset;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#descexpansionbutton ~ label {
|
||||
order: 1;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* Bidi (bidirectional text) support */
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
p,
|
||||
#descriptionWrapper,
|
||||
#description-box {
|
||||
unicode-bidi: plaintext;
|
||||
text-align: start;
|
||||
}
|
||||
|
||||
#descriptionWrapper {
|
||||
max-width: 600px;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
/* Center the "invidious" logo on the search page */
|
||||
#logo > h1 { text-align: center; }
|
||||
|
||||
26
assets/css/embed.css
Normal file
26
assets/css/embed.css
Normal file
@@ -0,0 +1,26 @@
|
||||
#player {
|
||||
position: fixed;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
min-width: 100%;
|
||||
min-height: 100%;
|
||||
width: auto;
|
||||
height: auto;
|
||||
z-index: -100;
|
||||
}
|
||||
|
||||
.watch-on-invidious {
|
||||
font-size: 1.3em !important;
|
||||
font-weight: bold;
|
||||
white-space: nowrap;
|
||||
margin: 0 1em 0 1em !important;
|
||||
order: 3;
|
||||
}
|
||||
|
||||
.watch-on-invidious > a {
|
||||
color: white;
|
||||
}
|
||||
|
||||
.watch-on-invidious > a:hover {
|
||||
color: rgba(0, 182, 240, 1);;
|
||||
}
|
||||
16
assets/css/empty.css
Normal file
16
assets/css/empty.css
Normal file
@@ -0,0 +1,16 @@
|
||||
#search-widget {
|
||||
text-align: center;
|
||||
margin: 20vh 0 50px 0;
|
||||
}
|
||||
|
||||
#logo > h1 {
|
||||
font-size: 3.5em;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 1500px) and (max-height: 1000px) {
|
||||
#logo > h1 {
|
||||
font-size: 10vmin;
|
||||
}
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
a:hover,
|
||||
a:active {
|
||||
color: #167ac6 !important;
|
||||
}
|
||||
|
||||
a {
|
||||
color: #61809b;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* All links that do not fit with the default color goes here */
|
||||
a:not([data-id]) > .icon,
|
||||
.pure-u-lg-1-5 > .h-box > a[href^="/watch?"],
|
||||
.playlist-restricted > ol > li > a {
|
||||
color: #303030;
|
||||
}
|
||||
254
assets/css/player.css
Normal file
254
assets/css/player.css
Normal file
@@ -0,0 +1,254 @@
|
||||
/* Youtube player style */
|
||||
.video-js.player-style-youtube .vjs-progress-control {
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-progress-control .vjs-progress-holder, .video-js.player-style-youtube .vjs-progress-control {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-control-bar {
|
||||
background: linear-gradient(rgba(0,0,0,0.1), rgba(0, 0, 0,0.5));
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-slider {
|
||||
background-color: rgba(255,255,255,0.2);
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-load-progress > div {
|
||||
background-color: rgba(255,255,255,0.5);
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-play-progress {
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-progress-control:hover .vjs-progress-holder {
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-control-bar > .vjs-spacer {
|
||||
flex: 1;
|
||||
order: 2;
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-play-progress .vjs-time-tooltip {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-play-progress::before {
|
||||
color: red;
|
||||
font-size: 0.85em;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-progress-holder:hover .vjs-play-progress::before {
|
||||
display: unset;
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-control-bar {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-big-play-button {
|
||||
/*
|
||||
Styles copied from video-js.min.css, definition of
|
||||
.vjs-big-play-centered .vjs-big-play-button
|
||||
*/
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
margin-top: -0.81666em;
|
||||
margin-left: -1.5em;
|
||||
}
|
||||
|
||||
.video-js.player-style-youtube .vjs-menu-button-popup .vjs-menu {
|
||||
margin-bottom: 2em;
|
||||
}
|
||||
|
||||
ul.vjs-menu-content::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.vjs-user-inactive {
|
||||
cursor: none;
|
||||
}
|
||||
|
||||
.video-js .vjs-text-track-display > div > div > div {
|
||||
background-color: rgba(0, 0, 0, 0.75) !important;
|
||||
border-radius: 9px !important;
|
||||
padding: 5px !important;
|
||||
}
|
||||
|
||||
.vjs-play-control,
|
||||
.vjs-volume-panel,
|
||||
.vjs-current-time,
|
||||
.vjs-time-control,
|
||||
.vjs-duration,
|
||||
.vjs-progress-control,
|
||||
.vjs-remaining-time {
|
||||
order: 1;
|
||||
}
|
||||
|
||||
.vjs-captions-button {
|
||||
order: 2;
|
||||
}
|
||||
|
||||
.vjs-quality-selector,
|
||||
.video-js .vjs-http-source-selector {
|
||||
order: 3;
|
||||
}
|
||||
|
||||
.vjs-playback-rate {
|
||||
order: 4;
|
||||
}
|
||||
|
||||
.vjs-share-control {
|
||||
order: 5;
|
||||
}
|
||||
|
||||
.vjs-fullscreen-control {
|
||||
order: 6;
|
||||
}
|
||||
|
||||
.vjs-playback-rate > .vjs-menu {
|
||||
width: 50px;
|
||||
}
|
||||
|
||||
.vjs-control-bar {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
scrollbar-width: none;
|
||||
}
|
||||
|
||||
.vjs-control-bar::-webkit-scrollbar {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.video-js .vjs-icon-cog {
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
.video-js .vjs-control-bar,
|
||||
.vjs-menu-button-popup .vjs-menu .vjs-menu-content {
|
||||
background-color: rgba(35, 35, 35, 0.75);
|
||||
}
|
||||
|
||||
.vjs-menu li.vjs-menu-item:focus,
|
||||
.vjs-menu li.vjs-menu-item:hover {
|
||||
background-color: rgba(255, 255, 255, 0.75);
|
||||
color: rgba(49, 49, 51, 0.75);
|
||||
}
|
||||
|
||||
.vjs-menu li.vjs-selected,
|
||||
.vjs-menu li.vjs-selected:focus,
|
||||
.vjs-menu li.vjs-selected:hover {
|
||||
background-color: rgba(0, 182, 240, 0.75);
|
||||
}
|
||||
|
||||
/* Progress Bar */
|
||||
.video-js .vjs-slider {
|
||||
background-color: rgba(15, 15, 15, 0.5);
|
||||
}
|
||||
|
||||
.video-js .vjs-load-progress,
|
||||
.video-js .vjs-load-progress div {
|
||||
background: rgba(87, 87, 88, 1);
|
||||
}
|
||||
|
||||
.video-js .vjs-slider:hover,
|
||||
.video-js button:hover {
|
||||
color: rgba(0, 182, 240, 1);
|
||||
}
|
||||
|
||||
.video-js.player-style-invidious .vjs-play-progress {
|
||||
background-color: rgba(0, 182, 240, 1);
|
||||
}
|
||||
vjs-menu-content
|
||||
/* Overlay */
|
||||
.video-js .vjs-overlay {
|
||||
background-color: rgba(35, 35, 35, 0.75);
|
||||
color: rgba(255, 255, 255, 1);
|
||||
}
|
||||
|
||||
/* ProgressBar marker */
|
||||
.vjs-marker {
|
||||
background-color: rgba(255, 255, 255, 1);
|
||||
z-index: 0;
|
||||
}
|
||||
|
||||
/* Big "Play" Button */
|
||||
.video-js .vjs-big-play-button {
|
||||
background-color: rgba(35, 35, 35, 0.5);
|
||||
}
|
||||
|
||||
.video-js:hover .vjs-big-play-button {
|
||||
background-color: rgba(35, 35, 35, 0.75);
|
||||
}
|
||||
|
||||
.video-js .vjs-current-time,
|
||||
.video-js .vjs-time-divider,
|
||||
.video-js .vjs-duration {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.video-js .vjs-time-divider {
|
||||
min-width: 0px;
|
||||
padding-left: 0px;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
.video-js .vjs-poster {
|
||||
background-size: cover;
|
||||
object-fit: cover;
|
||||
}
|
||||
|
||||
.player-dimensions.vjs-fluid {
|
||||
padding-top: 82vh;
|
||||
}
|
||||
|
||||
video.video-js {
|
||||
position: absolute;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
#player-container {
|
||||
position: relative;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
margin-left: 1em;
|
||||
margin-right: 1em;
|
||||
padding-bottom: 82vh;
|
||||
height: 0;
|
||||
}
|
||||
|
||||
.mobile-operations-bar {
|
||||
display: flex;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 1px !important;
|
||||
left: initial !important;
|
||||
width: initial !important;
|
||||
}
|
||||
|
||||
.mobile-operations-bar ul {
|
||||
position: absolute !important;
|
||||
bottom: unset !important;
|
||||
top: 1.5em;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 700px) {
|
||||
.video-js .vjs-share {
|
||||
justify-content: unset;
|
||||
}
|
||||
}
|
||||
|
||||
@media screen and (max-width: 650px) {
|
||||
.vjs-modal-dialog-content {
|
||||
overflow-x: hidden;
|
||||
}
|
||||
}
|
||||
1
assets/css/video-js.min.css
vendored
1
assets/css/video-js.min.css
vendored
File diff suppressed because one or more lines are too long
@@ -1,7 +0,0 @@
|
||||
/**
|
||||
* videojs-http-source-selector
|
||||
* @version 1.1.6
|
||||
* @copyright 2019 Justin Fujita <Justin@pivotshare.com>
|
||||
* @license MIT
|
||||
*/
|
||||
.video-js.vjs-http-source-selector{display:block}
|
||||
@@ -1 +0,0 @@
|
||||
.video-js .vjs-overlay{color:#fff;position:absolute;text-align:center}.video-js .vjs-overlay-no-background{max-width:33%}.video-js .vjs-overlay-background{background-color:#646464;background-color:rgba(255,255,255,0.4);border-radius:3px;padding:10px;width:33%}.video-js .vjs-overlay-top-left{top:5px;left:5px}.video-js .vjs-overlay-top{left:50%;margin-left:-16.5%;top:5px}.video-js .vjs-overlay-top-right{right:5px;top:5px}.video-js .vjs-overlay-right{right:5px;top:50%;transform:translateY(-50%)}.video-js .vjs-overlay-bottom-right{bottom:3.5em;right:5px}.video-js .vjs-overlay-bottom{bottom:3.5em;left:50%;margin-left:-16.5%}.video-js .vjs-overlay-bottom-left{bottom:3.5em;left:5px}.video-js .vjs-overlay-left{left:5px;top:50%;transform:translateY(-50%)}.video-js .vjs-overlay-center{left:50%;margin-left:-16.5%;top:50%;transform:translateY(-50%)}.video-js .vjs-no-flex .vjs-overlay-left,.video-js .vjs-no-flex .vjs-overlay-center,.video-js .vjs-no-flex .vjs-overlay-right{margin-top:-15px}
|
||||
@@ -1,7 +0,0 @@
|
||||
/**
|
||||
* videojs-share
|
||||
* @version 3.2.1
|
||||
* @copyright 2019 Mikhail Khazov <mkhazov.work@gmail.com>
|
||||
* @license MIT
|
||||
*/
|
||||
.video-js.vjs-videojs-share_open .vjs-modal-dialog .vjs-modal-dialog-content{display:flex;align-items:center;padding:0;background-image:linear-gradient(to bottom, rgba(0,0,0,0.77), rgba(0,0,0,0.75))}.video-js.vjs-videojs-share_open .vjs-modal-dialog .vjs-close-button{position:absolute;right:0;top:5px;width:30px;height:30px;color:#fff;cursor:pointer;opacity:0.9;transition:opacity 0.25s ease-out}.video-js.vjs-videojs-share_open .vjs-modal-dialog .vjs-close-button:before{content:'×';font-size:20px;line-height:15px}.video-js.vjs-videojs-share_open .vjs-modal-dialog .vjs-close-button:hover{opacity:1}.video-js .vjs-share{display:flex;flex-direction:column;justify-content:space-around;align-items:center;width:100%;height:100%;max-height:400px}.video-js .vjs-share__top,.video-js .vjs-share__middle,.video-js .vjs-share__bottom{display:flex}.video-js .vjs-share__top,.video-js .vjs-share__middle{flex-direction:column;justify-content:space-between}.video-js .vjs-share__middle{padding:0 25px}.video-js .vjs-share__title{align-self:center;font-size:22px;color:#fff}.video-js .vjs-share__subtitle{width:100%;margin:0 auto 12px;font-size:16px;color:#fff;opacity:0.7}.video-js .vjs-share__short-link-wrapper{position:relative;display:block;width:100%;height:40px;margin:0 auto;margin-bottom:15px;border:0;color:rgba(255,255,255,0.65);background-color:#363636;outline:none;overflow:hidden;flex-shrink:0}.video-js .vjs-share__short-link{display:block;width:100%;height:100%;padding:0 40px 0 15px;border:0;color:rgba(255,255,255,0.65);background-color:#363636;outline:none}.video-js .vjs-share__btn{position:absolute;right:0;bottom:0;height:40px;width:40px;display:flex;align-items:center;padding:0 11px;border:0;color:#fff;background-color:#2e2e2e;background-size:18px 19px;background-position:center;background-repeat:no-repeat;cursor:pointer;outline:none;transition:width 0.3s ease-out, padding 0.3s ease-out}.video-js .vjs-share__btn svg{flex-shrink:0}.video-js .vjs-share__btn span{position:relative;padding-left:10px;opacity:0;transition:opacity 0.3s ease-out}.video-js .vjs-share__btn:hover{justify-content:center;width:100%;padding:0 40px;background-image:none}.video-js .vjs-share__btn:hover span{opacity:1}.video-js .vjs-share__socials{display:flex;flex-wrap:wrap;justify-content:center;align-content:flex-start;transition:width 0.3s ease-out, height 0.3s ease-out}.video-js .vjs-share__social{display:flex;justify-content:center;align-items:center;flex-shrink:0;width:32px;height:32px;margin-right:6px;margin-bottom:6px;cursor:pointer;font-size:8px;transition:transform 0.3s ease-out, filter 0.2s ease-out;border:none;outline:none}.video-js .vjs-share__social:hover{filter:brightness(115%)}.video-js .vjs-share__social svg{overflow:visible;max-height:24px}.video-js .vjs-share__social_vk{background-color:#5d7294}.video-js .vjs-share__social_ok{background-color:#ed7c20}.video-js .vjs-share__social_mail,.video-js .vjs-share__social_email{background-color:#134785}.video-js .vjs-share__social_tw{background-color:#76aaeb}.video-js .vjs-share__social_reddit{background-color:#ff4500}.video-js .vjs-share__social_fbFeed{background-color:#475995}.video-js .vjs-share__social_messenger{background-color:#0084ff}.video-js .vjs-share__social_gp{background-color:#d53f35}.video-js .vjs-share__social_linkedin{background-color:#0077b5}.video-js .vjs-share__social_viber{background-color:#766db5}.video-js .vjs-share__social_telegram{background-color:#4bb0e2}.video-js .vjs-share__social_whatsapp{background-color:#78c870}.video-js .vjs-share__bottom{justify-content:center}@media (max-height: 220px){.video-js .vjs-share .hidden-xs{display:none}}@media (max-height: 350px){.video-js .vjs-share .hidden-sm{display:none}}@media (min-height: 400px){.video-js .vjs-share__title{margin-bottom:15px}.video-js .vjs-share__short-link-wrapper{margin-bottom:30px}}@media (min-width: 320px){.video-js.vjs-videojs-share_open .vjs-modal-dialog .vjs-close-button{right:5px;top:10px}}@media (min-width: 660px){.video-js.vjs-videojs-share_open .vjs-modal-dialog .vjs-close-button{right:20px;top:20px}.video-js .vjs-share__social{width:40px;height:40px}}
|
||||
@@ -1,7 +0,0 @@
|
||||
/**
|
||||
* videojs-vtt-thumbnails
|
||||
* @version 0.0.13
|
||||
* @copyright 2019 Chris Boustead <chris@forgemotion.com>
|
||||
* @license MIT
|
||||
*/
|
||||
.video-js.vjs-vtt-thumbnails{display:block}.video-js .vjs-vtt-thumbnail-display{position:absolute;bottom:85%;pointer-events:none;box-shadow:0 0 7px rgba(0,0,0,0.6)}
|
||||
1
assets/css/videojs.markers.min.css
vendored
1
assets/css/videojs.markers.min.css
vendored
@@ -1 +0,0 @@
|
||||
.vjs-marker{position:absolute;left:0;bottom:0;opacity:1;height:100%;transition:opacity .2s ease;-webkit-transition:opacity .2s ease;-moz-transition:opacity .2s ease;z-index:100}.vjs-marker:hover{cursor:pointer;-webkit-transform:scale(1.3,1.3);-moz-transform:scale(1.3,1.3);-o-transform:scale(1.3,1.3);-ms-transform:scale(1.3,1.3);transform:scale(1.3,1.3)}.vjs-tip{visibility:hidden;display:block;opacity:.8;padding:5px;font-size:10px;position:absolute;bottom:14px;z-index:100000}.vjs-tip .vjs-tip-arrow{background:url(data:image/gif;base64,R0lGODlhCQAJAIABAAAAAAAAACH5BAEAAAEALAAAAAAJAAkAAAIRjAOnwIrcDJxvwkplPtchVQAAOw==) no-repeat top left;bottom:0;left:50%;margin-left:-4px;background-position:bottom left;position:absolute;width:9px;height:5px}.vjs-tip .vjs-tip-inner{border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;padding:5px 8px 4px 8px;background-color:#000;color:#fff;max-width:200px;text-align:center}.vjs-break-overlay{visibility:hidden;position:absolute;z-index:100000;top:0}.vjs-break-overlay .vjs-break-overlay-text{padding:9px;text-align:center}
|
||||
2
assets/invidious-colored-vector.svg
Normal file
2
assets/invidious-colored-vector.svg
Normal file
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="512pt" height="512pt" version="1.0" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><g><rect x="-.0072516" y=".00056299" width="512.01" height="512.02" fill="#575757" stroke-width=".063019"/><path d="m247.17 455.95c-19.792-0.78921-38.719-4.2564-57.154-10.47-60.968-20.55-108.68-68.579-127-127.86-7.8955-25.538-10.062-53.943-6.2586-82.067 3.7105-27.439 13.603-53.515 29.342-77.344 12.069-18.273 29.138-36.277 47.228-49.816 36.891-27.61 85.944-42.49 132.38-40.157 25.88 1.3001 49.939 6.765 73.106 16.606 8.1948 3.481 20.024 9.6845 27.696 14.525 14.15 8.9272 22.367 15.498 34.482 27.573 13.254 13.211 22.128 24.276 30.398 37.906 7.2081 11.879 14.099 27.15 18.229 40.397 1.5996 5.1305 4.442 16.456 5.6852 22.653 2.3908 11.917 2.6998 15.722 2.7049 33.312 6e-3 18.515-0.46256 24.413-2.9166 36.758-9.3274 46.92-35.58 88.167-74.872 117.64-22.814 17.112-50.027 29.535-78.547 35.858-16.714 3.7059-35.421 5.2453-54.498 4.4846zm-35.1-78.786c-5.3e-4 -0.52647-0.0741-2.0564-0.16311-3.3999l-0.16178-2.4427-4.7018-0.26271c-4.0477-0.22614-4.7968-0.33363-5.3847-0.77253-2.0235-1.5108-1.4679-6.0695 2.2494-18.457 0.8637-2.8781 3.3371-11.321 5.4966-18.762 2.1594-7.4409 5.2002-17.836 6.7573-23.101 1.5571-5.2648 4.1948-14.282 5.8615-20.038 1.6667-5.7562 3.6145-12.4 4.3284-14.764 0.71391-2.3641 3.2583-11.037 5.6542-19.272 4.9475-17.007 8.1626-27.723 8.9438-29.811 0.51852-1.3858 0.54785-1.4139 0.99761-0.95317 0.25486 0.26106 3.8462 7.3667 7.9807 15.79 4.1345 8.4236 13.089 26.573 19.898 40.331 17.188 34.73 37.849 76.578 43.261 87.622l4.5356 9.257 11.359-0.0895c6.2475-0.0492 11.615-0.19623 11.929-0.32672 0.5614-0.23385 0.54167-0.2959-1.3723-4.3176-1.068-2.2442-8.1436-16.601-15.724-31.904-48.687-98.293-61.22-123.86-67.889-138.48-4.7022-10.309-6.9031-14.807-7.7139-15.762-0.82931-0.97742-1.6319-1.0638-2.3704-0.25525-1.1993 1.313-4.1046 10.063-9.3869 28.27-2.0569 7.0899-6.5372 22.425-9.9562 34.077-6.6396 22.629-8.5182 29.037-14.33 48.883-2.0354 6.9495-4.7977 16.369-6.1385 20.931-1.3408 4.5628-4.033 13.81-5.9826 20.549-4.304 14.877-6.136 20.889-7.3886 24.25-2.1371 5.7334-2.5723 6.3292-4.9216 6.7384-0.88855 0.15472-2.4102 0.28196-3.3815 0.28275-2.1993 3e-3 -3.5494 0.36339-4.0558 1.0863-0.42176 0.60215-0.56421 4.8802-0.18251 5.4812 0.20573 0.32388 2.4672 0.37414 23.34 0.51873l8.6151 0.0597-7e-4 -0.95723zm36.751-205.59c4.3282-0.92335 8.4607-4.943 9.4374-9.1796 0.36569-1.5862 0.32543-4.9758-0.077-6.4799-0.85108-3.1813-3.2688-6.291-6.039-7.7675-3.8111-2.0313-9.456-2.0295-13.272 5e-3 -5.9828 3.1888-8.1556 11.089-4.7878 17.408 2.6995 5.0648 8.3611 7.3754 14.738 6.015z" fill="#f0f0f0" stroke-width=".025526"/></g><g transform="matrix(.069892 0 0 -.069892 44.236 474.48)"><path d="m2787 4669c-124-65-123-255 3-319 86-44 196-16 247 62 58 87 26 211-67 258-51 26-132 26-183-1z" fill="#00b6f0" stroke="#00b6f0" stroke-width="4.25"/><path d="m2882 4108c-12-16-63-166-102-303-30-104-101-350-165-565-20-69-58-199-85-290-26-91-64-221-85-290-20-69-58-199-85-290-26-91-64-221-85-290-20-69-57-195-81-280-59-207-93-299-115-310-10-6-35-10-56-10-73 0-84-8-81-54l3-41 228-3 228-2-3 47-3 48-73 3c-66 3-74 5-84 27-13 28 0 104 37 225 13 41 47 156 75 255s66 230 85 290c18 61 56 191 85 290 28 99 66 230 85 290 18 61 56 191 85 290 85 297 123 419 131 429 5 5 17-11 28-35 10-24 192-393 403-819s447-902 523-1058l139-282h168c92 0 168 4 168 8s-75 158-166 342c-588 1183-969 1958-1033 2100-29 63-69 151-89 195-44 95-58 110-80 83z" fill="#575757"/></g></svg>
|
||||
|
After Width: | Height: | Size: 3.4 KiB |
@@ -1,3 +1,5 @@
|
||||
var community_data = JSON.parse(document.getElementById('community_data').innerHTML);
|
||||
|
||||
String.prototype.supplant = function (o) {
|
||||
return this.replace(/{([^{}]*)}/g, function (a, b) {
|
||||
var r = o[b];
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
var video_data = JSON.parse(document.getElementById('video_data').innerHTML);
|
||||
|
||||
function get_playlist(plid, retries) {
|
||||
if (retries == undefined) retries = 5;
|
||||
|
||||
@@ -29,6 +31,11 @@ function get_playlist(plid, retries) {
|
||||
player.on('ended', function () {
|
||||
var url = new URL('https://example.com/embed/' + xhr.response.nextVideo);
|
||||
|
||||
url.searchParams.set('list', plid);
|
||||
if (!plid.startsWith('RD')) {
|
||||
url.searchParams.set('index', xhr.response.index);
|
||||
}
|
||||
|
||||
if (video_data.params.autoplay || video_data.params.continue_autoplay) {
|
||||
url.searchParams.set('autoplay', '1');
|
||||
}
|
||||
@@ -45,10 +52,6 @@ function get_playlist(plid, retries) {
|
||||
url.searchParams.set('local', video_data.params.local);
|
||||
}
|
||||
|
||||
url.searchParams.set('list', plid);
|
||||
if (!plid.startsWith('RD')) {
|
||||
url.searchParams.set('index', xhr.response.index);
|
||||
}
|
||||
location.assign(url.pathname + url.search);
|
||||
});
|
||||
}
|
||||
|
||||
167
assets/js/handlers.js
Normal file
167
assets/js/handlers.js
Normal file
@@ -0,0 +1,167 @@
|
||||
'use strict';
|
||||
|
||||
(function () {
|
||||
var n2a = function (n) { return Array.prototype.slice.call(n); };
|
||||
|
||||
var video_player = document.getElementById('player_html5_api');
|
||||
if (video_player) {
|
||||
video_player.onmouseenter = function () { video_player['data-title'] = video_player['title']; video_player['title'] = ''; };
|
||||
video_player.onmouseleave = function () { video_player['title'] = video_player['data-title']; video_player['data-title'] = ''; };
|
||||
video_player.oncontextmenu = function () { video_player['title'] = video_player['data-title']; };
|
||||
}
|
||||
|
||||
// For dynamically inserted elements
|
||||
document.addEventListener('click', function (e) {
|
||||
if (!e || !e.target) { return; }
|
||||
e = e.target;
|
||||
var handler_name = e.getAttribute('data-onclick');
|
||||
switch (handler_name) {
|
||||
case 'jump_to_time':
|
||||
var time = e.getAttribute('data-jump-time');
|
||||
player.currentTime(time);
|
||||
break;
|
||||
case 'get_youtube_replies':
|
||||
var load_more = e.getAttribute('data-load-more') !== null;
|
||||
var load_replies = e.getAttribute('data-load-replies') !== null;
|
||||
get_youtube_replies(e, load_more, load_replies);
|
||||
break;
|
||||
case 'toggle_parent':
|
||||
toggle_parent(e);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
n2a(document.querySelectorAll('[data-mouse="switch_classes"]')).forEach(function (e) {
|
||||
var classes = e.getAttribute('data-switch-classes').split(',');
|
||||
var ec = classes[0];
|
||||
var lc = classes[1];
|
||||
var onoff = function (on, off) {
|
||||
var cs = e.getAttribute('class');
|
||||
cs = cs.split(off).join(on);
|
||||
e.setAttribute('class', cs);
|
||||
};
|
||||
e.onmouseenter = function () { onoff(ec, lc); };
|
||||
e.onmouseleave = function () { onoff(lc, ec); };
|
||||
});
|
||||
|
||||
n2a(document.querySelectorAll('[data-onsubmit="return_false"]')).forEach(function (e) {
|
||||
e.onsubmit = function () { return false; };
|
||||
});
|
||||
|
||||
n2a(document.querySelectorAll('[data-onclick="mark_watched"]')).forEach(function (e) {
|
||||
e.onclick = function () { mark_watched(e); };
|
||||
});
|
||||
n2a(document.querySelectorAll('[data-onclick="mark_unwatched"]')).forEach(function (e) {
|
||||
e.onclick = function () { mark_unwatched(e); };
|
||||
});
|
||||
n2a(document.querySelectorAll('[data-onclick="add_playlist_video"]')).forEach(function (e) {
|
||||
e.onclick = function () { add_playlist_video(e); };
|
||||
});
|
||||
n2a(document.querySelectorAll('[data-onclick="add_playlist_item"]')).forEach(function (e) {
|
||||
e.onclick = function () { add_playlist_item(e); };
|
||||
});
|
||||
n2a(document.querySelectorAll('[data-onclick="remove_playlist_item"]')).forEach(function (e) {
|
||||
e.onclick = function () { remove_playlist_item(e); };
|
||||
});
|
||||
n2a(document.querySelectorAll('[data-onclick="revoke_token"]')).forEach(function (e) {
|
||||
e.onclick = function () { revoke_token(e); };
|
||||
});
|
||||
n2a(document.querySelectorAll('[data-onclick="remove_subscription"]')).forEach(function (e) {
|
||||
e.onclick = function () { remove_subscription(e); };
|
||||
});
|
||||
n2a(document.querySelectorAll('[data-onclick="notification_requestPermission"]')).forEach(function (e) {
|
||||
e.onclick = function () { Notification.requestPermission(); };
|
||||
});
|
||||
|
||||
n2a(document.querySelectorAll('[data-onrange="update_volume_value"]')).forEach(function (e) {
|
||||
var cb = function () { update_volume_value(e); }
|
||||
e.oninput = cb;
|
||||
e.onchange = cb;
|
||||
});
|
||||
|
||||
function update_volume_value(element) {
|
||||
document.getElementById('volume-value').innerText = element.value;
|
||||
}
|
||||
|
||||
function revoke_token(target) {
|
||||
var row = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||
row.style.display = 'none';
|
||||
var count = document.getElementById('count');
|
||||
count.innerText = count.innerText - 1;
|
||||
|
||||
var referer = window.encodeURIComponent(document.location.href);
|
||||
var url = '/token_ajax?action_revoke_token=1&redirect=false' +
|
||||
'&referer=' + referer +
|
||||
'&session=' + target.getAttribute('data-session');
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.responseType = 'json';
|
||||
xhr.timeout = 10000;
|
||||
xhr.open('POST', url, true);
|
||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||
|
||||
xhr.onreadystatechange = function () {
|
||||
if (xhr.readyState == 4) {
|
||||
if (xhr.status != 200) {
|
||||
count.innerText = parseInt(count.innerText) + 1;
|
||||
row.style.display = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var csrf_token = target.parentNode.querySelector('input[name="csrf_token"]').value;
|
||||
xhr.send('csrf_token=' + csrf_token);
|
||||
}
|
||||
|
||||
function remove_subscription(target) {
|
||||
var row = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||
row.style.display = 'none';
|
||||
var count = document.getElementById('count');
|
||||
count.innerText = count.innerText - 1;
|
||||
|
||||
var referer = window.encodeURIComponent(document.location.href);
|
||||
var url = '/subscription_ajax?action_remove_subscriptions=1&redirect=false' +
|
||||
'&referer=' + referer +
|
||||
'&c=' + target.getAttribute('data-ucid');
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.responseType = 'json';
|
||||
xhr.timeout = 10000;
|
||||
xhr.open('POST', url, true);
|
||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||
|
||||
xhr.onreadystatechange = function () {
|
||||
if (xhr.readyState == 4) {
|
||||
if (xhr.status != 200) {
|
||||
count.innerText = parseInt(count.innerText) + 1;
|
||||
row.style.display = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
var csrf_token = target.parentNode.querySelector('input[name="csrf_token"]').value;
|
||||
xhr.send('csrf_token=' + csrf_token);
|
||||
}
|
||||
|
||||
// Handle keypresses
|
||||
window.addEventListener('keydown', (event) => {
|
||||
// Ignore modifier keys
|
||||
if (event.ctrlKey || event.metaKey) return;
|
||||
|
||||
// Ignore shortcuts if any text input is focused
|
||||
let focused_tag = document.activeElement.tagName.toLowerCase();
|
||||
const allowed = /^(button|checkbox|file|radio|submit)$/;
|
||||
|
||||
if (focused_tag === "textarea") return;
|
||||
if (focused_tag === "input") {
|
||||
let focused_type = document.activeElement.type.toLowerCase();
|
||||
if (!focused_type.match(allowed)) return;
|
||||
}
|
||||
|
||||
// Focus search bar on '/'
|
||||
if (event.key == "/") {
|
||||
document.getElementById('searchbox').focus();
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
})();
|
||||
@@ -1,3 +1,5 @@
|
||||
var notification_data = JSON.parse(document.getElementById('notification_data').innerHTML);
|
||||
|
||||
var notifications, delivered;
|
||||
|
||||
function get_subscriptions(callback, retries) {
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
var player_data = JSON.parse(document.getElementById('player_data').innerHTML);
|
||||
var video_data = JSON.parse(document.getElementById('video_data').innerHTML);
|
||||
|
||||
var options = {
|
||||
preload: 'auto',
|
||||
liveui: true,
|
||||
@@ -11,11 +14,18 @@ var options = {
|
||||
'durationDisplay',
|
||||
'progressControl',
|
||||
'remainingTimeDisplay',
|
||||
'Spacer',
|
||||
'captionsButton',
|
||||
'qualitySelector',
|
||||
'playbackRateMenuButton',
|
||||
'fullscreenToggle'
|
||||
]
|
||||
},
|
||||
html5: {
|
||||
preloadTextTracks: false,
|
||||
vhs: {
|
||||
overrideNative: true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,41 +35,119 @@ if (player_data.aspect_ratio) {
|
||||
|
||||
var embed_url = new URL(location);
|
||||
embed_url.searchParams.delete('v');
|
||||
short_url = location.origin + '/' + video_data.id + embed_url.search;
|
||||
var short_url = location.origin + '/' + video_data.id + embed_url.search;
|
||||
embed_url = location.origin + '/embed/' + video_data.id + embed_url.search;
|
||||
|
||||
var save_player_pos_key = "save_player_pos";
|
||||
|
||||
videojs.Vhs.xhr.beforeRequest = function(options) {
|
||||
if (options.uri.indexOf('videoplayback') === -1 && options.uri.indexOf('local=true') === -1) {
|
||||
options.uri = options.uri + '?local=true';
|
||||
}
|
||||
return options;
|
||||
};
|
||||
|
||||
var player = videojs('player', options);
|
||||
|
||||
/**
|
||||
* Function for add time argument to url
|
||||
* @param {String} url
|
||||
* @returns urlWithTimeArg
|
||||
*/
|
||||
function addCurrentTimeToURL(url) {
|
||||
var urlUsed = new URL(url);
|
||||
urlUsed.searchParams.delete('start');
|
||||
var currentTime = Math.ceil(player.currentTime());
|
||||
if (currentTime > 0)
|
||||
urlUsed.searchParams.set('t', currentTime);
|
||||
else if (urlUsed.searchParams.has('t'))
|
||||
urlUsed.searchParams.delete('t');
|
||||
return urlUsed;
|
||||
}
|
||||
|
||||
var shareOptions = {
|
||||
socials: ['fbFeed', 'tw', 'reddit', 'email'],
|
||||
|
||||
url: short_url,
|
||||
get url() {
|
||||
return addCurrentTimeToURL(short_url);
|
||||
},
|
||||
title: player_data.title,
|
||||
description: player_data.description,
|
||||
image: player_data.thumbnail,
|
||||
embedCode: "<iframe id='ivplayer' type='text/html' width='640' height='360' src='" + embed_url + "' frameborder='0'></iframe>"
|
||||
}
|
||||
get embedCode() {
|
||||
return "<iframe id='ivplayer' width='640' height='360' src='" +
|
||||
addCurrentTimeToURL(embed_url) + "' style='border:none;'></iframe>";
|
||||
}
|
||||
};
|
||||
|
||||
var player = videojs('player', options);
|
||||
const storage = (() => {
|
||||
try { if (localStorage.length !== -1) return localStorage; }
|
||||
catch (e) { console.info('No storage available: ' + e); }
|
||||
|
||||
return undefined;
|
||||
})();
|
||||
|
||||
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>';
|
||||
player.overlay({
|
||||
overlays: [{
|
||||
start: 'loadstart',
|
||||
content: '<h1><a rel="noopener" target="_blank" href="' + location.origin + '/watch?v=' + video_data.id + '">' + player_data.title + '</a></h1>',
|
||||
end: 'playing',
|
||||
align: 'top'
|
||||
}, {
|
||||
start: 'pause',
|
||||
content: '<h1><a rel="noopener" target="_blank" href="' + location.origin + '/watch?v=' + video_data.id + '">' + player_data.title + '</a></h1>',
|
||||
end: 'playing',
|
||||
align: 'top'
|
||||
}]
|
||||
overlays: [
|
||||
{ start: 'loadstart', content: overlay_content, end: 'playing', align: 'top'},
|
||||
{ start: 'pause', content: overlay_content, end: 'playing', align: 'top'}
|
||||
]
|
||||
});
|
||||
}
|
||||
|
||||
// Detect mobile users and initialize mobileUi for better UX
|
||||
// Detection code taken from https://stackoverflow.com/a/20293441
|
||||
|
||||
function isMobile() {
|
||||
try{ document.createEvent("TouchEvent"); return true; }
|
||||
catch(e){ return false; }
|
||||
}
|
||||
|
||||
if (isMobile()) {
|
||||
player.mobileUi();
|
||||
|
||||
buttons = ["playToggle", "volumePanel", "captionsButton"];
|
||||
|
||||
if (video_data.params.quality !== 'dash') buttons.push("qualitySelector")
|
||||
|
||||
// Create new control bar object for operation buttons
|
||||
const ControlBar = videojs.getComponent("controlBar");
|
||||
let operations_bar = new ControlBar(player, {
|
||||
children: [],
|
||||
playbackRates: [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0]
|
||||
});
|
||||
buttons.slice(1).forEach(child => operations_bar.addChild(child))
|
||||
|
||||
// Remove operation buttons from primary control bar
|
||||
primary_control_bar = player.getChild("controlBar");
|
||||
buttons.forEach(child => primary_control_bar.removeChild(child));
|
||||
|
||||
operations_bar_element = operations_bar.el();
|
||||
operations_bar_element.className += " mobile-operations-bar"
|
||||
player.addChild(operations_bar)
|
||||
|
||||
// Playback menu doesn't work when it's initialized outside of the primary control bar
|
||||
playback_element = document.getElementsByClassName("vjs-playback-rate")[0]
|
||||
operations_bar_element.append(playback_element)
|
||||
|
||||
// The share and http source selector element can't be fetched till the players ready.
|
||||
player.one("playing", () => {
|
||||
share_element = document.getElementsByClassName("vjs-share-control")[0]
|
||||
operations_bar_element.append(share_element)
|
||||
|
||||
if (video_data.params.quality === 'dash') {
|
||||
http_source_selector = document.getElementsByClassName("vjs-http-source-selector vjs-menu-button")[0]
|
||||
operations_bar_element.append(http_source_selector)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
player.on('error', function (event) {
|
||||
if (player.error().code === 2 || player.error().code === 4) {
|
||||
setInterval(setTimeout(function (event) {
|
||||
console.log('An error occured in the player, reloading...');
|
||||
setTimeout(function (event) {
|
||||
console.log('An error occurred in the player, reloading...');
|
||||
|
||||
var currentTime = player.currentTime();
|
||||
var playbackRate = player.playbackRate();
|
||||
@@ -67,20 +155,27 @@ player.on('error', function (event) {
|
||||
|
||||
player.load();
|
||||
|
||||
if (currentTime > 0.5) {
|
||||
currentTime -= 0.5;
|
||||
}
|
||||
if (currentTime > 0.5) currentTime -= 0.5;
|
||||
|
||||
player.currentTime(currentTime);
|
||||
player.playbackRate(playbackRate);
|
||||
|
||||
if (!paused) {
|
||||
player.play();
|
||||
}
|
||||
}, 5000), 5000);
|
||||
if (!paused) player.play();
|
||||
}, 5000);
|
||||
}
|
||||
});
|
||||
|
||||
// Enable VR video support
|
||||
if (!video_data.params.listen && video_data.vr && video_data.params.vr_mode) {
|
||||
player.crossOrigin("anonymous")
|
||||
switch (video_data.projection_type) {
|
||||
case "EQUIRECTANGULAR":
|
||||
player.vr({projection: "equirectangular"});
|
||||
default: // Should only be "MESH" but we'll use this as a fallback.
|
||||
player.vr({projection: "EAC"});
|
||||
}
|
||||
}
|
||||
|
||||
// Add markers
|
||||
if (video_data.params.video_start > 0 || video_data.params.video_end > 0) {
|
||||
var markers = [{ time: video_data.params.video_start, text: 'Start' }];
|
||||
@@ -93,13 +188,8 @@ if (video_data.params.video_start > 0 || video_data.params.video_end > 0) {
|
||||
|
||||
player.markers({
|
||||
onMarkerReached: function (marker) {
|
||||
if (marker.text === 'End') {
|
||||
if (player.loop()) {
|
||||
player.markers.prev('Start');
|
||||
} else {
|
||||
player.pause();
|
||||
}
|
||||
}
|
||||
if (marker.text === 'End')
|
||||
player.loop() ? player.markers.prev('Start') : player.pause();
|
||||
},
|
||||
markers: markers
|
||||
});
|
||||
@@ -121,6 +211,28 @@ if (video_data.premiere_timestamp && Math.round(new Date() / 1000) < video_data.
|
||||
player.getChild('bigPlayButton').hide();
|
||||
}
|
||||
|
||||
if (video_data.params.save_player_pos) {
|
||||
const url = new URL(location);
|
||||
const hasTimeParam = url.searchParams.has("t");
|
||||
const remeberedTime = get_video_time();
|
||||
let lastUpdated = 0;
|
||||
|
||||
if(!hasTimeParam) set_seconds_after_start(remeberedTime);
|
||||
|
||||
const updateTime = () => {
|
||||
const raw = player.currentTime();
|
||||
const time = Math.floor(raw);
|
||||
|
||||
if(lastUpdated !== time && raw <= video_data.length_seconds - 15) {
|
||||
save_video_time(time);
|
||||
lastUpdated = time;
|
||||
}
|
||||
};
|
||||
|
||||
player.on("timeupdate", updateTime);
|
||||
}
|
||||
else remove_all_video_times();
|
||||
|
||||
if (video_data.params.autoplay) {
|
||||
var bpb = player.getChild('bigPlayButton');
|
||||
bpb.hide();
|
||||
@@ -143,10 +255,40 @@ if (video_data.params.autoplay) {
|
||||
|
||||
if (!video_data.params.listen && video_data.params.quality === 'dash') {
|
||||
player.httpSourceSelector();
|
||||
|
||||
if (video_data.params.quality_dash != "auto") {
|
||||
player.ready(() => {
|
||||
player.on("loadedmetadata", () => {
|
||||
const qualityLevels = Array.from(player.qualityLevels()).sort((a, b) => a.height - b.height);
|
||||
let targetQualityLevel;
|
||||
switch (video_data.params.quality_dash) {
|
||||
case "best":
|
||||
targetQualityLevel = qualityLevels.length - 1;
|
||||
break;
|
||||
case "worst":
|
||||
targetQualityLevel = 0;
|
||||
break;
|
||||
default:
|
||||
const targetHeight = Number.parseInt(video_data.params.quality_dash, 10);
|
||||
for (let i = 0; i < qualityLevels.length; i++) {
|
||||
if (qualityLevels[i].height <= targetHeight) {
|
||||
targetQualityLevel = i;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (let i = 0; i < qualityLevels.length; i++) {
|
||||
qualityLevels[i].enabled = (i == targetQualityLevel);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
player.vttThumbnails({
|
||||
src: location.origin + '/api/v1/storyboards/' + video_data.id + '?height=90'
|
||||
src: location.origin + '/api/v1/storyboards/' + video_data.id + '?height=90',
|
||||
showTimestamp: true
|
||||
});
|
||||
|
||||
// Enable annotations
|
||||
@@ -222,19 +364,75 @@ function skip_seconds(delta) {
|
||||
player.currentTime(newTime);
|
||||
}
|
||||
|
||||
function set_seconds_after_start(delta) {
|
||||
const start = video_data.params.video_start;
|
||||
player.currentTime(start + delta);
|
||||
}
|
||||
|
||||
function save_video_time(seconds) {
|
||||
const videoId = video_data.id;
|
||||
const all_video_times = get_all_video_times();
|
||||
|
||||
all_video_times[videoId] = seconds;
|
||||
|
||||
set_all_video_times(all_video_times);
|
||||
}
|
||||
|
||||
function get_video_time() {
|
||||
try {
|
||||
const videoId = video_data.id;
|
||||
const all_video_times = get_all_video_times();
|
||||
const timestamp = all_video_times[videoId];
|
||||
|
||||
return timestamp || 0;
|
||||
}
|
||||
catch {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
function set_all_video_times(times) {
|
||||
if (storage) {
|
||||
if (times) {
|
||||
try {
|
||||
storage.setItem(save_player_pos_key, JSON.stringify(times));
|
||||
} catch (e) {
|
||||
console.debug('set_all_video_times: ' + e);
|
||||
}
|
||||
} else {
|
||||
storage.removeItem(save_player_pos_key);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function get_all_video_times() {
|
||||
if (storage) {
|
||||
const raw = storage.getItem(save_player_pos_key);
|
||||
if (raw !== null) {
|
||||
try {
|
||||
return JSON.parse(raw);
|
||||
} catch (e) {
|
||||
console.debug('get_all_video_times: ' + e);
|
||||
}
|
||||
}
|
||||
}
|
||||
return {};
|
||||
}
|
||||
|
||||
function remove_all_video_times() {
|
||||
set_all_video_times(null);
|
||||
}
|
||||
|
||||
function set_time_percent(percent) {
|
||||
const duration = player.duration();
|
||||
const newTime = duration * (percent / 100);
|
||||
player.currentTime(newTime);
|
||||
}
|
||||
|
||||
function toggle_play() {
|
||||
if (player.paused()) {
|
||||
player.play();
|
||||
} else {
|
||||
player.pause();
|
||||
}
|
||||
}
|
||||
function play() { player.play(); }
|
||||
function pause() { player.pause(); }
|
||||
function stop() { player.pause(); player.currentTime(0); }
|
||||
function toggle_play() { player.paused() ? play() : pause(); }
|
||||
|
||||
const toggle_captions = (function () {
|
||||
let toggledTrack = null;
|
||||
@@ -272,9 +470,7 @@ const toggle_captions = (function () {
|
||||
const tracks = player.textTracks();
|
||||
for (let i = 0; i < tracks.length; i++) {
|
||||
const track = tracks[i];
|
||||
if (track.kind !== 'captions') {
|
||||
continue;
|
||||
}
|
||||
if (track.kind !== 'captions') continue;
|
||||
|
||||
if (fallbackCaptionsTrack === null) {
|
||||
fallbackCaptionsTrack = track;
|
||||
@@ -295,11 +491,7 @@ const toggle_captions = (function () {
|
||||
})();
|
||||
|
||||
function toggle_fullscreen() {
|
||||
if (player.isFullscreen()) {
|
||||
player.exitFullscreen();
|
||||
} else {
|
||||
player.requestFullscreen();
|
||||
}
|
||||
player.isFullscreen() ? player.exitFullscreen() : player.requestFullscreen();
|
||||
}
|
||||
|
||||
function increase_playback_rate(steps) {
|
||||
@@ -338,18 +530,19 @@ window.addEventListener('keydown', e => {
|
||||
switch (decoratedKey) {
|
||||
case ' ':
|
||||
case 'k':
|
||||
case 'MediaPlayPause':
|
||||
action = toggle_play;
|
||||
break;
|
||||
|
||||
case 'MediaPlay': action = play; break;
|
||||
case 'MediaPause': action = pause; break;
|
||||
case 'MediaStop': action = stop; break;
|
||||
|
||||
case 'ArrowUp':
|
||||
if (isPlayerFocused) {
|
||||
action = increase_volume.bind(this, 0.1);
|
||||
}
|
||||
if (isPlayerFocused) action = increase_volume.bind(this, 0.1);
|
||||
break;
|
||||
case 'ArrowDown':
|
||||
if (isPlayerFocused) {
|
||||
action = increase_volume.bind(this, -0.1);
|
||||
}
|
||||
if (isPlayerFocused) action = increase_volume.bind(this, -0.1);
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
@@ -357,16 +550,18 @@ window.addEventListener('keydown', e => {
|
||||
break;
|
||||
|
||||
case 'ArrowRight':
|
||||
action = skip_seconds.bind(this, 5);
|
||||
case 'MediaFastForward':
|
||||
action = skip_seconds.bind(this, 5 * player.playbackRate());
|
||||
break;
|
||||
case 'ArrowLeft':
|
||||
action = skip_seconds.bind(this, -5);
|
||||
case 'MediaTrackPrevious':
|
||||
action = skip_seconds.bind(this, -5 * player.playbackRate());
|
||||
break;
|
||||
case 'l':
|
||||
action = skip_seconds.bind(this, 10);
|
||||
action = skip_seconds.bind(this, 10 * player.playbackRate());
|
||||
break;
|
||||
case 'j':
|
||||
action = skip_seconds.bind(this, -10);
|
||||
action = skip_seconds.bind(this, -10 * player.playbackRate());
|
||||
break;
|
||||
|
||||
case '0':
|
||||
@@ -379,21 +574,22 @@ window.addEventListener('keydown', e => {
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
// Ignore numpad numbers
|
||||
if (code > 57) break;
|
||||
|
||||
const percent = (code - 48) * 10;
|
||||
action = set_time_percent.bind(this, percent);
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
action = toggle_captions;
|
||||
break;
|
||||
case 'f':
|
||||
action = toggle_fullscreen;
|
||||
break;
|
||||
case 'c': action = toggle_captions; break;
|
||||
case 'f': action = toggle_fullscreen; break;
|
||||
|
||||
case 'N':
|
||||
case 'MediaTrackNext':
|
||||
action = next_video;
|
||||
break;
|
||||
case 'P':
|
||||
case 'MediaTrackPrevious':
|
||||
// TODO: Add support to play back previous video.
|
||||
break;
|
||||
|
||||
@@ -404,12 +600,8 @@ window.addEventListener('keydown', e => {
|
||||
// TODO: Add support for previous-frame-stepping.
|
||||
break;
|
||||
|
||||
case '>':
|
||||
action = increase_playback_rate.bind(this, 1);
|
||||
break;
|
||||
case '<':
|
||||
action = increase_playback_rate.bind(this, -1);
|
||||
break;
|
||||
case '>': action = increase_playback_rate.bind(this, 1); break;
|
||||
case '<': action = increase_playback_rate.bind(this, -1); break;
|
||||
|
||||
default:
|
||||
console.info('Unhandled key down event: %s:', decoratedKey, e);
|
||||
@@ -468,4 +660,41 @@ window.addEventListener('keydown', e => {
|
||||
}());
|
||||
|
||||
// Since videojs-share can sometimes be blocked, we defer it until last
|
||||
player.share(shareOptions);
|
||||
if (player.share) {
|
||||
player.share(shareOptions);
|
||||
}
|
||||
|
||||
// show the preferred caption by default
|
||||
if (player_data.preferred_caption_found) {
|
||||
player.ready(() => {
|
||||
player.textTracks()[1].mode = 'showing';
|
||||
});
|
||||
}
|
||||
|
||||
// Safari audio double duration fix
|
||||
if (navigator.vendor == "Apple Computer, Inc." && video_data.params.listen) {
|
||||
player.on('loadedmetadata', function () {
|
||||
player.on('timeupdate', function () {
|
||||
if (player.remainingTime() < player.duration() / 2) {
|
||||
player.currentTime(player.duration() + 1);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// Watch on Invidious link
|
||||
if (window.location.pathname.startsWith("/embed/")) {
|
||||
const Button = videojs.getComponent('Button');
|
||||
let watch_on_invidious_button = new Button(player);
|
||||
|
||||
// Create hyperlink for current instance
|
||||
redirect_element = document.createElement("a");
|
||||
redirect_element.setAttribute("href", `http://${window.location.host}/watch?v=${window.location.pathname.replace("/embed/","")}`)
|
||||
redirect_element.appendChild(document.createTextNode("Invidious"))
|
||||
|
||||
watch_on_invidious_button.el().appendChild(redirect_element)
|
||||
watch_on_invidious_button.addClass("watch-on-invidious")
|
||||
|
||||
cb = player.getChild('ControlBar')
|
||||
cb.addChild(watch_on_invidious_button)
|
||||
};
|
||||
|
||||
@@ -1,3 +1,29 @@
|
||||
var playlist_data = JSON.parse(document.getElementById('playlist_data').innerHTML);
|
||||
|
||||
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' +
|
||||
'&video_id=' + target.getAttribute('data-id') +
|
||||
'&playlist_id=' + option.getAttribute('data-plid');
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.responseType = 'json';
|
||||
xhr.timeout = 10000;
|
||||
xhr.open('POST', url, true);
|
||||
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
|
||||
|
||||
xhr.onreadystatechange = function () {
|
||||
if (xhr.readyState == 4) {
|
||||
if (xhr.status == 200) {
|
||||
option.innerText = '✓' + option.innerText;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
xhr.send('csrf_token=' + playlist_data.csrf_token);
|
||||
}
|
||||
|
||||
function add_playlist_item(target) {
|
||||
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||
tile.style.display = 'none';
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,3 +1,5 @@
|
||||
var subscribe_data = JSON.parse(document.getElementById('subscribe_data').innerHTML);
|
||||
|
||||
var subscribe_button = document.getElementById('subscribe');
|
||||
subscribe_button.parentNode['action'] = 'javascript:void(0)';
|
||||
|
||||
|
||||
@@ -2,7 +2,7 @@ var toggle_theme = document.getElementById('toggle_theme');
|
||||
toggle_theme.href = 'javascript:void(0);';
|
||||
|
||||
toggle_theme.addEventListener('click', function () {
|
||||
var dark_mode = document.getElementById('dark_theme').media === 'none';
|
||||
var dark_mode = document.body.classList.contains("light-theme");
|
||||
|
||||
var url = '/toggle_theme?redirect=false';
|
||||
var xhr = new XMLHttpRequest();
|
||||
@@ -11,7 +11,9 @@ toggle_theme.addEventListener('click', function () {
|
||||
xhr.open('GET', url, true);
|
||||
|
||||
set_mode(dark_mode);
|
||||
window.localStorage.setItem('dark_mode', dark_mode ? 'dark' : 'light');
|
||||
try {
|
||||
window.localStorage.setItem('dark_mode', dark_mode ? 'dark' : 'light');
|
||||
} catch {}
|
||||
|
||||
xhr.send();
|
||||
});
|
||||
@@ -22,20 +24,51 @@ window.addEventListener('storage', function (e) {
|
||||
}
|
||||
});
|
||||
|
||||
window.addEventListener('load', function () {
|
||||
window.localStorage.setItem('dark_mode', document.getElementById('dark_mode_pref').textContent);
|
||||
// Update localStorage if dark mode preference changed on preferences page
|
||||
update_mode(window.localStorage.dark_mode);
|
||||
window.addEventListener('DOMContentLoaded', function () {
|
||||
const dark_mode = document.getElementById('dark_mode_pref').textContent;
|
||||
try {
|
||||
// Update localStorage if dark mode preference changed on preferences page
|
||||
window.localStorage.setItem('dark_mode', dark_mode);
|
||||
} catch {}
|
||||
update_mode(dark_mode);
|
||||
});
|
||||
|
||||
function set_mode (bool) {
|
||||
document.getElementById('dark_theme').media = !bool ? 'none' : '';
|
||||
document.getElementById('light_theme').media = bool ? 'none' : '';
|
||||
|
||||
var darkScheme = window.matchMedia('(prefers-color-scheme: dark)');
|
||||
var lightScheme = window.matchMedia('(prefers-color-scheme: light)');
|
||||
|
||||
darkScheme.addListener(scheme_switch);
|
||||
lightScheme.addListener(scheme_switch);
|
||||
|
||||
function scheme_switch (e) {
|
||||
// ignore this method if we have a preference set
|
||||
try {
|
||||
if (localStorage.getItem('dark_mode')) {
|
||||
return;
|
||||
}
|
||||
} catch {}
|
||||
if (e.matches) {
|
||||
if (e.media.includes("dark")) {
|
||||
set_mode(true);
|
||||
} else if (e.media.includes("light")) {
|
||||
set_mode(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function set_mode (bool) {
|
||||
if (bool) {
|
||||
// dark
|
||||
toggle_theme.children[0].setAttribute('class', 'icon ion-ios-sunny');
|
||||
document.body.classList.remove('no-theme');
|
||||
document.body.classList.remove('light-theme');
|
||||
document.body.classList.add('dark-theme');
|
||||
} else {
|
||||
// light
|
||||
toggle_theme.children[0].setAttribute('class', 'icon ion-ios-moon');
|
||||
document.body.classList.remove('no-theme');
|
||||
document.body.classList.remove('dark-theme');
|
||||
document.body.classList.add('light-theme');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -44,7 +77,7 @@ function update_mode (mode) {
|
||||
// If preference for dark mode indicated
|
||||
set_mode(true);
|
||||
}
|
||||
else if (mode === 'false' /* for backwards compaibility */ || mode === 'light') {
|
||||
else if (mode === 'false' /* for backwards compatibility */ || mode === 'light') {
|
||||
// If preference for light mode indicated
|
||||
set_mode(false);
|
||||
}
|
||||
|
||||
20
assets/js/video.min.js
vendored
20
assets/js/video.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,2 +0,0 @@
|
||||
/*! @name videojs-contrib-quality-levels @version 2.0.9 @license Apache-2.0 */
|
||||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("video.js"),require("global/document")):"function"==typeof define&&define.amd?define(["video.js","global/document"],t):e.videojsContribQualityLevels=t(e.videojs,e.document)}(this,function(e,t){"use strict";function n(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}e=e&&e.hasOwnProperty("default")?e.default:e,t=t&&t.hasOwnProperty("default")?t.default:t;var r=function(r){var i,l;function o(){var i,l=n(n(i=r.call(this)||this));if(e.browser.IS_IE8)for(var s in l=t.createElement("custom"),o.prototype)"constructor"!==s&&(l[s]=o.prototype[s]);return l.levels_=[],l.selectedIndex_=-1,Object.defineProperty(l,"selectedIndex",{get:function(){return l.selectedIndex_}}),Object.defineProperty(l,"length",{get:function(){return l.levels_.length}}),l||n(i)}l=r,(i=o).prototype=Object.create(l.prototype),i.prototype.constructor=i,i.__proto__=l;var s=o.prototype;return s.addQualityLevel=function(n){var r=this.getQualityLevelById(n.id);if(r)return r;var i=this.levels_.length;return r=new function n(r){var i=this;if(e.browser.IS_IE8)for(var l in i=t.createElement("custom"),n.prototype)"constructor"!==l&&(i[l]=n.prototype[l]);return i.id=r.id,i.label=i.id,i.width=r.width,i.height=r.height,i.bitrate=r.bandwidth,i.enabled_=r.enabled,Object.defineProperty(i,"enabled",{get:function(){return i.enabled_()},set:function(e){i.enabled_(e)}}),i}(n),""+i in this||Object.defineProperty(this,i,{get:function(){return this.levels_[i]}}),this.levels_.push(r),this.trigger({qualityLevel:r,type:"addqualitylevel"}),r},s.removeQualityLevel=function(e){for(var t=null,n=0,r=this.length;n<r;n++)if(this[n]===e){t=this.levels_.splice(n,1)[0],this.selectedIndex_===n?this.selectedIndex_=-1:this.selectedIndex_>n&&this.selectedIndex_--;break}return t&&this.trigger({qualityLevel:e,type:"removequalitylevel"}),t},s.getQualityLevelById=function(e){for(var t=0,n=this.length;t<n;t++){var r=this[t];if(r.id===e)return r}return null},s.dispose=function(){this.selectedIndex_=-1,this.levels_.length=0},o}(e.EventTarget);for(var i in r.prototype.allowedEvents_={change:"change",addqualitylevel:"addqualitylevel",removequalitylevel:"removequalitylevel"},r.prototype.allowedEvents_)r.prototype["on"+i]=null;var l=function(t){return n=this,e.mergeOptions({},t),i=n.qualityLevels,l=new r,n.on("dispose",function e(){l.dispose(),n.qualityLevels=i,n.off("dispose",e)}),n.qualityLevels=function(){return l},n.qualityLevels.VERSION="2.0.9",l;var n,i,l};return(e.registerPlugin||e.plugin)("qualityLevels",l),l.VERSION="2.0.9",l});
|
||||
@@ -1,7 +0,0 @@
|
||||
/**
|
||||
* videojs-http-source-selector
|
||||
* @version 1.1.6
|
||||
* @copyright 2019 Justin Fujita <Justin@pivotshare.com>
|
||||
* @license MIT
|
||||
*/
|
||||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("video.js")):"function"==typeof define&&define.amd?define(["video.js"],t):(e=e||self)["videojs-http-source-selector"]=t(e.videojs)}(this,function(r){"use strict";function o(e,t){e.prototype=Object.create(t.prototype),(e.prototype.constructor=e).__proto__=t}function s(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}var e=(r=r&&r.hasOwnProperty("default")?r.default:r).getComponent("MenuItem"),t=r.getComponent("Component"),a=function(n){function e(e,t){return t.selectable=!0,t.multiSelectable=!1,n.call(this,e,t)||this}o(e,n);var t=e.prototype;return t.handleClick=function(){var e=this.options_;console.log("Changing quality to:",e.label),n.prototype.handleClick.call(this);for(var t=this.player().qualityLevels(),o=0;o<t.length;o++)e.index==t.length?t[o].enabled=!0:e.index==o?t[o].enabled=!0:t[o].enabled=!1},t.update=function(){var e=this.player().qualityLevels().selectedIndex;this.selected(this.options_.index==e)},e}(e);t.registerComponent("SourceMenuItem",a);var u=r.getComponent("MenuButton"),n=function(i){function e(e,t){var o;o=i.call(this,e,t)||this,u.apply(s(o),arguments);var n=o.player().qualityLevels();if(t&&t.default)if("low"==t.default)for(var l=0;l<n.length;l++)n[l].enabled=0==l;else if(t.default="high")for(l=0;l<n.length;l++)n[l].enabled=l==n.length-1;return o.player().qualityLevels().on(["change","addqualitylevel"],r.bind(s(o),o.update)),o}o(e,i);var t=e.prototype;return t.createEl=function(){return r.dom.createEl("div",{className:"vjs-http-source-selector vjs-menu-button vjs-menu-button-popup vjs-control vjs-button"})},t.buildCSSClass=function(){return u.prototype.buildCSSClass.call(this)+" vjs-icon-cog"},t.update=function(){return u.prototype.update.call(this)},t.createItems=function(){for(var e=[],t=this.player().qualityLevels(),o=[],n=0;n<t.length;n++){var l=t.length-(n+1),i=l===t.selectedIndex,r=""+l,s=l;t[l].height?(r=t[l].height+"p",s=parseInt(t[l].height,10)):t[l].bitrate&&(r=Math.floor(t[l].bitrate/1e3)+" kbps",s=parseInt(t[l].bitrate,10)),0<=o.indexOf(r)||(o.push(r),e.push(new a(this.player_,{label:r,index:l,selected:i,sortVal:s})))}return 1<t.length&&e.push(new a(this.player_,{label:"Auto",index:t.length,selected:!1,sortVal:99999})),e.sort(function(e,t){return e.options_.sortVal<t.options_.sortVal?1:e.options_.sortVal>t.options_.sortVal?-1:0}),e},e}(u),l={},i=r.registerPlugin||r.plugin,c=function(e){var t=this;this.ready(function(){!function(n,e){if(n.addClass("vjs-http-source-selector"),console.log("videojs-http-source-selector initialized!"),console.log("player.techName_:"+n.techName_),"Html5"!=n.techName_)return;n.on(["loadedmetadata"],function(e){if(n.qualityLevels(),r.log("loadmetadata event"),"undefined"==n.videojs_http_source_selector_initialized||1==n.videojs_http_source_selector_initialized)console.log("player.videojs_http_source_selector_initialized == true");else{console.log("player.videojs_http_source_selector_initialized == false"),n.videojs_http_source_selector_initialized=!0;var t=n.controlBar,o=t.getChild("fullscreenToggle").el();t.el().insertBefore(t.addChild("SourceMenuButton").el(),o)}})}(t,r.mergeOptions(l,e))}),r.registerComponent("SourceMenuButton",n),r.registerComponent("SourceMenuItem",a)};return i("httpSourceSelector",c),c.VERSION="1.1.6",c});
|
||||
4
assets/js/videojs-markers.min.js
vendored
4
assets/js/videojs-markers.min.js
vendored
File diff suppressed because one or more lines are too long
2
assets/js/videojs-overlay.min.js
vendored
2
assets/js/videojs-overlay.min.js
vendored
@@ -1,2 +0,0 @@
|
||||
/*! @name videojs-overlay @version 2.1.4 @license Apache-2.0 */
|
||||
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("video.js"),require("global/window")):"function"==typeof define&&define.amd?define(["video.js","global/window"],e):t.videojsOverlay=e(t.videojs,t.window)}(this,function(t,e){"use strict";function n(t){if(void 0===t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return t}t=t&&t.hasOwnProperty("default")?t.default:t,e=e&&e.hasOwnProperty("default")?e.default:e;var r={align:"top-left",class:"",content:"This overlay will show up while the video is playing",debug:!1,showBackground:!0,attachToControlBar:!1,overlays:[{start:"playing",end:"paused"}]},i=t.getComponent("Component"),o=t.dom||t,s=t.registerPlugin||t.plugin,a=function(t){return"number"==typeof t&&t==t},h=function(t){return"string"==typeof t&&/^\S+$/.test(t)},d=function(r){var i,s;function d(t,e){var i;return i=r.call(this,t,e)||this,["start","end"].forEach(function(t){var e=i.options_[t];if(a(e))i[t+"Event_"]="timeupdate";else if(h(e))i[t+"Event_"]=e;else if("start"===t)throw new Error('invalid "start" option; expected number or string')}),["endListener_","rewindListener_","startListener_"].forEach(function(t){i[t]=function(e){return d.prototype[t].call(n(n(i)),e)}}),"timeupdate"===i.startEvent_&&i.on(t,"timeupdate",i.rewindListener_),i.debug('created, listening to "'+i.startEvent_+'" for "start" and "'+(i.endEvent_||"nothing")+'" for "end"'),i.hide(),i}s=r,(i=d).prototype=Object.create(s.prototype),i.prototype.constructor=i,i.__proto__=s;var l=d.prototype;return l.createEl=function(){var t=this.options_,n=t.content,r=t.showBackground?"vjs-overlay-background":"vjs-overlay-no-background",i=o.createEl("div",{className:"\n vjs-overlay\n vjs-overlay-"+t.align+"\n "+t.class+"\n "+r+"\n vjs-hidden\n "});return"string"==typeof n?i.innerHTML=n:n instanceof e.DocumentFragment?i.appendChild(n):o.appendContent(i,n),i},l.debug=function(){if(this.options_.debug){for(var e=t.log,n=e,r=arguments.length,i=new Array(r),o=0;o<r;o++)i[o]=arguments[o];e.hasOwnProperty(i[0])&&"function"==typeof e[i[0]]&&(n=e[i.shift()]),n.apply(void 0,["overlay#"+this.id()+": "].concat(i))}},l.hide=function(){return r.prototype.hide.call(this),this.debug("hidden"),this.debug('bound `startListener_` to "'+this.startEvent_+'"'),this.endEvent_&&(this.debug('unbound `endListener_` from "'+this.endEvent_+'"'),this.off(this.player(),this.endEvent_,this.endListener_)),this.on(this.player(),this.startEvent_,this.startListener_),this},l.shouldHide_=function(t,e){var n=this.options_.end;return a(n)?t>=n:n===e},l.show=function(){return r.prototype.show.call(this),this.off(this.player(),this.startEvent_,this.startListener_),this.debug("shown"),this.debug('unbound `startListener_` from "'+this.startEvent_+'"'),this.endEvent_&&(this.debug('bound `endListener_` to "'+this.endEvent_+'"'),this.on(this.player(),this.endEvent_,this.endListener_)),this},l.shouldShow_=function(t,e){var n=this.options_.start,r=this.options_.end;return a(n)?a(r)?t>=n&&t<r:this.hasShownSinceSeek_?Math.floor(t)===n:(this.hasShownSinceSeek_=!0,t>=n):n===e},l.startListener_=function(t){var e=this.player().currentTime();this.shouldShow_(e,t.type)&&this.show()},l.endListener_=function(t){var e=this.player().currentTime();this.shouldHide_(e,t.type)&&this.hide()},l.rewindListener_=function(t){var e=this.player().currentTime(),n=this.previousTime_,r=this.options_.start,i=this.options_.end;e<n&&(this.debug("rewind detected"),a(i)&&!this.shouldShow_(e)?(this.debug("hiding; "+i+" is an integer and overlay should not show at this time"),this.hasShownSinceSeek_=!1,this.hide()):h(i)&&e<r&&(this.debug("hiding; show point ("+r+") is before now ("+e+") and end point ("+i+") is an event"),this.hasShownSinceSeek_=!1,this.hide())),this.previousTime_=e},d}(i);t.registerComponent("Overlay",d);var l=function(e){var n=this,i=t.mergeOptions(r,e);Array.isArray(this.overlays_)&&this.overlays_.forEach(function(t){n.removeChild(t),n.controlBar&&n.controlBar.removeChild(t),t.dispose()});var o=i.overlays;delete i.overlays,this.overlays_=o.map(function(e){var r=t.mergeOptions(i,e),o="string"==typeof r.attachToControlBar||!0===r.attachToControlBar;if(!n.controls()||!n.controlBar)return n.addChild("overlay",r);if(o&&-1!==r.align.indexOf("bottom")){var s=n.controlBar.children()[0];if(void 0!==n.controlBar.getChild(r.attachToControlBar)&&(s=n.controlBar.getChild(r.attachToControlBar)),s){var a=n.controlBar.addChild("overlay",r);return n.controlBar.el().insertBefore(a.el(),s.el()),a}}var h=n.addChild("overlay",r);return n.el().insertBefore(h.el(),n.controlBar.el()),h})};return l.VERSION="2.1.4",s("overlay",l),l});
|
||||
7
assets/js/videojs-share.min.js
vendored
7
assets/js/videojs-share.min.js
vendored
File diff suppressed because one or more lines are too long
7
assets/js/videojs-vtt-thumbnails.min.js
vendored
7
assets/js/videojs-vtt-thumbnails.min.js
vendored
File diff suppressed because one or more lines are too long
@@ -1,3 +1,5 @@
|
||||
var video_data = JSON.parse(document.getElementById('video_data').innerHTML);
|
||||
|
||||
String.prototype.supplant = function (o) {
|
||||
return this.replace(/{([^{}]*)}/g, function (a, b) {
|
||||
var r = o[b];
|
||||
@@ -147,11 +149,18 @@ function get_playlist(plid, retries) {
|
||||
if (xhr.readyState == 4) {
|
||||
if (xhr.status == 200) {
|
||||
playlist.innerHTML = xhr.response.playlistHtml;
|
||||
var nextVideo = document.getElementById(xhr.response.nextVideo);
|
||||
nextVideo.parentNode.parentNode.scrollTop = nextVideo.offsetTop;
|
||||
|
||||
if (xhr.response.nextVideo) {
|
||||
player.on('ended', function () {
|
||||
var url = new URL('https://example.com/watch?v=' + xhr.response.nextVideo);
|
||||
|
||||
url.searchParams.set('list', plid);
|
||||
if (!plid.startsWith('RD')) {
|
||||
url.searchParams.set('index', xhr.response.index);
|
||||
}
|
||||
|
||||
if (video_data.params.autoplay || video_data.params.continue_autoplay) {
|
||||
url.searchParams.set('autoplay', '1');
|
||||
}
|
||||
@@ -168,10 +177,6 @@ function get_playlist(plid, retries) {
|
||||
url.searchParams.set('local', video_data.params.local);
|
||||
}
|
||||
|
||||
url.searchParams.set('list', plid);
|
||||
if (!plid.startsWith('RD')) {
|
||||
url.searchParams.set('index', xhr.response.index);
|
||||
}
|
||||
location.assign(url.pathname + url.search);
|
||||
});
|
||||
}
|
||||
@@ -269,7 +274,7 @@ function get_reddit_comments(retries) {
|
||||
|
||||
xhr.onerror = function () {
|
||||
console.log('Pulling comments failed... ' + retries + '/5');
|
||||
setInterval(function () { get_reddit_comments(retries - 1) }, 1000);
|
||||
setTimeout(function () { get_reddit_comments(retries - 1) }, 1000);
|
||||
}
|
||||
|
||||
xhr.ontimeout = function () {
|
||||
@@ -343,7 +348,7 @@ function get_youtube_comments(retries) {
|
||||
comments.innerHTML =
|
||||
'<h3 style="text-align:center"><div class="loading"><i class="icon ion-ios-refresh"></i></div></h3>';
|
||||
console.log('Pulling comments failed... ' + retries + '/5');
|
||||
setInterval(function () { get_youtube_comments(retries - 1) }, 1000);
|
||||
setTimeout(function () { get_youtube_comments(retries - 1) }, 1000);
|
||||
}
|
||||
|
||||
xhr.ontimeout = function () {
|
||||
@@ -356,7 +361,7 @@ function get_youtube_comments(retries) {
|
||||
xhr.send();
|
||||
}
|
||||
|
||||
function get_youtube_replies(target, load_more) {
|
||||
function get_youtube_replies(target, load_more, load_replies) {
|
||||
var continuation = target.getAttribute('data-continuation');
|
||||
|
||||
var body = target.parentNode.parentNode;
|
||||
@@ -368,7 +373,10 @@ function get_youtube_replies(target, load_more) {
|
||||
'?format=html' +
|
||||
'&hl=' + video_data.preferences.locale +
|
||||
'&thin_mode=' + video_data.preferences.thin_mode +
|
||||
'&continuation=' + continuation;
|
||||
'&continuation=' + continuation
|
||||
if (load_replies) {
|
||||
url += '&action=action_get_comment_replies';
|
||||
}
|
||||
var xhr = new XMLHttpRequest();
|
||||
xhr.responseType = 'json';
|
||||
xhr.timeout = 10000;
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
var watched_data = JSON.parse(document.getElementById('watched_data').innerHTML);
|
||||
|
||||
function mark_watched(target) {
|
||||
var tile = target.parentNode.parentNode.parentNode.parentNode.parentNode;
|
||||
tile.style.display = 'none';
|
||||
|
||||
@@ -1,3 +1,2 @@
|
||||
User-agent: *
|
||||
Disallow: /search
|
||||
Disallow: /login
|
||||
Disallow: /
|
||||
|
||||
4
assets/videojs/.gitignore
vendored
Normal file
4
assets/videojs/.gitignore
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
# Ignore everything in this directory
|
||||
*
|
||||
# Except this file
|
||||
!.gitignore
|
||||
868
config/config.example.yml
Normal file
868
config/config.example.yml
Normal file
@@ -0,0 +1,868 @@
|
||||
#########################################
|
||||
#
|
||||
# Database configuration
|
||||
#
|
||||
#########################################
|
||||
|
||||
##
|
||||
## Database configuration with separate parameters.
|
||||
## This setting is MANDATORY, unless 'database_url' is used.
|
||||
##
|
||||
db:
|
||||
user: kemal
|
||||
password: kemal
|
||||
host: localhost
|
||||
port: 5432
|
||||
dbname: invidious
|
||||
|
||||
##
|
||||
## Database configuration using a single URI. This is an
|
||||
## alternative to the 'db' parameter above. If both forms
|
||||
## are used, then only database_url is used.
|
||||
## This setting is MANDATORY, unless 'db' is used.
|
||||
##
|
||||
## Note: The 'database_url' setting allows the use of UNIX
|
||||
## sockets. To do so, remove the IP address (or FQDN) and port
|
||||
## and append the 'host' parameter. E.g:
|
||||
## postgres://kemal:kemal@/invidious?host=/var/run/postgresql
|
||||
##
|
||||
## Accepted values: a postgres:// URI
|
||||
## Default: postgres://kemal:kemal@localhost:5432/invidious
|
||||
##
|
||||
#database_url: postgres://kemal:kemal@localhost:5432/invidious
|
||||
|
||||
##
|
||||
## Enable automatic table integrity check. This will create
|
||||
## the required tables and columns if anything is missing.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#check_tables: false
|
||||
|
||||
|
||||
|
||||
#########################################
|
||||
#
|
||||
# Server config
|
||||
#
|
||||
#########################################
|
||||
|
||||
# -----------------------------
|
||||
# Network (inbound)
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## Port to listen on for incoming connections.
|
||||
##
|
||||
## Note: Ports lower than 1024 requires either root privileges
|
||||
## (not recommended) or the "CAP_NET_BIND_SERVICE" capability
|
||||
## (See https://stackoverflow.com/a/414258 and `man capabilities`)
|
||||
##
|
||||
## Accepted values: 1-65535
|
||||
## Default: 3000
|
||||
##
|
||||
#port: 3000
|
||||
|
||||
##
|
||||
## When the invidious instance is behind a proxy, and the proxy
|
||||
## listens on a different port than the instance does, this lets
|
||||
## invidious know about it. This is used to craft absolute URLs
|
||||
## to the instance (e.g in the API).
|
||||
##
|
||||
## Note: This setting is MANDATORY if invidious is behind a
|
||||
## reverse proxy.
|
||||
##
|
||||
## Accepted values: 1-65535
|
||||
## Default: <none>
|
||||
##
|
||||
#external_port:
|
||||
|
||||
##
|
||||
## Interface address to listen on for incoming connections.
|
||||
##
|
||||
## Accepted values: a valid IPv4 or IPv6 address.
|
||||
## default: 0.0.0.0 (listen on all interfaces)
|
||||
##
|
||||
#host_binding: 0.0.0.0
|
||||
|
||||
##
|
||||
## Domain name under which this instance is hosted. This is
|
||||
## used to craft absolute URLs to the instance (e.g in the API).
|
||||
## The domain MUST be defined if your instance is accessed from
|
||||
## a domain name (like 'example.com').
|
||||
##
|
||||
## Accepted values: a fully qualified domain name (FQDN)
|
||||
## Default: <none>
|
||||
##
|
||||
domain:
|
||||
|
||||
##
|
||||
## Tell Invidious that it is behind a proxy that provides only
|
||||
## HTTPS, so all links must use the https:// scheme. This
|
||||
## setting MUST be set to true if invidious is behind a
|
||||
## reverse proxy serving HTTPs.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
https_only: false
|
||||
|
||||
##
|
||||
## Enable/Disable 'Strict-Transport-Security'. Make sure that
|
||||
## the domain specified under 'domain' is served securely.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: true
|
||||
##
|
||||
#hsts: true
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Network (outbound)
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## Disable proxying server-wide. Can be disable as a whole, or
|
||||
## only for a single function.
|
||||
##
|
||||
## Accepted values: true, false, dash, livestreams, downloads, local
|
||||
## Default: false
|
||||
##
|
||||
#disable_proxy: false
|
||||
|
||||
##
|
||||
## Size of the HTTP pool used to connect to youtube. Each
|
||||
## domain ('youtube.com', 'ytimg.com', ...) has its own pool.
|
||||
##
|
||||
## Accepted values: a positive integer
|
||||
## Default: 100
|
||||
##
|
||||
#pool_size: 100
|
||||
|
||||
##
|
||||
## Enable/Disable the use of QUIC (HTTP/3) when connecting
|
||||
## to the youtube API and websites ('youtube.com', 'ytimg.com').
|
||||
## QUIC's main advantages are its lower latency and lower bandwidth
|
||||
## use, compared to its predecessors. However, the current version
|
||||
## of QUIC used in invidious is still based on the IETF draft 31,
|
||||
## meaning that the underlying library may still not be fully
|
||||
## optimized. You can read more about QUIC at the link below:
|
||||
## https://datatracker.ietf.org/doc/html/draft-ietf-quic-transport-31
|
||||
##
|
||||
## Note: you should try both options and see what is the best for your
|
||||
## instance. In general QUIC is recommended for public instances. Your
|
||||
## mileage may vary.
|
||||
##
|
||||
## Note 2: Using QUIC prevents some captcha challenges from appearing.
|
||||
## See: https://github.com/iv-org/invidious/issues/957#issuecomment-576424042
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#use_quic: false
|
||||
|
||||
##
|
||||
## Additional cookies to be sent when requesting the youtube API.
|
||||
##
|
||||
## Accepted values: a string in the format "name1=value1; name2=value2..."
|
||||
## Default: <none>
|
||||
##
|
||||
#cookies:
|
||||
|
||||
##
|
||||
## Force connection to youtube over a specific IP family.
|
||||
##
|
||||
## Note: This may sometimes resolve issues involving rate-limiting.
|
||||
## See https://github.com/ytdl-org/youtube-dl/issues/21729.
|
||||
##
|
||||
## Accepted values: ipv4, ipv6
|
||||
## Default: <none>
|
||||
##
|
||||
#force_resolve:
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Logging
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## Path to log file. Can be absolute or relative to the invidious
|
||||
## binary. This is overridden if "-o OUTPUT" or "--output=OUTPUT"
|
||||
## are passed on the command line.
|
||||
##
|
||||
## Accepted values: a filesystem path or 'STDOUT'
|
||||
## Default: STDOUT
|
||||
##
|
||||
#output: STDOUT
|
||||
|
||||
##
|
||||
## Logging Verbosity. This is overridden if "-l LEVEL" or
|
||||
## "--log-level=LEVEL" are passed on the command line.
|
||||
##
|
||||
## Accepted values: All, Trace, Debug, Info, Warn, Error, Fatal, Off
|
||||
## Default: Info
|
||||
##
|
||||
#log_level: Info
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Features
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## Enable/Disable the "Popular" tab on the main page.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: true
|
||||
##
|
||||
#popular_enabled: true
|
||||
|
||||
##
|
||||
## Enable/Disable statstics (available at /api/v1/stats).
|
||||
## The following data is available:
|
||||
## - Software name ("invidious") and version+branch (same data as
|
||||
## displayed in the footer, e.g: "2021.05.13-75e5b49" / "master")
|
||||
## - The value of the 'registration_enabled' config (true/false)
|
||||
## - Number of currently registered users
|
||||
## - Number of registered users who connected in the last month
|
||||
## - Number of registered users who connected in the last 6 months
|
||||
## - Timestamp of the last server restart
|
||||
## - Timestamp of the last "Channel Refresh" job execution
|
||||
##
|
||||
## Warning: This setting MUST be set to true if you plan to run
|
||||
## a public instance. It is used by api.invidious.io to refresh
|
||||
## your instance's status.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#statistics_enabled: false
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Users and accounts
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## Allow/Forbid Invidious (local) account creation. Invidious
|
||||
## accounts allow users to subscribe to channels and to create
|
||||
## playlists without a Google account.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: true
|
||||
##
|
||||
#registration_enabled: true
|
||||
|
||||
##
|
||||
## Allow/Forbid users to log-in. This setting affects the ability
|
||||
## to connect with BOTH Google and Invidious (local) accounts.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: true
|
||||
##
|
||||
#login_enabled: true
|
||||
|
||||
##
|
||||
## Enable/Disable the captcha challenge on the login page.
|
||||
##
|
||||
## Note: this is a basic captcha challenge that doesn't
|
||||
## depend on any third parties.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: true
|
||||
##
|
||||
#captcha_enabled: true
|
||||
|
||||
##
|
||||
## List of usernames that will be granted administrator rights.
|
||||
## A user with administrator rights will be able to change the
|
||||
## server configuration options listed below in /preferences,
|
||||
## in addition to the usual user preferences.
|
||||
##
|
||||
## Server-wide settings:
|
||||
## - popular_enabled
|
||||
## - captcha_enabled
|
||||
## - login_enabled
|
||||
## - registration_enabled
|
||||
## - statistics_enabled
|
||||
## Default user preferences:
|
||||
## - default_home
|
||||
## - feed_menu
|
||||
##
|
||||
## Accepted values: an array of strings
|
||||
## Default: [""]
|
||||
##
|
||||
#admins: [""]
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Background jobs
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## Number of threads to use when crawling channel videos (during
|
||||
## subscriptions update).
|
||||
##
|
||||
## Notes:
|
||||
## - Setting this to 0 will disable the channel videos crawl job.
|
||||
## - This setting is overridden if "-c THREADS" or
|
||||
## "--channel-threads=THREADS" are passed on the command line.
|
||||
##
|
||||
## Accepted values: a positive integer
|
||||
## Default: 1
|
||||
##
|
||||
channel_threads: 1
|
||||
|
||||
##
|
||||
## Time interval between two executions of the job that crawls
|
||||
## channel videos (subscriptions update).
|
||||
##
|
||||
## Accepted values: a valid time interval (like 1h30m or 90m)
|
||||
## Default: 30m
|
||||
##
|
||||
#channel_refresh_interval: 30m
|
||||
|
||||
##
|
||||
## Forcefully dump and re-download the entire list of uploaded
|
||||
## videos when crawling channel (during subscriptions update).
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
full_refresh: false
|
||||
|
||||
##
|
||||
## Number of threads to use when updating RSS feeds.
|
||||
##
|
||||
## Notes:
|
||||
## - Setting this to 0 will disable the channel videos crawl job.
|
||||
## - This setting is overridden if "-f THREADS" or
|
||||
## "--feed-threads=THREADS" are passed on the command line.
|
||||
##
|
||||
## Accepted values: a positive integer
|
||||
## Default: 1
|
||||
##
|
||||
feed_threads: 1
|
||||
|
||||
##
|
||||
## Enable/Disable the polling job that keeps the decryption
|
||||
## function (for "secured" videos) up to date.
|
||||
##
|
||||
## Note: This part of the code is currently broken, so changing
|
||||
## this setting has no impact.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: true
|
||||
##
|
||||
#decrypt_polling: true
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Captcha API
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## URL of the captcha solving service.
|
||||
##
|
||||
## Accepted values: any URL
|
||||
## Default: https://api.anti-captcha.com
|
||||
##
|
||||
#captcha_api_url: https://api.anti-captcha.com
|
||||
|
||||
##
|
||||
## API key for the captcha solving service.
|
||||
##
|
||||
## Accepted values: a string
|
||||
## Default: <none>
|
||||
##
|
||||
#captcha_key:
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Miscellaneous
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## custom banner displayed at the top of every page. This can
|
||||
## used for instance announcements, e.g.
|
||||
##
|
||||
## Accepted values: any string. HTML is accepted.
|
||||
## Default: <none>
|
||||
##
|
||||
#banner:
|
||||
|
||||
##
|
||||
## Subscribe to channels using PubSubHub (Google PubSubHubbub service).
|
||||
## PubSubHub allows Invidious to be instantly notified when a new video
|
||||
## is published on any subscribed channels. When PubSubHub is not used,
|
||||
## Invidious will check for new videos every minute.
|
||||
##
|
||||
## Note: This setting is recommended for public instances.
|
||||
##
|
||||
## Note 2:
|
||||
## - Requires a public instance (it uses /feed/webhook/v1)
|
||||
## - Requires 'domain' and 'hmac_key' to be set.
|
||||
## - Setting this parameter to any number greater than zero will
|
||||
## enable channel subscriptions via PubSubHub, but will limit the
|
||||
## amount of concurrent subscriptions.
|
||||
##
|
||||
## Accepted values: true, false, a positive integer
|
||||
## Default: false
|
||||
##
|
||||
#use_pubsub_feeds: false
|
||||
|
||||
##
|
||||
## HMAC signing key used for CSRF tokens and pubsub
|
||||
## subscriptions verification.
|
||||
##
|
||||
## Accepted values: a string
|
||||
## Default: <none>
|
||||
##
|
||||
#hmac_key:
|
||||
|
||||
##
|
||||
## List of video IDs where the "download" widget must be
|
||||
## disabled, in order to comply with DMCA requests.
|
||||
##
|
||||
## Accepted values: an array of string
|
||||
## Default: <none>
|
||||
##
|
||||
#dmca_content:
|
||||
|
||||
##
|
||||
## Cache video annotations in the database.
|
||||
##
|
||||
## Warning: empty annotations or annotations that only contain
|
||||
## cards won't be cached.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#cache_annotations: false
|
||||
|
||||
##
|
||||
## Source code URL. If your instance is running a modified source
|
||||
## code, you MUST publish it somewhere and set this option.
|
||||
##
|
||||
## Accepted values: a string
|
||||
## Default: <none>
|
||||
##
|
||||
#modified_source_code_url: ""
|
||||
|
||||
|
||||
|
||||
#########################################
|
||||
#
|
||||
# Default user preferences
|
||||
#
|
||||
#########################################
|
||||
|
||||
##
|
||||
## NOTE: All the settings below define the default user
|
||||
## preferences. They will apply to ALL users connecting
|
||||
## without a preferences cookie (so either on the first
|
||||
## connection to the instance or after clearing the
|
||||
## browser's cookies).
|
||||
##
|
||||
|
||||
default_user_preferences:
|
||||
|
||||
# -----------------------------
|
||||
# Internationalization
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## Default user interface language (locale).
|
||||
##
|
||||
## Note: When hosting a public instance, overriding the
|
||||
## default (english) is not recommended, as it may
|
||||
## people using other languages.
|
||||
##
|
||||
## Accepted values:
|
||||
## ar (Arabic)
|
||||
## da (Danish)
|
||||
## de (German)
|
||||
## en-US (english, US)
|
||||
## el (Greek)
|
||||
## eo (Esperanto)
|
||||
## es (Spanish)
|
||||
## fa (Persian)
|
||||
## fi (Finnish)
|
||||
## fr (French)
|
||||
## he (Hebrew)
|
||||
## hr (Hungarian)
|
||||
## id (Indonesian)
|
||||
## is (Icelandic)
|
||||
## it (Italian)
|
||||
## ja (Japanese)
|
||||
## nb-NO (Norwegian, Bokmål)
|
||||
## nl (Dutch)
|
||||
## pl (Polish)
|
||||
## pt-BR (Portuguese, Brazil)
|
||||
## pt-PT (Portuguese, Portugal)
|
||||
## ro (Romanian)
|
||||
## ru (Russian)
|
||||
## sv (Swedish)
|
||||
## tr (Turkish)
|
||||
## uk (Ukrainian)
|
||||
## zh-CN (Chinese, China) (a.k.a "Simplified Chinese")
|
||||
## zh-TW (Chinese, Taiwan) (a.k.a "Traditional Chinese")
|
||||
##
|
||||
## Default: en-US
|
||||
##
|
||||
#locale: en-US
|
||||
|
||||
##
|
||||
## Default geographical location for content.
|
||||
##
|
||||
## Accepted values:
|
||||
## AE, AR, AT, AU, AZ, BA, BD, BE, BG, BH, BO, BR, BY, CA, CH, CL, CO, CR,
|
||||
## CY, CZ, DE, DK, DO, DZ, EC, EE, EG, ES, FI, FR, GB, GE, GH, GR, GT, HK,
|
||||
## HN, HR, HU, ID, IE, IL, IN, IQ, IS, IT, JM, JO, JP, KE, KR, KW, KZ, LB,
|
||||
## LI, LK, LT, LU, LV, LY, MA, ME, MK, MT, MX, MY, NG, NI, NL, NO, NP, NZ,
|
||||
## OM, PA, PE, PG, PH, PK, PL, PR, PT, PY, QA, RO, RS, RU, SA, SE, SG, SI,
|
||||
## SK, SN, SV, TH, TN, TR, TW, TZ, UA, UG, US, UY, VE, VN, YE, ZA, ZW
|
||||
##
|
||||
## Default: US
|
||||
##
|
||||
#region: US
|
||||
|
||||
##
|
||||
## Top 3 preferred languages for video captions.
|
||||
##
|
||||
## Note: overriding the default (no preferred
|
||||
## caption language) is not recommended, in order
|
||||
## to not penalize people using other languages.
|
||||
##
|
||||
## Accepted values: a three-entries array.
|
||||
## Each entry can be one of:
|
||||
## "English", "English (auto-generated)",
|
||||
## "Afrikaans", "Albanian", "Amharic", "Arabic",
|
||||
## "Armenian", "Azerbaijani", "Bangla", "Basque",
|
||||
## "Belarusian", "Bosnian", "Bulgarian", "Burmese",
|
||||
## "Catalan", "Cebuano", "Chinese (Simplified)",
|
||||
## "Chinese (Traditional)", "Corsican", "Croatian",
|
||||
## "Czech", "Danish", "Dutch", "Esperanto", "Estonian",
|
||||
## "Filipino", "Finnish", "French", "Galician", "Georgian",
|
||||
## "German", "Greek", "Gujarati", "Haitian Creole", "Hausa",
|
||||
## "Hawaiian", "Hebrew", "Hindi", "Hmong", "Hungarian",
|
||||
## "Icelandic", "Igbo", "Indonesian", "Irish", "Italian",
|
||||
## "Japanese", "Javanese", "Kannada", "Kazakh", "Khmer",
|
||||
## "Korean", "Kurdish", "Kyrgyz", "Lao", "Latin", "Latvian",
|
||||
## "Lithuanian", "Luxembourgish", "Macedonian",
|
||||
## "Malagasy", "Malay", "Malayalam", "Maltese", "Maori",
|
||||
## "Marathi", "Mongolian", "Nepali", "Norwegian Bokmål",
|
||||
## "Nyanja", "Pashto", "Persian", "Polish", "Portuguese",
|
||||
## "Punjabi", "Romanian", "Russian", "Samoan",
|
||||
## "Scottish Gaelic", "Serbian", "Shona", "Sindhi",
|
||||
## "Sinhala", "Slovak", "Slovenian", "Somali",
|
||||
## "Southern Sotho", "Spanish", "Spanish (Latin America)",
|
||||
## "Sundanese", "Swahili", "Swedish", "Tajik", "Tamil",
|
||||
## "Telugu", "Thai", "Turkish", "Ukrainian", "Urdu",
|
||||
## "Uzbek", "Vietnamese", "Welsh", "Western Frisian",
|
||||
## "Xhosa", "Yiddish", "Yoruba", "Zulu"
|
||||
##
|
||||
## Default: ["", "", ""]
|
||||
##
|
||||
#captions: ["", "", ""]
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Interface
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## Enable/Disable dark mode.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: <none>
|
||||
##
|
||||
#dark_mode:
|
||||
|
||||
##
|
||||
## Enable/Disable thin mode (no video thumbnails).
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#thin_mode: false
|
||||
|
||||
##
|
||||
## List of feeds available on the home page.
|
||||
##
|
||||
## Note: "Subscriptions" and "Playlists" are only visible
|
||||
## when the user is logged in.
|
||||
##
|
||||
## Accepted values: A list of strings
|
||||
## Each entry can be one of: "Popular", "Trending",
|
||||
## "Subscriptions", "Playlists"
|
||||
##
|
||||
## Default: ["Popular", "Trending", "Subscriptions", "Playlists"] (show all feeds)
|
||||
##
|
||||
#feed_menu: ["Popular", "Trending", "Subscriptions", "Playlists"]
|
||||
|
||||
##
|
||||
## Default feed to display on the home page.
|
||||
##
|
||||
## Note: setting this option to "Popular" has no
|
||||
## effect when 'popular_enabled' is set to false.
|
||||
##
|
||||
## Accepted values: Popular, Trending, Subscriptions, Playlists, <none>
|
||||
## Default: Popular
|
||||
##
|
||||
#default_home: Popular
|
||||
|
||||
##
|
||||
## Default number of results to display per page.
|
||||
##
|
||||
## Note: this affects invidious-generated pages only, such
|
||||
## as watch history and subscription feeds. Playlists, search
|
||||
## results and channel videos depend on the data returned by
|
||||
## the Youtube API.
|
||||
##
|
||||
## Accepted values: any positive integer
|
||||
## Default: 40
|
||||
##
|
||||
#max_results: 40
|
||||
|
||||
##
|
||||
## Show/hide annotations.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#annotations: false
|
||||
|
||||
##
|
||||
## Show/hide annotation.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#annotations_subscribed: false
|
||||
|
||||
##
|
||||
## Type of comments to display below video.
|
||||
##
|
||||
## Accepted values: a two-entries array.
|
||||
## Each entry can be one of: "youtube", "reddit", ""
|
||||
##
|
||||
## Default: ["youtube", ""]
|
||||
##
|
||||
#comments: ["youtube", ""]
|
||||
|
||||
##
|
||||
## Default player style.
|
||||
##
|
||||
## Accepted values: invidious, youtube
|
||||
## Default: invidious
|
||||
##
|
||||
#player_style: invidious
|
||||
|
||||
##
|
||||
## Show/Hide the "related videos" sidebar when
|
||||
## watching a video.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: true
|
||||
##
|
||||
#related_videos: true
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Video player behavior
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## Automatically play videos on page load.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#autoplay: false
|
||||
|
||||
##
|
||||
## Automatically load the "next" video (either next in
|
||||
## playlist or proposed) when the current video ends.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#continue: false
|
||||
|
||||
##
|
||||
## Autoplay next video by default.
|
||||
##
|
||||
## Note: Only effective if 'continue' is set to true.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: true
|
||||
##
|
||||
#continue_autoplay: true
|
||||
|
||||
##
|
||||
## Play videos in Audio-only mode by default.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#listen: false
|
||||
|
||||
##
|
||||
## Loop videos automatically.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#video_loop: false
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Video playback settings
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## Default video quality.
|
||||
##
|
||||
## Accepted values: dash, hd720, medium, small
|
||||
## Default: hd720
|
||||
##
|
||||
#quality: hd720
|
||||
|
||||
##
|
||||
## Default dash video quality.
|
||||
##
|
||||
## Note: this setting only takes effet if the
|
||||
## 'quality' parameter is set to "dash".
|
||||
##
|
||||
## Accepted values:
|
||||
## auto, best, 4320p, 2160p, 1440p, 1080p,
|
||||
## 720p, 480p, 360p, 240p, 144p, worst
|
||||
## Default: auto
|
||||
##
|
||||
#quality_dash: auto
|
||||
|
||||
##
|
||||
## Default video playback speed.
|
||||
##
|
||||
## Accepted values: 0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0
|
||||
## Default: 1.0
|
||||
##
|
||||
#speed: 1.0
|
||||
|
||||
##
|
||||
## Default volume.
|
||||
##
|
||||
## Accepted values: 0-100
|
||||
## Default: 100
|
||||
##
|
||||
#volume: 100
|
||||
|
||||
##
|
||||
## Allow 360° videos to be played.
|
||||
##
|
||||
## Note: This feature requires a WebGL-enabled browser.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: true
|
||||
##
|
||||
#vr_mode: true
|
||||
|
||||
# -----------------------------
|
||||
# Subscription feed
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## In the "Subscription" feed, only show the latest video
|
||||
## of each channel the user is subscribed to.
|
||||
##
|
||||
## Note: when combined with 'unseen_only', the latest unseen
|
||||
## video of each channel will be displayed instead of the
|
||||
## latest by date.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#latest_only: false
|
||||
|
||||
##
|
||||
## Enable/Disable user subscriptions desktop notifications.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#notifications_only: false
|
||||
|
||||
##
|
||||
## In the "Subscription" feed, Only show the videos that the
|
||||
## user haven't watched yet (i.e which are not in their watch
|
||||
## history).
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#unseen_only: false
|
||||
|
||||
##
|
||||
## Default sorting parameter for subscription feeds.
|
||||
##
|
||||
## Accepted values:
|
||||
## 'alphabetically'
|
||||
## 'alphabetically - reverse'
|
||||
## 'channel name'
|
||||
## 'channel name - reverse'
|
||||
## 'published'
|
||||
## 'published - reverse'
|
||||
##
|
||||
## Default: published
|
||||
##
|
||||
#sort: published
|
||||
|
||||
|
||||
# -----------------------------
|
||||
# Miscellaneous
|
||||
# -----------------------------
|
||||
|
||||
##
|
||||
## Proxy videos through instance by default.
|
||||
##
|
||||
## Warning: As most users won't change this setting in their
|
||||
## preferences, defaulting to true will significantly
|
||||
## increase the instance's network usage, so make sure that
|
||||
## your server's connection can handle it.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#local: false
|
||||
|
||||
##
|
||||
## Show the connected user's nick at the top right.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: true
|
||||
##
|
||||
#show_nick: true
|
||||
|
||||
##
|
||||
## Automatically redirect to a random instance when the user uses
|
||||
## any "switch invidious instance" link (For videos, it's the plane
|
||||
## icon, next to "watch on youtube" and "listen"). When set to false,
|
||||
## the user is sent to https://redirect.invidious.io instead, where
|
||||
## they can manually select an instance.
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#automatic_instance_redirect: false
|
||||
|
||||
##
|
||||
## Show the entire video description by default (when set to 'false',
|
||||
## only the first few lines of the description are shown and a
|
||||
## "show more" button allows to expand it).
|
||||
##
|
||||
## Accepted values: true, false
|
||||
## Default: false
|
||||
##
|
||||
#extend_desc: false
|
||||
@@ -1,11 +0,0 @@
|
||||
channel_threads: 1
|
||||
feed_threads: 1
|
||||
db:
|
||||
user: kemal
|
||||
password: kemal
|
||||
host: localhost
|
||||
port: 5432
|
||||
dbname: invidious
|
||||
full_refresh: false
|
||||
https_only: false
|
||||
domain:
|
||||
@@ -1,4 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
psql invidious kemal -c "ALTER TABLE channels ADD COLUMN subscribed bool;"
|
||||
psql invidious kemal -c "UPDATE channels SET subscribed = false;"
|
||||
[ -z "$POSTGRES_USER" ] && POSTGRES_USER=kemal
|
||||
[ -z "$POSTGRES_DB" ] && POSTGRES_DB=invidious
|
||||
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE channels ADD COLUMN subscribed bool;"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "UPDATE channels SET subscribed = false;"
|
||||
|
||||
@@ -1,7 +1,10 @@
|
||||
#!/bin/sh
|
||||
|
||||
psql invidious kemal -c "ALTER TABLE channel_videos DROP COLUMN live_now CASCADE"
|
||||
psql invidious kemal -c "ALTER TABLE channel_videos DROP COLUMN premiere_timestamp CASCADE"
|
||||
[ -z "$POSTGRES_USER" ] && POSTGRES_USER=kemal
|
||||
[ -z "$POSTGRES_DB" ] && POSTGRES_DB=invidious
|
||||
|
||||
psql invidious kemal -c "ALTER TABLE channel_videos ADD COLUMN live_now bool"
|
||||
psql invidious kemal -c "ALTER TABLE channel_videos ADD COLUMN premiere_timestamp timestamptz"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE channel_videos DROP COLUMN live_now CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE channel_videos DROP COLUMN premiere_timestamp CASCADE"
|
||||
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE channel_videos ADD COLUMN live_now bool"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE channel_videos ADD COLUMN premiere_timestamp timestamptz"
|
||||
|
||||
22
config/migrate-scripts/migrate-db-1eca969.sh
Executable file
22
config/migrate-scripts/migrate-db-1eca969.sh
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/bin/sh
|
||||
|
||||
[ -z "$POSTGRES_USER" ] && POSTGRES_USER=kemal
|
||||
[ -z "$POSTGRES_DB" ] && POSTGRES_DB=invidious
|
||||
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN title CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN views CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN likes CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN dislikes CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN wilson_score CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN published CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN description CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN language CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN author CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN ucid CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN allowed_regions CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN is_family_friendly CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN genre CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN genre_url CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN license CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN sub_count_text CASCADE"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE videos DROP COLUMN author_thumbnail CASCADE"
|
||||
@@ -1,4 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
psql invidious kemal -c "ALTER TABLE channels ADD COLUMN deleted bool;"
|
||||
psql invidious kemal -c "UPDATE channels SET deleted = false;"
|
||||
[ -z "$POSTGRES_USER" ] && POSTGRES_USER=kemal
|
||||
[ -z "$POSTGRES_DB" ] && POSTGRES_DB=invidious
|
||||
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE channels ADD COLUMN deleted bool;"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "UPDATE channels SET deleted = false;"
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
psql invidious kemal < config/sql/session_ids.sql
|
||||
psql invidious kemal -c "INSERT INTO session_ids (SELECT unnest(id), email, CURRENT_TIMESTAMP FROM users) ON CONFLICT (id) DO NOTHING"
|
||||
psql invidious kemal -c "ALTER TABLE users DROP COLUMN id"
|
||||
[ -z "$POSTGRES_USER" ] && POSTGRES_USER=kemal
|
||||
[ -z "$POSTGRES_DB" ] && POSTGRES_DB=invidious
|
||||
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" < config/sql/session_ids.sql
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "INSERT INTO session_ids (SELECT unnest(id), email, CURRENT_TIMESTAMP FROM users) ON CONFLICT (id) DO NOTHING"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE users DROP COLUMN id"
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
psql invidious kemal < config/sql/annotations.sql
|
||||
[ -z "$POSTGRES_USER" ] && POSTGRES_USER=kemal
|
||||
[ -z "$POSTGRES_DB" ] && POSTGRES_DB=invidious
|
||||
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" < config/sql/annotations.sql
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
psql invidious kemal -c "ALTER TABLE channel_videos ADD COLUMN views bigint;"
|
||||
[ -z "$POSTGRES_USER" ] && POSTGRES_USER=kemal
|
||||
[ -z "$POSTGRES_DB" ] && POSTGRES_DB=invidious
|
||||
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE channel_videos ADD COLUMN views bigint;"
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
#!/bin/sh
|
||||
|
||||
psql invidious kemal -c "ALTER TABLE channel_videos ADD COLUMN live_now bool;"
|
||||
psql invidious kemal -c "UPDATE channel_videos SET live_now = false;"
|
||||
[ -z "$POSTGRES_USER" ] && POSTGRES_USER=kemal
|
||||
[ -z "$POSTGRES_DB" ] && POSTGRES_DB=invidious
|
||||
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE channel_videos ADD COLUMN live_now bool;"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "UPDATE channel_videos SET live_now = false;"
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
psql invidious kemal -c "ALTER TABLE users ADD COLUMN feed_needs_update boolean"
|
||||
[ -z "$POSTGRES_USER" ] && POSTGRES_USER=kemal
|
||||
[ -z "$POSTGRES_DB" ] && POSTGRES_DB=invidious
|
||||
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE users ADD COLUMN feed_needs_update boolean"
|
||||
|
||||
@@ -1,3 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
psql invidious kemal -c "ALTER TABLE channel_videos ADD COLUMN premiere_timestamp timestamptz;"
|
||||
[ -z "$POSTGRES_USER" ] && POSTGRES_USER=kemal
|
||||
[ -z "$POSTGRES_DB" ] && POSTGRES_DB=invidious
|
||||
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE channel_videos ADD COLUMN premiere_timestamp timestamptz;"
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
#!/bin/sh
|
||||
|
||||
psql invidious kemal -c "ALTER TABLE channels DROP COLUMN subscribed"
|
||||
psql invidious kemal -c "ALTER TABLE channels ADD COLUMN subscribed timestamptz"
|
||||
psql invidious kemal -c "UPDATE channels SET subscribed = '2019-01-01 00:00:00+00'"
|
||||
[ -z "$POSTGRES_USER" ] && POSTGRES_USER=kemal
|
||||
[ -z "$POSTGRES_DB" ] && POSTGRES_DB=invidious
|
||||
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE channels DROP COLUMN subscribed"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "ALTER TABLE channels ADD COLUMN subscribed timestamptz"
|
||||
psql "$POSTGRES_DB" "$POSTGRES_USER" -c "UPDATE channels SET subscribed = '2019-01-01 00:00:00+00'"
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
|
||||
-- DROP TABLE public.annotations;
|
||||
|
||||
CREATE TABLE public.annotations
|
||||
CREATE TABLE IF NOT EXISTS public.annotations
|
||||
(
|
||||
id text NOT NULL,
|
||||
annotations xml,
|
||||
CONSTRAINT annotations_id_key UNIQUE (id)
|
||||
);
|
||||
|
||||
GRANT ALL ON TABLE public.annotations TO kemal;
|
||||
GRANT ALL ON TABLE public.annotations TO current_user;
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
-- DROP TABLE public.channel_videos;
|
||||
|
||||
CREATE TABLE public.channel_videos
|
||||
CREATE TABLE IF NOT EXISTS public.channel_videos
|
||||
(
|
||||
id text NOT NULL,
|
||||
title text,
|
||||
@@ -17,13 +17,13 @@ CREATE TABLE public.channel_videos
|
||||
CONSTRAINT channel_videos_id_key UNIQUE (id)
|
||||
);
|
||||
|
||||
GRANT ALL ON TABLE public.channel_videos TO kemal;
|
||||
GRANT ALL ON TABLE public.channel_videos TO current_user;
|
||||
|
||||
-- Index: public.channel_videos_ucid_idx
|
||||
|
||||
-- DROP INDEX public.channel_videos_ucid_idx;
|
||||
|
||||
CREATE INDEX channel_videos_ucid_idx
|
||||
CREATE INDEX IF NOT EXISTS channel_videos_ucid_idx
|
||||
ON public.channel_videos
|
||||
USING btree
|
||||
(ucid COLLATE pg_catalog."default");
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
-- DROP TABLE public.channels;
|
||||
|
||||
CREATE TABLE public.channels
|
||||
CREATE TABLE IF NOT EXISTS public.channels
|
||||
(
|
||||
id text NOT NULL,
|
||||
author text,
|
||||
@@ -12,13 +12,13 @@ CREATE TABLE public.channels
|
||||
CONSTRAINT channels_id_key UNIQUE (id)
|
||||
);
|
||||
|
||||
GRANT ALL ON TABLE public.channels TO kemal;
|
||||
GRANT ALL ON TABLE public.channels TO current_user;
|
||||
|
||||
-- Index: public.channels_id_idx
|
||||
|
||||
-- DROP INDEX public.channels_id_idx;
|
||||
|
||||
CREATE INDEX channels_id_idx
|
||||
CREATE INDEX IF NOT EXISTS channels_id_idx
|
||||
ON public.channels
|
||||
USING btree
|
||||
(id COLLATE pg_catalog."default");
|
||||
|
||||
@@ -2,20 +2,20 @@
|
||||
|
||||
-- DROP TABLE public.nonces;
|
||||
|
||||
CREATE TABLE public.nonces
|
||||
CREATE TABLE IF NOT EXISTS public.nonces
|
||||
(
|
||||
nonce text,
|
||||
expire timestamp with time zone,
|
||||
CONSTRAINT nonces_id_key UNIQUE (nonce)
|
||||
);
|
||||
|
||||
GRANT ALL ON TABLE public.nonces TO kemal;
|
||||
GRANT ALL ON TABLE public.nonces TO current_user;
|
||||
|
||||
-- Index: public.nonces_nonce_idx
|
||||
|
||||
-- DROP INDEX public.nonces_nonce_idx;
|
||||
|
||||
CREATE INDEX nonces_nonce_idx
|
||||
CREATE INDEX IF NOT EXISTS nonces_nonce_idx
|
||||
ON public.nonces
|
||||
USING btree
|
||||
(nonce COLLATE pg_catalog."default");
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
-- DROP TABLE public.playlist_videos;
|
||||
|
||||
CREATE TABLE playlist_videos
|
||||
CREATE TABLE IF NOT EXISTS public.playlist_videos
|
||||
(
|
||||
title text,
|
||||
id text,
|
||||
@@ -16,4 +16,4 @@ CREATE TABLE playlist_videos
|
||||
PRIMARY KEY (index,plid)
|
||||
);
|
||||
|
||||
GRANT ALL ON TABLE public.playlist_videos TO kemal;
|
||||
GRANT ALL ON TABLE public.playlist_videos TO current_user;
|
||||
|
||||
@@ -1,8 +1,19 @@
|
||||
-- Type: public.privacy
|
||||
|
||||
-- DROP TYPE public.privacy;
|
||||
|
||||
CREATE TYPE public.privacy AS ENUM
|
||||
(
|
||||
'Public',
|
||||
'Unlisted',
|
||||
'Private'
|
||||
);
|
||||
|
||||
-- Table: public.playlists
|
||||
|
||||
-- DROP TABLE public.playlists;
|
||||
|
||||
CREATE TABLE public.playlists
|
||||
CREATE TABLE IF NOT EXISTS public.playlists
|
||||
(
|
||||
title text,
|
||||
id text primary key,
|
||||
@@ -15,4 +26,4 @@ CREATE TABLE public.playlists
|
||||
index int8[]
|
||||
);
|
||||
|
||||
GRANT ALL ON public.playlists TO kemal;
|
||||
GRANT ALL ON public.playlists TO current_user;
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
-- Type: public.privacy
|
||||
|
||||
-- DROP TYPE public.privacy;
|
||||
|
||||
CREATE TYPE public.privacy AS ENUM
|
||||
(
|
||||
'Public',
|
||||
'Unlisted',
|
||||
'Private'
|
||||
);
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
-- DROP TABLE public.session_ids;
|
||||
|
||||
CREATE TABLE public.session_ids
|
||||
CREATE TABLE IF NOT EXISTS public.session_ids
|
||||
(
|
||||
id text NOT NULL,
|
||||
email text,
|
||||
@@ -10,13 +10,13 @@ CREATE TABLE public.session_ids
|
||||
CONSTRAINT session_ids_pkey PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
GRANT ALL ON TABLE public.session_ids TO kemal;
|
||||
GRANT ALL ON TABLE public.session_ids TO current_user;
|
||||
|
||||
-- Index: public.session_ids_id_idx
|
||||
|
||||
-- DROP INDEX public.session_ids_id_idx;
|
||||
|
||||
CREATE INDEX session_ids_id_idx
|
||||
CREATE INDEX IF NOT EXISTS session_ids_id_idx
|
||||
ON public.session_ids
|
||||
USING btree
|
||||
(id COLLATE pg_catalog."default");
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
-- DROP TABLE public.users;
|
||||
|
||||
CREATE TABLE public.users
|
||||
CREATE TABLE IF NOT EXISTS public.users
|
||||
(
|
||||
updated timestamp with time zone,
|
||||
notifications text[],
|
||||
@@ -16,13 +16,13 @@ CREATE TABLE public.users
|
||||
CONSTRAINT users_email_key UNIQUE (email)
|
||||
);
|
||||
|
||||
GRANT ALL ON TABLE public.users TO kemal;
|
||||
GRANT ALL ON TABLE public.users TO current_user;
|
||||
|
||||
-- Index: public.email_unique_idx
|
||||
|
||||
-- DROP INDEX public.email_unique_idx;
|
||||
|
||||
CREATE UNIQUE INDEX email_unique_idx
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS email_unique_idx
|
||||
ON public.users
|
||||
USING btree
|
||||
(lower(email) COLLATE pg_catalog."default");
|
||||
|
||||
@@ -2,38 +2,21 @@
|
||||
|
||||
-- DROP TABLE public.videos;
|
||||
|
||||
CREATE TABLE public.videos
|
||||
CREATE UNLOGGED TABLE IF NOT EXISTS public.videos
|
||||
(
|
||||
id text NOT NULL,
|
||||
info text,
|
||||
updated timestamp with time zone,
|
||||
title text,
|
||||
views bigint,
|
||||
likes integer,
|
||||
dislikes integer,
|
||||
wilson_score double precision,
|
||||
published timestamp with time zone,
|
||||
description text,
|
||||
language text,
|
||||
author text,
|
||||
ucid text,
|
||||
allowed_regions text[],
|
||||
is_family_friendly boolean,
|
||||
genre text,
|
||||
genre_url text,
|
||||
license text,
|
||||
sub_count_text text,
|
||||
author_thumbnail text,
|
||||
CONSTRAINT videos_pkey PRIMARY KEY (id)
|
||||
);
|
||||
|
||||
GRANT ALL ON TABLE public.videos TO kemal;
|
||||
GRANT ALL ON TABLE public.videos TO current_user;
|
||||
|
||||
-- Index: public.id_idx
|
||||
|
||||
-- DROP INDEX public.id_idx;
|
||||
|
||||
CREATE UNIQUE INDEX id_idx
|
||||
CREATE UNIQUE INDEX IF NOT EXISTS id_idx
|
||||
ON public.videos
|
||||
USING btree
|
||||
(id COLLATE pg_catalog."default");
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
version: '3'
|
||||
# Warning: This docker-compose file is made for development purposes.
|
||||
# Using it will build an image from the locally cloned repository.
|
||||
#
|
||||
# If you want to use Invidious in production, see the docker-compose.yml file provided
|
||||
# in the installation documentation: https://docs.invidious.io/Installation.md
|
||||
|
||||
version: "3"
|
||||
services:
|
||||
postgres:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: docker/Dockerfile.postgres
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- postgresdata:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD", "pg_isready", "-U", "postgres"]
|
||||
|
||||
invidious:
|
||||
build:
|
||||
context: .
|
||||
@@ -16,8 +14,43 @@ services:
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "127.0.0.1:3000:3000"
|
||||
environment:
|
||||
# Please read the following file for a comprehensive list of all available
|
||||
# configuration options and their associated syntax:
|
||||
# https://github.com/iv-org/invidious/blob/master/config/config.example.yml
|
||||
INVIDIOUS_CONFIG: |
|
||||
db:
|
||||
dbname: invidious
|
||||
user: kemal
|
||||
password: kemal
|
||||
host: invidious-db
|
||||
port: 5432
|
||||
check_tables: true
|
||||
# external_port:
|
||||
# domain:
|
||||
# https_only: false
|
||||
# statistics_enabled: false
|
||||
healthcheck:
|
||||
test: wget -nv --tries=1 --spider http://127.0.0.1:3000/api/v1/comments/jNQXAC9IVRw || exit 1
|
||||
interval: 30s
|
||||
timeout: 5s
|
||||
retries: 2
|
||||
depends_on:
|
||||
- postgres
|
||||
- invidious-db
|
||||
|
||||
invidious-db:
|
||||
image: docker.io/library/postgres:14
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- postgresdata:/var/lib/postgresql/data
|
||||
- ./config/sql:/config/sql
|
||||
- ./docker/init-invidious-db.sh:/docker-entrypoint-initdb.d/init-invidious-db.sh
|
||||
environment:
|
||||
POSTGRES_DB: invidious
|
||||
POSTGRES_USER: kemal
|
||||
POSTGRES_PASSWORD: kemal
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"]
|
||||
|
||||
volumes:
|
||||
postgresdata:
|
||||
|
||||
@@ -1,29 +1,54 @@
|
||||
FROM alpine:edge AS builder
|
||||
RUN apk add --no-cache crystal shards libc-dev \
|
||||
yaml-dev libxml2-dev sqlite-dev zlib-dev openssl-dev \
|
||||
sqlite-static zlib-static openssl-libs-static
|
||||
FROM crystallang/crystal:1.2.2-alpine AS builder
|
||||
RUN apk add --no-cache sqlite-static yaml-static
|
||||
|
||||
ARG release
|
||||
|
||||
WORKDIR /invidious
|
||||
COPY ./shard.yml ./shard.yml
|
||||
RUN shards update && shards install
|
||||
COPY ./shard.lock ./shard.lock
|
||||
RUN shards install --production
|
||||
|
||||
COPY --from=quay.io/invidious/lsquic-compiled /root/liblsquic.a ./lib/lsquic/src/lsquic/ext/liblsquic.a
|
||||
|
||||
COPY ./src/ ./src/
|
||||
# TODO: .git folder is required for building – this is destructive.
|
||||
# See definition of CURRENT_BRANCH, CURRENT_COMMIT and CURRENT_VERSION.
|
||||
COPY ./.git/ ./.git/
|
||||
RUN crystal build --static --release --warnings all --error-on-warnings \
|
||||
# TODO: Remove next line, see https://github.com/crystal-lang/crystal/issues/7946
|
||||
-Dmusl \
|
||||
./src/invidious.cr
|
||||
|
||||
# Required for fetching player dependencies
|
||||
COPY ./scripts/ ./scripts/
|
||||
COPY ./assets/ ./assets/
|
||||
COPY ./videojs-dependencies.yml ./videojs-dependencies.yml
|
||||
|
||||
RUN crystal spec --warnings all \
|
||||
--link-flags "-lxml2 -llzma"
|
||||
|
||||
RUN if [ "${release}" == 1 ] ; then \
|
||||
crystal build ./src/invidious.cr \
|
||||
--release \
|
||||
--static --warnings all \
|
||||
--link-flags "-lxml2 -llzma"; \
|
||||
else \
|
||||
crystal build ./src/invidious.cr \
|
||||
--static --warnings all \
|
||||
--link-flags "-lxml2 -llzma"; \
|
||||
fi
|
||||
|
||||
|
||||
FROM alpine:latest
|
||||
RUN apk add --no-cache librsvg ttf-opensans
|
||||
WORKDIR /invidious
|
||||
RUN addgroup -g 1000 -S invidious && \
|
||||
adduser -u 1000 -S invidious -G invidious
|
||||
COPY ./assets/ ./assets/
|
||||
COPY ./config/config.yml ./config/config.yml
|
||||
COPY --chown=invidious ./config/config.* ./config/
|
||||
RUN mv -n config/config.example.yml config/config.yml
|
||||
RUN sed -i 's/host: \(127.0.0.1\|localhost\)/host: postgres/' config/config.yml
|
||||
COPY ./config/sql/ ./config/sql/
|
||||
COPY ./locales/ ./locales/
|
||||
RUN sed -i 's/host: \(127.0.0.1\|localhost\)/host: postgres/' config/config.yml
|
||||
COPY --from=builder /invidious/assets ./assets/
|
||||
COPY --from=builder /invidious/invidious .
|
||||
RUN chmod o+rX -R ./assets ./config ./locales
|
||||
|
||||
EXPOSE 3000
|
||||
USER invidious
|
||||
CMD [ "/invidious/invidious" ]
|
||||
|
||||
53
docker/Dockerfile.arm64
Normal file
53
docker/Dockerfile.arm64
Normal file
@@ -0,0 +1,53 @@
|
||||
FROM alpine:3.15 AS builder
|
||||
RUN apk add --no-cache 'crystal=1.2.2-r0' shards sqlite-static yaml-static yaml-dev libxml2-dev zlib-static openssl-libs-static openssl-dev musl-dev
|
||||
|
||||
ARG release
|
||||
|
||||
WORKDIR /invidious
|
||||
COPY ./shard.yml ./shard.yml
|
||||
COPY ./shard.lock ./shard.lock
|
||||
RUN shards install --production
|
||||
|
||||
COPY --from=quay.io/invidious/lsquic-compiled /root/liblsquic.a ./lib/lsquic/src/lsquic/ext/liblsquic.a
|
||||
|
||||
COPY ./src/ ./src/
|
||||
# TODO: .git folder is required for building – this is destructive.
|
||||
# See definition of CURRENT_BRANCH, CURRENT_COMMIT and CURRENT_VERSION.
|
||||
COPY ./.git/ ./.git/
|
||||
|
||||
# Required for fetching player dependencies
|
||||
COPY ./scripts/ ./scripts/
|
||||
COPY ./assets/ ./assets/
|
||||
COPY ./videojs-dependencies.yml ./videojs-dependencies.yml
|
||||
|
||||
RUN crystal spec --warnings all \
|
||||
--link-flags "-lxml2 -llzma"
|
||||
|
||||
RUN if [ ${release} == 1 ] ; then \
|
||||
crystal build ./src/invidious.cr \
|
||||
--release \
|
||||
--static --warnings all \
|
||||
--link-flags "-lxml2 -llzma"; \
|
||||
else \
|
||||
crystal build ./src/invidious.cr \
|
||||
--static --warnings all \
|
||||
--link-flags "-lxml2 -llzma"; \
|
||||
fi
|
||||
|
||||
FROM alpine:3.15
|
||||
RUN apk add --no-cache librsvg ttf-opensans
|
||||
WORKDIR /invidious
|
||||
RUN addgroup -g 1000 -S invidious && \
|
||||
adduser -u 1000 -S invidious -G invidious
|
||||
COPY --chown=invidious ./config/config.* ./config/
|
||||
RUN mv -n config/config.example.yml config/config.yml
|
||||
RUN sed -i 's/host: \(127.0.0.1\|localhost\)/host: postgres/' config/config.yml
|
||||
COPY ./config/sql/ ./config/sql/
|
||||
COPY ./locales/ ./locales/
|
||||
COPY --from=builder /invidious/assets ./assets/
|
||||
COPY --from=builder /invidious/invidious .
|
||||
RUN chmod o+rX -R ./assets ./config ./locales
|
||||
|
||||
EXPOSE 3000
|
||||
USER invidious
|
||||
CMD [ "/invidious/invidious" ]
|
||||
@@ -1,9 +0,0 @@
|
||||
FROM postgres:10
|
||||
|
||||
ENV POSTGRES_USER postgres
|
||||
|
||||
ADD ./config/sql /config/sql
|
||||
ADD ./docker/entrypoint.postgres.sh /entrypoint.sh
|
||||
|
||||
ENTRYPOINT [ "/entrypoint.sh" ]
|
||||
CMD [ "postgres" ]
|
||||
@@ -1,31 +0,0 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
CMD="$@"
|
||||
if [ ! -f /var/lib/postgresql/data/setupFinished ]; then
|
||||
echo "### first run - setting up invidious database"
|
||||
/usr/local/bin/docker-entrypoint.sh postgres &
|
||||
sleep 10
|
||||
until runuser -l postgres -c 'pg_isready' 2>/dev/null; do
|
||||
>&2 echo "### Postgres is unavailable - waiting"
|
||||
sleep 5
|
||||
done
|
||||
>&2 echo "### importing table schemas"
|
||||
su postgres -c 'createdb invidious'
|
||||
su postgres -c 'psql -c "CREATE USER kemal WITH PASSWORD '"'kemal'"'"'
|
||||
su postgres -c 'psql invidious kemal < config/sql/channels.sql'
|
||||
su postgres -c 'psql invidious kemal < config/sql/videos.sql'
|
||||
su postgres -c 'psql invidious kemal < config/sql/channel_videos.sql'
|
||||
su postgres -c 'psql invidious kemal < config/sql/users.sql'
|
||||
su postgres -c 'psql invidious kemal < config/sql/session_ids.sql'
|
||||
su postgres -c 'psql invidious kemal < config/sql/nonces.sql'
|
||||
su postgres -c 'psql invidious kemal < config/sql/annotations.sql'
|
||||
su postgres -c 'psql invidious kemal < config/sql/playlists.sql'
|
||||
su postgres -c 'psql invidious kemal < config/sql/playlist_videos.sql'
|
||||
su postgres -c 'psql invidious kemal < config/sql/privacy.sql'
|
||||
touch /var/lib/postgresql/data/setupFinished
|
||||
echo "### invidious database setup finished"
|
||||
exit
|
||||
fi
|
||||
|
||||
echo "running postgres /usr/local/bin/docker-entrypoint.sh $CMD"
|
||||
exec /usr/local/bin/docker-entrypoint.sh $CMD
|
||||
12
docker/init-invidious-db.sh
Executable file
12
docker/init-invidious-db.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
set -eou pipefail
|
||||
|
||||
psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/channels.sql
|
||||
psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/videos.sql
|
||||
psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/channel_videos.sql
|
||||
psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/users.sql
|
||||
psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/session_ids.sql
|
||||
psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/nonces.sql
|
||||
psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/annotations.sql
|
||||
psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/playlists.sql
|
||||
psql --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" < config/sql/playlist_videos.sql
|
||||
1
kubernetes/.gitignore
vendored
Normal file
1
kubernetes/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
/charts/*.tgz
|
||||
6
kubernetes/Chart.lock
Normal file
6
kubernetes/Chart.lock
Normal file
@@ -0,0 +1,6 @@
|
||||
dependencies:
|
||||
- name: postgresql
|
||||
repository: https://kubernetes-charts.storage.googleapis.com/
|
||||
version: 8.3.0
|
||||
digest: sha256:1feec3c396cbf27573dc201831ccd3376a4a6b58b2e7618ce30a89b8f5d707fd
|
||||
generated: "2020-02-07T13:39:38.624846+01:00"
|
||||
22
kubernetes/Chart.yaml
Normal file
22
kubernetes/Chart.yaml
Normal file
@@ -0,0 +1,22 @@
|
||||
apiVersion: v2
|
||||
name: invidious
|
||||
description: Invidious is an alternative front-end to YouTube
|
||||
version: 1.1.0
|
||||
appVersion: 0.20.1
|
||||
keywords:
|
||||
- youtube
|
||||
- proxy
|
||||
- video
|
||||
- privacy
|
||||
home: https://invidio.us/
|
||||
icon: https://raw.githubusercontent.com/iv-org/invidious/05988c1c49851b7d0094fca16aeaf6382a7f64ab/assets/favicon-32x32.png
|
||||
sources:
|
||||
- https://github.com/iv-org/invidious
|
||||
maintainers:
|
||||
- name: Leon Klingele
|
||||
email: mail@leonklingele.de
|
||||
dependencies:
|
||||
- name: postgresql
|
||||
version: ~8.3.0
|
||||
repository: "https://kubernetes-charts.storage.googleapis.com/"
|
||||
engine: gotpl
|
||||
41
kubernetes/README.md
Normal file
41
kubernetes/README.md
Normal file
@@ -0,0 +1,41 @@
|
||||
# Invidious Helm chart
|
||||
|
||||
Easily deploy Invidious to Kubernetes.
|
||||
|
||||
## Installing Helm chart
|
||||
|
||||
```sh
|
||||
# Build Helm dependencies
|
||||
$ helm dep build
|
||||
|
||||
# Add PostgreSQL init scripts
|
||||
$ kubectl create configmap invidious-postgresql-init \
|
||||
--from-file=../config/sql/channels.sql \
|
||||
--from-file=../config/sql/videos.sql \
|
||||
--from-file=../config/sql/channel_videos.sql \
|
||||
--from-file=../config/sql/users.sql \
|
||||
--from-file=../config/sql/session_ids.sql \
|
||||
--from-file=../config/sql/nonces.sql \
|
||||
--from-file=../config/sql/annotations.sql \
|
||||
--from-file=../config/sql/playlists.sql \
|
||||
--from-file=../config/sql/playlist_videos.sql
|
||||
|
||||
# Install Helm app to your Kubernetes cluster
|
||||
$ helm install invidious ./
|
||||
```
|
||||
|
||||
## Upgrading
|
||||
|
||||
```sh
|
||||
# Upgrading is easy, too!
|
||||
$ helm upgrade invidious ./
|
||||
```
|
||||
|
||||
## Uninstall
|
||||
|
||||
```sh
|
||||
# Get rid of everything (except database)
|
||||
$ helm delete invidious
|
||||
|
||||
# To also delete the database, remove all invidious-postgresql PVCs
|
||||
```
|
||||
16
kubernetes/templates/_helpers.tpl
Normal file
16
kubernetes/templates/_helpers.tpl
Normal file
@@ -0,0 +1,16 @@
|
||||
{{/* vim: set filetype=mustache: */}}
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "invidious.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
*/}}
|
||||
{{- define "invidious.fullname" -}}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride -}}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" -}}
|
||||
{{- end -}}
|
||||
11
kubernetes/templates/configmap.yaml
Normal file
11
kubernetes/templates/configmap.yaml
Normal file
@@ -0,0 +1,11 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ template "invidious.fullname" . }}
|
||||
labels:
|
||||
app: {{ template "invidious.name" . }}
|
||||
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
|
||||
release: {{ .Release.Name }}
|
||||
data:
|
||||
INVIDIOUS_CONFIG: |
|
||||
{{ toYaml .Values.config | indent 4 }}
|
||||
61
kubernetes/templates/deployment.yaml
Normal file
61
kubernetes/templates/deployment.yaml
Normal file
@@ -0,0 +1,61 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ template "invidious.fullname" . }}
|
||||
labels:
|
||||
app: {{ template "invidious.name" . }}
|
||||
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
|
||||
release: {{ .Release.Name }}
|
||||
spec:
|
||||
replicas: {{ .Values.replicaCount }}
|
||||
selector:
|
||||
matchLabels:
|
||||
app: {{ template "invidious.name" . }}
|
||||
release: {{ .Release.Name }}
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: {{ template "invidious.name" . }}
|
||||
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
|
||||
release: {{ .Release.Name }}
|
||||
spec:
|
||||
securityContext:
|
||||
runAsUser: {{ .Values.securityContext.runAsUser }}
|
||||
runAsGroup: {{ .Values.securityContext.runAsGroup }}
|
||||
fsGroup: {{ .Values.securityContext.fsGroup }}
|
||||
initContainers:
|
||||
- name: wait-for-postgresql
|
||||
image: postgres
|
||||
args:
|
||||
- /bin/sh
|
||||
- -c
|
||||
- until pg_isready -h {{ .Values.config.db.host }} -p {{ .Values.config.db.port }} -U {{ .Values.config.db.user }}; do echo waiting for database; sleep 2; done;
|
||||
containers:
|
||||
- name: {{ .Chart.Name }}
|
||||
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
|
||||
imagePullPolicy: {{ .Values.image.pullPolicy }}
|
||||
ports:
|
||||
- containerPort: 3000
|
||||
env:
|
||||
- name: INVIDIOUS_CONFIG
|
||||
valueFrom:
|
||||
configMapKeyRef:
|
||||
key: INVIDIOUS_CONFIG
|
||||
name: {{ template "invidious.fullname" . }}
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: {{ .Values.securityContext.allowPrivilegeEscalation }}
|
||||
capabilities:
|
||||
drop:
|
||||
- ALL
|
||||
resources:
|
||||
{{ toYaml .Values.resources | indent 10 }}
|
||||
readinessProbe:
|
||||
httpGet:
|
||||
port: 3000
|
||||
path: /
|
||||
livenessProbe:
|
||||
httpGet:
|
||||
port: 3000
|
||||
path: /
|
||||
initialDelaySeconds: 15
|
||||
restartPolicy: Always
|
||||
18
kubernetes/templates/hpa.yaml
Normal file
18
kubernetes/templates/hpa.yaml
Normal file
@@ -0,0 +1,18 @@
|
||||
{{- if .Values.autoscaling.enabled }}
|
||||
apiVersion: autoscaling/v1
|
||||
kind: HorizontalPodAutoscaler
|
||||
metadata:
|
||||
name: {{ template "invidious.fullname" . }}
|
||||
labels:
|
||||
app: {{ template "invidious.name" . }}
|
||||
chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
|
||||
release: {{ .Release.Name }}
|
||||
spec:
|
||||
scaleTargetRef:
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
name: {{ template "invidious.fullname" . }}
|
||||
minReplicas: {{ .Values.autoscaling.minReplicas }}
|
||||
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
|
||||
targetCPUUtilizationPercentage: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
|
||||
{{- end }}
|
||||
20
kubernetes/templates/service.yaml
Normal file
20
kubernetes/templates/service.yaml
Normal file
@@ -0,0 +1,20 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ template "invidious.fullname" . }}
|
||||
labels:
|
||||
app: {{ template "invidious.name" . }}
|
||||
chart: {{ .Chart.Name }}
|
||||
release: {{ .Release.Name }}
|
||||
spec:
|
||||
type: {{ .Values.service.type }}
|
||||
ports:
|
||||
- name: http
|
||||
port: {{ .Values.service.port }}
|
||||
targetPort: 3000
|
||||
selector:
|
||||
app: {{ template "invidious.name" . }}
|
||||
release: {{ .Release.Name }}
|
||||
{{- if .Values.service.loadBalancerIP }}
|
||||
loadBalancerIP: {{ .Values.service.loadBalancerIP }}
|
||||
{{- end }}
|
||||
56
kubernetes/values.yaml
Normal file
56
kubernetes/values.yaml
Normal file
@@ -0,0 +1,56 @@
|
||||
name: invidious
|
||||
|
||||
image:
|
||||
repository: quay.io/invidious/invidious
|
||||
tag: latest
|
||||
pullPolicy: Always
|
||||
|
||||
replicaCount: 1
|
||||
|
||||
autoscaling:
|
||||
enabled: false
|
||||
minReplicas: 1
|
||||
maxReplicas: 16
|
||||
targetCPUUtilizationPercentage: 50
|
||||
|
||||
service:
|
||||
type: clusterIP
|
||||
port: 3000
|
||||
#loadBalancerIP:
|
||||
|
||||
resources: {}
|
||||
#requests:
|
||||
# cpu: 100m
|
||||
# memory: 64Mi
|
||||
#limits:
|
||||
# cpu: 800m
|
||||
# memory: 512Mi
|
||||
|
||||
securityContext:
|
||||
allowPrivilegeEscalation: false
|
||||
runAsUser: 1000
|
||||
runAsGroup: 1000
|
||||
fsGroup: 1000
|
||||
|
||||
# See https://github.com/helm/charts/tree/master/stable/postgresql
|
||||
postgresql:
|
||||
postgresqlUsername: kemal
|
||||
postgresqlPassword: kemal
|
||||
postgresqlDatabase: invidious
|
||||
initdbUsername: kemal
|
||||
initdbPassword: kemal
|
||||
initdbScriptsConfigMap: invidious-postgresql-init
|
||||
|
||||
# Adapted from ../config/config.yml
|
||||
config:
|
||||
channel_threads: 1
|
||||
feed_threads: 1
|
||||
db:
|
||||
user: kemal
|
||||
password: kemal
|
||||
host: invidious-postgresql
|
||||
port: 5432
|
||||
dbname: invidious
|
||||
full_refresh: false
|
||||
https_only: false
|
||||
domain:
|
||||
377
locales/ar.json
377
locales/ar.json
@@ -1,128 +1,127 @@
|
||||
{
|
||||
"`x` subscribers": "`x` المشتركين",
|
||||
"`x` videos": "`x` الفيديوهات",
|
||||
"`x` playlists": "`x` قوائم التشغيل",
|
||||
"LIVE": "مباشر",
|
||||
"Shared `x` ago": "تم رفع الفيديو منذ `x`",
|
||||
"Unsubscribe": "إلغاء الإشتراك",
|
||||
"Subscribe": "إشتراك",
|
||||
"LIVE": "مُباشِر",
|
||||
"Shared `x` ago": "تمَّ رفع المقطع المرئيّ مُنذ `x`",
|
||||
"Unsubscribe": "إلغاء الاشتراك",
|
||||
"Subscribe": "الإشتراك",
|
||||
"View channel on YouTube": "زيارة القناة على موقع يوتيوب",
|
||||
"View playlist on YouTube": "عرض قائمة التشغيل على اليوتيوب",
|
||||
"newest": "الأجدد",
|
||||
"oldest": "الأقدم",
|
||||
"popular": "الأكثر شعبية",
|
||||
"last": "اخر قوائم التشغيل المعدلة",
|
||||
"Next page": "الصفحة الثانية",
|
||||
"last": "الأخيرة",
|
||||
"Next page": "الصفحة التالية",
|
||||
"Previous page": "الصفحة السابقة",
|
||||
"Clear watch history?": "مسح السجل ؟",
|
||||
"New password": "الرقم السرى الجديد",
|
||||
"New passwords must match": "الأرقام السرية يجب ان تكون متطابقة",
|
||||
"Cannot change password for Google accounts": "لا يستطيع تغيير الرقم السرى لحساب جوجل",
|
||||
"Authorize token?": "رمز الإذن ؟",
|
||||
"Authorize token for `x`?": "تصريح الرمز لـ `x` ؟",
|
||||
"Clear watch history?": "هل تريد محو سجل المشاهدة؟",
|
||||
"New password": "كلمة مرور جديدة",
|
||||
"New passwords must match": "يَجبُ أن تكون كلمتا المرور متطابقتين",
|
||||
"Cannot change password for Google accounts": "لا يُمكن تغيير كلمة المرور لِحسابات جوجل",
|
||||
"Authorize token?": "رمز التفويض؟",
|
||||
"Authorize token for `x`?": "السماح بالرمز المميز ل 'x'؟",
|
||||
"Yes": "نعم",
|
||||
"No": "لا",
|
||||
"Import and Export Data": "استخراج و إضافة البيانات",
|
||||
"Import": "إضافة",
|
||||
"Import Invidious data": "إضافة بيانات Invidious",
|
||||
"Import YouTube subscriptions": "إضافةالإشتراكات من موقع يوتيوب",
|
||||
"Import FreeTube subscriptions (.db)": "إضافةالمشتركين من FreeTube (.db)",
|
||||
"Import NewPipe subscriptions (.json)": "إضافة المشتركين من NewPipe (.json)",
|
||||
"Import NewPipe data (.zip)": "إضافة بيانات NewPipe (.zip)",
|
||||
"Export": "استخراج",
|
||||
"Export subscriptions as OPML": "استخراج المشتركين كـ OPML",
|
||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "استخراج المشتركين كـ OPML (لـ NewPipe و FreeTube)",
|
||||
"Export data as JSON": "استخراج البيانات كـ JSON",
|
||||
"Delete account?": "حذف الحساب ؟",
|
||||
"History": "السجل",
|
||||
"An alternative front-end to YouTube": "البديل الكامل لموقع يوتيوب",
|
||||
"JavaScript license information": "معلومات ترخيص JavaScript",
|
||||
"Import and Export Data": "اِستيراد البيانات وتصديرها",
|
||||
"Import": "استيراد",
|
||||
"Import Invidious data": "استيراد بيانات انفيدياس",
|
||||
"Import YouTube subscriptions": "استيراد اشتراكات يوتيوب",
|
||||
"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",
|
||||
"Delete account?": "حذف الحساب؟",
|
||||
"History": "السِّجل",
|
||||
"An alternative front-end to YouTube": "واجهة أمامية بديلة لموقع يوتيوب",
|
||||
"JavaScript license information": "معلومات ترخيص جافا سكربت",
|
||||
"source": "المصدر",
|
||||
"Log in": "تسجيل الدخول",
|
||||
"Log in/register": "تسجيل الدخول\\إنشاء حساب",
|
||||
"Log in with Google": "تسجيل الدخول بإستخدام جوجل",
|
||||
"User ID": "إسم المستخدم",
|
||||
"Password": "الرقم السرى",
|
||||
"Time (h:mm:ss):": "(يجب ان يكتب مثل هذا التنسيق) الوقت (h(ساعات):mm(دقائق):ss(ثوانى)):",
|
||||
"Text CAPTCHA": "CAPTCHA كلامية",
|
||||
"Image CAPTCHA": "CAPTCHA صورية",
|
||||
"Log in/register": "تسجيل الدخول \\ إنشاء حساب",
|
||||
"Log in with Google": "تسجيل الدخول باستخدام جوجل",
|
||||
"User ID": "مُعرِّف المُستخدم",
|
||||
"Password": "كلمة المرور",
|
||||
"Time (h:mm:ss):": "الوقت (h:mm:ss):",
|
||||
"Text CAPTCHA": "نص الكابتشا",
|
||||
"Image CAPTCHA": "صورة الكابتشا",
|
||||
"Sign In": "تسجيل الدخول",
|
||||
"Register": "انشاء الحساب",
|
||||
"E-mail": "الإيميل",
|
||||
"Register": "التسجيل",
|
||||
"E-mail": "البريد الإلكتروني",
|
||||
"Google verification code": "رمز تحقق جوجل",
|
||||
"Preferences": "التفضيلات",
|
||||
"Player preferences": "التفضيلات المشغل",
|
||||
"Always loop: ": "كرر الفيديو دائما: ",
|
||||
"Autoplay: ": "تشغيل تلقائى: ",
|
||||
"Play next by default: ": "شغل الفيديو التالي تلقائيا: ",
|
||||
"Autoplay next video: ": "شغل الفيديو التالي تلقائيا (في قوائم التشغيل) ",
|
||||
"Listen by default: ": "تشغيل النسخة السمعية تلقائى: ",
|
||||
"Proxy videos: ": "عرض الفيديوهات عن طريق البروكسي؟ ",
|
||||
"Default speed: ": "السرعة الإفتراضية: ",
|
||||
"Preferred video quality: ": "الجودة المفضلة للفيديوهات: ",
|
||||
"Player volume: ": "صوت المشغل: ",
|
||||
"Default comments: ": "إضهار التعليقات الإفتراضية لـ: ",
|
||||
"Preferences": "الإعدادات",
|
||||
"preferences_category_player": "إعدادات المُشغِّل",
|
||||
"preferences_video_loop_label": "كرر المقطع المرئيّ دائما: ",
|
||||
"preferences_autoplay_label": "تشغيل تلقائي: ",
|
||||
"preferences_continue_label": "شغل المقطع التالي تلقائيًا: ",
|
||||
"preferences_continue_autoplay_label": "شغل المقطع التالي تلقائيًا: ",
|
||||
"preferences_listen_label": "تشغيل النسخة السمعية تلقائيًا: ",
|
||||
"preferences_local_label": "بروكسي المقاطع المرئيّة؟ ",
|
||||
"preferences_speed_label": "السرعة الافتراضية: ",
|
||||
"preferences_quality_label": "الجودة المفضلة للمقاطع: ",
|
||||
"preferences_volume_label": "صوت المشغل: ",
|
||||
"preferences_comments_label": "التعليقات الافتراضية: ",
|
||||
"youtube": "يوتيوب",
|
||||
"reddit": "Reddit",
|
||||
"Default captions: ": "الترجمات الإفتراضية: ",
|
||||
"Fallback captions: ": "الترجمات المصاحبة: ",
|
||||
"Show related videos: ": "اعرض الفيديوهات ذات الصلة: ",
|
||||
"Show annotations by default: ": "اعرض الملاحظات في الفيديو تلقائيا: ",
|
||||
"Visual preferences": "التفضيلات المرئية",
|
||||
"Player style: ": "شكل مشغل الفيديوهات: ",
|
||||
"Dark mode: ": "الوضع الليلى: ",
|
||||
"Theme: ": "المظهر: ",
|
||||
"reddit": "ريديت",
|
||||
"preferences_captions_label": "التسميات التوضيحية الإفتراضية: ",
|
||||
"Fallback captions: ": "التسميات التوضيحية الاحتياطيَّة: ",
|
||||
"preferences_related_videos_label": "اعرض الفيديوهات ذات الصلة: ",
|
||||
"preferences_annotations_label": "اعرض الملاحظات في الفيديو تلقائيا: ",
|
||||
"preferences_extend_desc_label": "توسيع وصف الفيديو تلقائيا: ",
|
||||
"preferences_vr_mode_label": "مقاطع فيديو تفاعلية ب درجة 360: ",
|
||||
"preferences_category_visual": "التفضيلات المرئية",
|
||||
"preferences_player_style_label": "شكل مشغل الفيديوهات: ",
|
||||
"Dark mode: ": "الوضع الليلي: ",
|
||||
"preferences_dark_mode_label": "المظهر: ",
|
||||
"dark": "غامق (اسود)",
|
||||
"light": "فاتح (ابيض)",
|
||||
"Thin mode: ": "الوضع الخفيف: ",
|
||||
"Subscription preferences": "تفضيلات الإشتراك",
|
||||
"Show annotations by default for subscribed channels: ": "عرض الملاحظات في الفيديوهات تلقائيا في القنوات المشترك بها فقط: ",
|
||||
"preferences_thin_mode_label": "الوضع الخفيف: ",
|
||||
"preferences_category_misc": "تفضيلات متنوعة",
|
||||
"preferences_automatic_instance_redirect_label": "إعادة توجيه المثيل التلقائي (إعادة التوجيه إلى redirect.invidious.io): ",
|
||||
"preferences_category_subscription": "تفضيلات الاشتراك",
|
||||
"preferences_annotations_subscribed_label": "عرض الملاحظات في الفيديوهات تلقائيا في القنوات المشترك بها فقط: ",
|
||||
"Redirect homepage to feed: ": "إعادة التوجية من الصفحة الرئيسية لصفحة المشتركين (لرؤية اخر فيديوهات المشتركين): ",
|
||||
"Number of videos shown in feed: ": "عدد الفيديوهات التى ستظهر فى صفحة المشتركين: ",
|
||||
"Sort videos by: ": "ترتيب الفيديو بـ: ",
|
||||
"published": "احدث فيديو",
|
||||
"published - reverse": "احدث فيديو - عكسى",
|
||||
"alphabetically": "ترتيب ابجدى",
|
||||
"alphabetically - reverse": "ابجدى - عكسى",
|
||||
"channel name": "بإسم القناة",
|
||||
"channel name - reverse": "بإسم القناة - عكسى",
|
||||
"Only show latest video from channel: ": "فقط إظهر اخر فيديو من القناة: ",
|
||||
"Only show latest unwatched video from channel: ": "فقط اظهر اخر فيديو لم يتم رؤيتة من القناة: ",
|
||||
"Only show unwatched: ": "فقط اظهر الذى لم يتم رؤيتة: ",
|
||||
"Only show notifications (if there are any): ": "إظهار الإشعارات فقط (إذا كان هناك أي): ",
|
||||
"preferences_max_results_label": "عدد الفيديوهات التى ستظهر فى صفحة المشتركين: ",
|
||||
"preferences_sort_label": "ترتيب الفيديوهات بـ: ",
|
||||
"published": "أحدث فيديو",
|
||||
"published - reverse": "أحدث فيديو - عكسي",
|
||||
"alphabetically": "ترتيب أبجدي",
|
||||
"alphabetically - reverse": "أبجدي - عكسي",
|
||||
"channel name": "باسم القناة",
|
||||
"channel name - reverse": "باسم القناة - عكسى",
|
||||
"Only show latest video from channel: ": "فقط أظهر آخر فيديو من القناة: ",
|
||||
"Only show latest unwatched video from channel: ": "فقط أظهر آخر فيديو لم يتم رؤيته من القناة: ",
|
||||
"preferences_unseen_only_label": "فقط أظهر الذي لم يتم رؤيته: ",
|
||||
"preferences_notifications_only_label": "إظهار الإشعارات فقط (إذا كان هناك أي): ",
|
||||
"Enable web notifications": "تفعيل إشعارات المتصفح",
|
||||
"`x` uploaded a video": "`x` رفع فيديو",
|
||||
"`x` is live": "`x` فى بث مباشر",
|
||||
"Data preferences": "إعدادات التفضيلات",
|
||||
"`x` is live": "`x` في بث مباشر",
|
||||
"preferences_category_data": "إعدادات التفضيلات",
|
||||
"Clear watch history": "حذف سجل المشاهدة",
|
||||
"Import/export data": "إضافة\\إستخراج البيانات",
|
||||
"Change password": "غير الرقم السرى",
|
||||
"Manage subscriptions": "إدارة المشتركين",
|
||||
"Import/export data": "إضافة\\استخراج البيانات",
|
||||
"Change password": "غير كلمة السر",
|
||||
"Manage subscriptions": "إدارة الاشتراكات",
|
||||
"Manage tokens": "إدارة الرموز",
|
||||
"Watch history": "سجل المشاهدة",
|
||||
"Delete account": "حذف الحساب",
|
||||
"Administrator preferences": "إعدادات المدير",
|
||||
"Default homepage: ": "الصفحة الرئيسية الافتراضية ",
|
||||
"Feed menu: ": "قائمة التدفقات: ",
|
||||
"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": "مدير الإشتراكات",
|
||||
"Save preferences": "حفظ الإعدادات",
|
||||
"Subscription manager": "مدير الاشتراكات",
|
||||
"Token manager": "إداره الرمز",
|
||||
"Token": "الرمز",
|
||||
"`x` subscriptions": "`x` مشتركين",
|
||||
"`x` tokens": "`x` رموز",
|
||||
"Import/export": "إضافة\\إستخراج",
|
||||
"unsubscribe": "إلغاء الإشتراك",
|
||||
"Import/export": "استيراد/تصدير",
|
||||
"unsubscribe": "إلغاء الاشتراك",
|
||||
"revoke": "مسح",
|
||||
"Subscriptions": "الإشتراكات",
|
||||
"`x` unseen notifications": "`x` إشعارات لم تشاهدها بعد",
|
||||
"Subscriptions": "الاشتراكات",
|
||||
"search": "بحث",
|
||||
"Log out": "تسجيل الخروج",
|
||||
"Released under the AGPLv3 by Omar Roth.": "تم الإنشاء تحت AGPLv3 بواسطة عمر روث.",
|
||||
"Released under the AGPLv3 on Github.": "صدر تحت AGPLv3 على Github.",
|
||||
"Source available here.": "الأكواد متوفرة هنا.",
|
||||
"View JavaScript license information.": "مشاهدة معلومات حول تراخيص الجافاسكريبت.",
|
||||
"View privacy policy.": "عرض سياسة الخصوصية.",
|
||||
@@ -132,79 +131,83 @@
|
||||
"Private": "خاص",
|
||||
"View all playlists": "عرض جميع قوائم التشغيل",
|
||||
"Updated `x` ago": "تم تحديثه منذ `x`",
|
||||
"Delete playlist `x`?": "حذف قائمه التشغيل `x` ?",
|
||||
"Delete playlist": "حذف قائمه التغشيل",
|
||||
"Create playlist": "إنشاء قائمه تشغيل",
|
||||
"Delete playlist `x`?": "حذف قائمة التشغيل `x`؟",
|
||||
"Delete playlist": "حذف قائمة التغشيل",
|
||||
"Create playlist": "إنشاء قائمة تشغيل",
|
||||
"Title": "العنوان",
|
||||
"Playlist privacy": "إعدادات الخصوصيه",
|
||||
"Editing playlist `x`": "تعديل قائمه التشفيل `x`",
|
||||
"Playlist privacy": "إعدادات الخصوصية",
|
||||
"Editing playlist `x`": "تعديل قائمة التشغيل `x`",
|
||||
"Show more": "إظهار المزيد",
|
||||
"Show less": "عرض اقل",
|
||||
"Watch on YouTube": "مشاهدة الفيديو على اليوتيوب",
|
||||
"Hide annotations": "إخفاء الملاحظات فى الفيديو",
|
||||
"Show annotations": "عرض الملاحظات فى الفيديو",
|
||||
"Switch Invidious Instance": "تبديل المثيل Invidious",
|
||||
"Broken? Try another Invidious Instance": "معطل؟ جرب مثيل Invidious آخر",
|
||||
"Hide annotations": "إخفاء الملاحظات في الفيديو",
|
||||
"Show annotations": "عرض الملاحظات في الفيديو",
|
||||
"Genre: ": "النوع: ",
|
||||
"License: ": "التراخيص: ",
|
||||
"Family friendly? ": "محتوى عائلى? ",
|
||||
"Family friendly? ": "محتوى عائلي؟ ",
|
||||
"Wilson score: ": "درجة ويلسون: ",
|
||||
"Engagement: ": "نسبة المشاركة (عدد المشاهدات\\عدد الإعجابات): ",
|
||||
"Engagement: ": "نسبة المشاركة: ",
|
||||
"Whitelisted regions: ": "الدول المسموح فيها هذا الفيديو: ",
|
||||
"Blacklisted regions: ": "الدول الحظور فيها هذا الفيديو: ",
|
||||
"Blacklisted regions: ": "الدول المحظور فيها هذا الفيديو: ",
|
||||
"Shared `x`": "شارك منذ `x`",
|
||||
"`x` views": "`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.": "اهلا! يبدو ان الجافاسكريبت معطلة. اضغط هنا لعرض التعليقات, ضع فى إعتبارك انها ستأخذ وقت اطول للعرض.",
|
||||
"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": "عرض تعليقات اليوتيوب",
|
||||
"View more comments on Reddit": "عرض المزيد من التعليقات على\\من موقع Reddit",
|
||||
"View `x` comments": "عرض `x` تعليقات",
|
||||
"View `x` comments": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "عرض `x` تعليقات",
|
||||
"": "عرض `x` تعليقات"
|
||||
},
|
||||
"View Reddit comments": "عرض تعليقات ريدإت Reddit",
|
||||
"Hide replies": "إخفاء الردود",
|
||||
"Show replies": "عرض الردود",
|
||||
"Incorrect password": "الرقم السرى غير صحيح",
|
||||
"Quota exceeded, try again in a few hours": "تم تجاوز عدد المرات المسموح بها, حاول مرة اخرى بعد عدة ساعات",
|
||||
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "غير قادر على تسجيل الدخول, تأكد من تشغيل المصادقة الثنائية 2FA.",
|
||||
"Incorrect password": "كلمة السر غير صحيحة",
|
||||
"Quota exceeded, try again in a few hours": "تم تجاوز عدد المرات المسموح بها، حاول مجددًا بعد بضع ساعات",
|
||||
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "غير قادر على تسجيل الدخول، تأكد من تشغيل المصادقة الثنائية 2FA.",
|
||||
"Invalid TFA code": "كود مصادقة ثنائية 2FA غير صحيح",
|
||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "لم يتم تسجيل الدخول. هذا ربما بسبب ان المصادقة الثنائية 2FA معطلة فى حسابك.",
|
||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "فشل تسجيل الدخول. قد يكون هذا بسبب أن المصادقة الثنائية 2FA معطلة في حسابك.",
|
||||
"Wrong answer": "إجابة خاطئة",
|
||||
"Erroneous CAPTCHA": "الكابتشا CAPTCHA غير صاحلة",
|
||||
"CAPTCHA is a required field": "مكان الكابتشا CAPTCHA مطلوب",
|
||||
"User ID is a required field": "مكان إسم المستخدم مطلوب",
|
||||
"Password is a required field": "مكان الرقم السرى مطلوب",
|
||||
"Wrong username or password": "إسم المستخدم او الرقم السرى غير صحيح",
|
||||
"User ID is a required field": "مكان اسم المستخدم مطلوب",
|
||||
"Password is a required field": "مكان كلمة السر مطلوب",
|
||||
"Wrong username or password": "اسم المستخدم او كلمة السر غير صحيح",
|
||||
"Please sign in using 'Log in with Google'": "الرجاء تسجيل الدخول 'تسجيل الدخول بواسطة جوجل'",
|
||||
"Password cannot be empty": "الرقم السرى لايمكن ان يكون فارغ",
|
||||
"Password cannot be longer than 55 characters": "الرقم السرى لا يتعدى 55 حرف",
|
||||
"Password cannot be empty": "لا يمكن أن تكون كلمة السر فارغة",
|
||||
"Password cannot be longer than 55 characters": "يجب أن لا تتعدى كلمة السر 55 حرفًا",
|
||||
"Please log in": "الرجاء تسجيل الدخول",
|
||||
"Invidious Private Feed for `x`": "صفحة Invidious للمشتركين الخاصة\\مخفية لـ `x`",
|
||||
"Invidious Private Feed for `x`": "تغذية Invidious خاصة ل 'x'",
|
||||
"channel:`x`": "قناة:`x`",
|
||||
"Deleted or invalid channel": "قناة ممسوحة او غير صالحة",
|
||||
"This channel does not exist.": "القناة غير موجودة.",
|
||||
"This channel does not exist.": "هذه القناة غير موجودة.",
|
||||
"Could not get channel info.": "لم يستطع الحصول على معلومات القناة.",
|
||||
"Could not fetch comments": "لم يتمكن من إحضار التعليقات",
|
||||
"View `x` replies": "عرض `x` ردود",
|
||||
"`x` ago": "`x` منذ",
|
||||
"Load more": "عرض المزيد",
|
||||
"`x` points": "`x` نقاط",
|
||||
"Could not create mix.": "لم يستطع عمل خلط.",
|
||||
"Empty playlist": "قائمة التشغيل فارغة",
|
||||
"Not a playlist.": "قائمة التشغيل غير صالحة.",
|
||||
"Playlist does not exist.": "قائمة التشغيل غير موجودة.",
|
||||
"Could not pull trending pages.": "لم يستطع عرض الصفحات الراجئة.",
|
||||
"Hidden field \"challenge\" is a required field": "مكان مخفى \"تحدى\" مكان مطلوب",
|
||||
"Hidden field \"token\" is a required field": "مكان مخفى \"رمز\" مكان مطلوب",
|
||||
"Erroneous challenge": "تحدى غير صالح",
|
||||
"Hidden field \"challenge\" is a required field": "مكان مخفي \"تحدي\" مكان مطلوب",
|
||||
"Hidden field \"token\" is a required field": "مكان مخفي \"رمز\" مكان مطلوب",
|
||||
"Erroneous challenge": "تحدي غير صالح",
|
||||
"Erroneous token": "روز غير صالح",
|
||||
"No such user": "مستخدم غير صالح",
|
||||
"Token is expired, please try again": "الرمز منتهى الصلاحية , الرجاء المحاولة مرة اخرى",
|
||||
"English": "إنجليزى",
|
||||
"English (auto-generated)": "إنجليزى (تم إنشائة تلقائى)",
|
||||
"Token is expired, please try again": "الرمز منتهى الصلاحية، الرجاء المحاولة مرة اخرى",
|
||||
"English": "إنجليزي",
|
||||
"English (auto-generated)": "إنجليزي (تم إنشائه تلقائيًا)",
|
||||
"Afrikaans": "الأفريكانية",
|
||||
"Albanian": "الألبانية",
|
||||
"Amharic": "الأمهرية",
|
||||
"Arabic": "العربية",
|
||||
"Armenian": "الأرميني",
|
||||
"Azerbaijani": "أذربيجان",
|
||||
"Armenian": "الأرمينية",
|
||||
"Azerbaijani": "أذربيجانية",
|
||||
"Bangla": "البنغالية",
|
||||
"Basque": "الباسكي",
|
||||
"Basque": "الباسكية",
|
||||
"Belarusian": "البيلاروسية",
|
||||
"Bosnian": "البوسنية",
|
||||
"Bulgarian": "البلغارية",
|
||||
@@ -301,19 +304,13 @@
|
||||
"Yiddish": "اليديشية",
|
||||
"Yoruba": "اليوروبا",
|
||||
"Zulu": "الزولو",
|
||||
"`x` years": "`x` سنوات",
|
||||
"`x` months": "`x` شهور",
|
||||
"`x` weeks": "`x` اسابيع",
|
||||
"`x` days": "`x` ايام",
|
||||
"`x` hours": "`x` ساعات",
|
||||
"`x` minutes": "`x` دقائق",
|
||||
"`x` seconds": "`x` ثوانى",
|
||||
"Fallback comments: ": "التعليقات البديلة: ",
|
||||
"Popular": "الأكثر شعبية",
|
||||
"Search": "بحث",
|
||||
"Top": "الأفضل",
|
||||
"About": "حول",
|
||||
"Rating: ": "التقييم: ",
|
||||
"Language: ": "اللغة: ",
|
||||
"preferences_locale_label": "اللغة: ",
|
||||
"View as playlist": "عرض كا قائمة التشغيل",
|
||||
"Default": "الكل",
|
||||
"Music": "الاغانى",
|
||||
@@ -321,16 +318,116 @@
|
||||
"News": "الأخبار",
|
||||
"Movies": "الأفلام",
|
||||
"Download": "نزّل",
|
||||
"Download as: ": "نزّله كـ: ",
|
||||
"Download as: ": "نزله كـ: ",
|
||||
"%A %B %-d, %Y": "%A %-d %B %Y",
|
||||
"(edited)": "(تم تعديلة)",
|
||||
"(edited)": "(معدّل)",
|
||||
"YouTube comment permalink": "رابط التعليق على اليوتيوب",
|
||||
"permalink": "الرابط",
|
||||
"`x` marked it with a ❤": "`x` اعجب بهذا",
|
||||
"Audio mode": "الوضع الصوتى",
|
||||
"`x` marked it with a ❤": "`x` أعجب بهذا",
|
||||
"Audio mode": "الوضع الصوتي",
|
||||
"Video mode": "وضع الفيديو",
|
||||
"Videos": "الفيديوهات",
|
||||
"Playlists": "قوائم التشغيل",
|
||||
"Community": "المجتمع",
|
||||
"Current version: ": "الإصدار الحالي: "
|
||||
"relevance": "ملاؤم",
|
||||
"rating": "تقييم",
|
||||
"date": "التاريخ",
|
||||
"views": "مشاهدات",
|
||||
"content_type": "نوع المحتوى",
|
||||
"duration": "المدة الزمنية",
|
||||
"features": "الميزات",
|
||||
"sort": "فرز",
|
||||
"hour": "ساعة",
|
||||
"today": "اليوم",
|
||||
"week": "هذا الأسبوع",
|
||||
"month": "هذا الشهر",
|
||||
"year": "هذه السنة",
|
||||
"video": "فيديو",
|
||||
"channel": "قناة",
|
||||
"playlist": "قائمة التشغيل",
|
||||
"movie": "فيلم",
|
||||
"show": "عرض",
|
||||
"hd": "عالية الدقة",
|
||||
"subtitles": "ترجمات",
|
||||
"creative_commons": "المشاع الإبداعي",
|
||||
"3d": "ثلاثي الأبعاد",
|
||||
"live": "مباشر",
|
||||
"4k": "4k",
|
||||
"location": "الأماكن",
|
||||
"hdr": "وضع التباين العالي",
|
||||
"filter": "معامل الفرز",
|
||||
"Current version: ": "الإصدار الحالي: ",
|
||||
"next_steps_error_message": "بعد ذلك يجب أن تحاول: ",
|
||||
"next_steps_error_message_refresh": "تحديث",
|
||||
"next_steps_error_message_go_to_youtube": "انتقل إلى يوتيوب",
|
||||
"short": "قصير (< 4 دقائق)",
|
||||
"long": "طويل (> 20 دقيقة)",
|
||||
"footer_source_code": "شفرة المصدر",
|
||||
"footer_original_source_code": "شفرة المصدر الأصلية",
|
||||
"footer_modfied_source_code": "شفرة المصدر المعدلة",
|
||||
"adminprefs_modified_source_code_url_label": "URL إلى مستودع التعليمات البرمجية المصدرية المعدلة",
|
||||
"footer_documentation": "التوثيق",
|
||||
"footer_donate_page": "تبرّع",
|
||||
"preferences_region_label": "بلد المحتوى: ",
|
||||
"preferences_quality_dash_label": "جودة فيديو DASH المفضلة: ",
|
||||
"preferences_quality_option_dash": "DASH (جودة تكييفية)",
|
||||
"preferences_quality_option_hd720": "HD720",
|
||||
"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",
|
||||
"purchased": "تم شراؤها",
|
||||
"none": "لاشيء",
|
||||
"videoinfo_started_streaming_x_ago": "بدأ البث منذ `x`",
|
||||
"videoinfo_watch_on_youTube": "مشاهدة على يوتيوب",
|
||||
"videoinfo_youTube_embed_link": "مضمن",
|
||||
"videoinfo_invidious_embed_link": "رابط مضمن",
|
||||
"user_created_playlists": "'x' إنشاء قوائم التشغيل",
|
||||
"user_saved_playlists": "قوائم التشغيل المحفوظة 'x'",
|
||||
"Video unavailable": "الفيديو غير متوفر",
|
||||
"360": "360°",
|
||||
"download_subtitles": "ترجمات - 'x' (.vtt)",
|
||||
"invidious": "الخيالي",
|
||||
"preferences_save_player_pos_label": "احفظ وقت الفيديو الحالي: ",
|
||||
"crash_page_you_found_a_bug": "يبدو أنك قد وجدت خطأً برمجيًّا في Invidious!",
|
||||
"generic_videos_count_0": "لا فيديوهات",
|
||||
"generic_videos_count_1": "فيديو واحد",
|
||||
"generic_videos_count_2": "فيديوهين",
|
||||
"generic_videos_count_3": "{{count}} فيديوهات",
|
||||
"generic_videos_count_4": "{{count}} فيديو",
|
||||
"generic_videos_count_5": "{{count}} فيديو",
|
||||
"generic_subscribers_count_0": "لا مشتركين",
|
||||
"generic_subscribers_count_1": "مشترك واحد",
|
||||
"generic_subscribers_count_2": "مشتركان",
|
||||
"generic_subscribers_count_3": "{{count}} مشتركين",
|
||||
"generic_subscribers_count_4": "{{count}} مشترك",
|
||||
"generic_subscribers_count_5": "{{count}} مشترك",
|
||||
"generic_views_count_0": "لا مشاهدات",
|
||||
"generic_views_count_1": "مشاهدة واحدة",
|
||||
"generic_views_count_2": "مشاهدتان",
|
||||
"generic_views_count_3": "{{count}} مشاهدات",
|
||||
"generic_views_count_4": "{{count}} مشاهدة",
|
||||
"generic_views_count_5": "{{count}} مشاهدة",
|
||||
"generic_subscriptions_count_0": "لا اشتراكات",
|
||||
"generic_subscriptions_count_1": "اشتراك واحد",
|
||||
"generic_subscriptions_count_2": "اشتراكان",
|
||||
"generic_subscriptions_count_3": "{{count}} اشتراكات",
|
||||
"generic_subscriptions_count_4": "{{count}} اشتراك",
|
||||
"generic_subscriptions_count_5": "{{count}} اشتراك",
|
||||
"generic_playlists_count_0": "لا قوائم تشغيل",
|
||||
"generic_playlists_count_1": "قائمة تشغيل واحدة",
|
||||
"generic_playlists_count_2": "قائمتا تشغيل",
|
||||
"generic_playlists_count_3": "{{count}} قوائم تشغيل",
|
||||
"generic_playlists_count_4": "{{count}} قائمة تشغيل",
|
||||
"generic_playlists_count_5": "{{count}} قائمة تشغيل"
|
||||
}
|
||||
|
||||
61
locales/bn_BD.json
Normal file
61
locales/bn_BD.json
Normal file
@@ -0,0 +1,61 @@
|
||||
{
|
||||
"LIVE": "লাইভ",
|
||||
"Shared `x` ago": "`x` আগে শেয়ার করা হয়েছে",
|
||||
"Unsubscribe": "আনসাবস্ক্রাইব",
|
||||
"Subscribe": "সাবস্ক্রাইব",
|
||||
"View channel on YouTube": "ইউটিউবে চ্যানেল দেখুন",
|
||||
"View playlist on YouTube": "ইউটিউবে প্লেলিস্ট দেখুন",
|
||||
"newest": "সর্ব-নতুন",
|
||||
"oldest": "পুরানতম",
|
||||
"popular": "জনপ্রিয়",
|
||||
"last": "শেষটা",
|
||||
"Next page": "পরের পৃষ্ঠা",
|
||||
"Previous page": "আগের পৃষ্ঠা",
|
||||
"Clear watch history?": "দেখার ইতিহাস সাফ করবেন?",
|
||||
"New password": "নতুন পাসওয়ার্ড",
|
||||
"New passwords must match": "নতুন পাসওয়ার্ড অবশ্যই মিলতে হবে",
|
||||
"Cannot change password for Google accounts": "গুগল অ্যাকাউন্টগুলোর জন্য পাসওয়ার্ড পরিবর্তন করা যায় না",
|
||||
"Authorize token?": "টোকেন অনুমোদন করবেন?",
|
||||
"Authorize token for `x`?": "`x` -এর জন্য টোকেন অনুমোদন?",
|
||||
"Yes": "হ্যাঁ",
|
||||
"No": "না",
|
||||
"Import and Export Data": "তথ্য আমদানি ও রপ্তানি",
|
||||
"Import": "আমদানি",
|
||||
"Import Invidious data": "ইনভিডিয়াস তথ্য আমদানি",
|
||||
"Import YouTube subscriptions": "ইউটিউব সাবস্ক্রিপশন আনুন",
|
||||
"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 হিসাবে তথ্য বের করুন",
|
||||
"Delete account?": "অ্যাকাউন্ট মুছে ফেলবেন?",
|
||||
"History": "ইতিহাস",
|
||||
"An alternative front-end to YouTube": "ইউটিউবের একটি বিকল্পস্বরূপ সম্মুখ-প্রান্ত",
|
||||
"JavaScript license information": "জাভাস্ক্রিপ্ট লাইসেন্সের তথ্য",
|
||||
"source": "সূত্র",
|
||||
"Log in": "লগ ইন",
|
||||
"Log in/register": "লগ ইন/রেজিস্টার",
|
||||
"Log in with Google": "গুগল দিয়ে লগ ইন করুন",
|
||||
"User ID": "ইউজার আইডি",
|
||||
"Password": "পাসওয়ার্ড",
|
||||
"Time (h:mm:ss):": "সময় (ঘণ্টা:মিনিট:সেকেন্ড):",
|
||||
"Text CAPTCHA": "টেক্সট ক্যাপচা",
|
||||
"Image CAPTCHA": "চিত্র ক্যাপচা",
|
||||
"Sign In": "সাইন ইন",
|
||||
"Register": "নিবন্ধন",
|
||||
"E-mail": "ই-মেইল",
|
||||
"Google verification code": "গুগল যাচাইকরণ কোড",
|
||||
"Preferences": "পছন্দসমূহ",
|
||||
"preferences_category_player": "প্লেয়ারের পছন্দসমূহ",
|
||||
"preferences_video_loop_label": "সর্বদা লুপ: ",
|
||||
"preferences_autoplay_label": "স্বয়ংক্রিয় চালু: ",
|
||||
"preferences_continue_label": "ডিফল্টভাবে পরবর্তী চালাও: ",
|
||||
"preferences_continue_autoplay_label": "পরবর্তী ভিডিও স্বয়ংক্রিয়ভাবে চালাও: ",
|
||||
"preferences_listen_label": "সহজাতভাবে শোনো: ",
|
||||
"preferences_local_label": "ভিডিও প্রক্সি করো: ",
|
||||
"preferences_speed_label": "সহজাত গতি: ",
|
||||
"preferences_quality_label": "পছন্দের ভিডিও মান: ",
|
||||
"preferences_volume_label": "প্লেয়ার শব্দের মাত্রা: "
|
||||
}
|
||||
103
locales/ca.json
Normal file
103
locales/ca.json
Normal file
@@ -0,0 +1,103 @@
|
||||
{
|
||||
"oldest": "més antic",
|
||||
"Yes": "Sí",
|
||||
"preferences_quality_label": "Qualitat de vídeo preferida: ",
|
||||
"newest": "més nou",
|
||||
"No": "No",
|
||||
"Google verification code": "Codi de verificació de Google",
|
||||
"User ID": "ID d'usuari",
|
||||
"Preferences": "Preferències",
|
||||
"Dark mode: ": "Mode fosc: ",
|
||||
"dark": "fosc",
|
||||
"light": "clar",
|
||||
"published": "publicat",
|
||||
"published - reverse": "publicat - invers",
|
||||
"alphabetically": "alfabèticament",
|
||||
"alphabetically - reverse": "alfabèticament - invers",
|
||||
"channel name - reverse": "nom del canal - invers",
|
||||
"preferences_category_data": "Preferències de dades",
|
||||
"Delete account": "Elimina compte",
|
||||
"Save preferences": "Guarda preferències",
|
||||
"Private": "Privat",
|
||||
"Show more": "Mostra'n més",
|
||||
"Show less": "Mostra'n menys",
|
||||
"Hide replies": "Amaga respostes",
|
||||
"Arabic": "Àrab",
|
||||
"Armenian": "Armeni",
|
||||
"Basque": "Basc",
|
||||
"Filipino": "Filipí",
|
||||
"Finnish": "Finès",
|
||||
"German": "Alemany",
|
||||
"Greek": "Grec",
|
||||
"Hungarian": "Hongarès",
|
||||
"Icelandic": "Islandès",
|
||||
"Italian": "Italià",
|
||||
"Japanese": "Japonès",
|
||||
"Korean": "Coreà",
|
||||
"Kurdish": "Kurd",
|
||||
"Lithuanian": "Lituà",
|
||||
"Luxembourgish": "Luxemburguès",
|
||||
"Macedonian": "Macedoni",
|
||||
"Polish": "Polonès",
|
||||
"Portuguese": "Portuguès",
|
||||
"Romanian": "Romanès",
|
||||
"Russian": "Rus",
|
||||
"Serbian": "Serbi",
|
||||
"Spanish (Latin America)": "Castellà (Amèrica llatina)",
|
||||
"Turkish": "Turc",
|
||||
"Ukrainian": "Ucraïnès",
|
||||
"preferences_locale_label": "Idioma: ",
|
||||
"Gaming": "Jocs",
|
||||
"Movies": "Películes",
|
||||
"Download": "Descarrega",
|
||||
"Download as: ": "Descarrega com: ",
|
||||
"Videos": "Vídeos",
|
||||
"content_type": "Tipus",
|
||||
"duration": "Duració",
|
||||
"sort": "Ordena per",
|
||||
"week": "Aquesta setmana",
|
||||
"month": "Aquest mes",
|
||||
"year": "Aquest any",
|
||||
"video": "Vídeo",
|
||||
"channel": "Canal",
|
||||
"short": "Curt (< 4 minuts)",
|
||||
"long": "Llarg (> 20 minuts)",
|
||||
"Current version: ": "Versió actual: ",
|
||||
"Malay": "Malai",
|
||||
"Persian": "Persa",
|
||||
"Slovak": "Eslovac",
|
||||
"Search": "Busca",
|
||||
"Show annotations": "Mostra anotacions",
|
||||
"preferences_region_label": "País del contingut: ",
|
||||
"preferences_sort_label": "Ordena vídeos per: ",
|
||||
"Import/export": "Importa/exporta",
|
||||
"channel name": "nom del canal",
|
||||
"Title": "Títol",
|
||||
"Belarusian": "Bielorús",
|
||||
"Enable web notifications": "Activa notificacions web",
|
||||
"search": "busca",
|
||||
"Catalan": "Català",
|
||||
"Croatian": "Croat",
|
||||
"preferences_category_admin": "Preferències d'administrador",
|
||||
"Hide annotations": "Amaga anotacions",
|
||||
"Show replies": "Mostra respostes",
|
||||
"Bulgarian": "Búlgar",
|
||||
"Albanian": "Albanès",
|
||||
"French": "Francès",
|
||||
"Irish": "Irlandès",
|
||||
"Maltese": "Maltès",
|
||||
"Danish": "Danès",
|
||||
"Galician": "Gallec",
|
||||
"Hebrew": "Hebreu",
|
||||
"Indonesian": "Indonesi",
|
||||
"Spanish": "Castellà",
|
||||
"Vietnamese": "Vietnamita",
|
||||
"News": "Notícies",
|
||||
"show": "Mostra",
|
||||
"footer_documentation": "Documentació",
|
||||
"Thai": "Tailandès",
|
||||
"Music": "Música",
|
||||
"relevance": "Rellevància",
|
||||
"hour": "Última hora",
|
||||
"today": "Avui"
|
||||
}
|
||||
288
locales/cs.json
Normal file
288
locales/cs.json
Normal file
@@ -0,0 +1,288 @@
|
||||
{
|
||||
"LIVE": "ŽIVĚ",
|
||||
"Shared `x` ago": "Sdíleno před `x`",
|
||||
"Unsubscribe": "Odhlásit odběr",
|
||||
"Subscribe": "Odebírat",
|
||||
"View channel on YouTube": "Otevřít kanál na YouTube",
|
||||
"View playlist on YouTube": "Zobrazit playlist na YouTube",
|
||||
"newest": "nejnovější",
|
||||
"oldest": "nejstarší",
|
||||
"popular": "populární",
|
||||
"last": "poslední",
|
||||
"Next page": "Další strana",
|
||||
"Previous page": "Předchozí strana",
|
||||
"Clear watch history?": "Smazat historii?",
|
||||
"New password": "Nové heslo",
|
||||
"New passwords must match": "Hesla se musí schodovat",
|
||||
"Cannot change password for Google accounts": "Nelze změnit heslo pro účty Google",
|
||||
"Authorize token?": "Autorizovat token?",
|
||||
"Authorize token for `x`?": "Autorizovat token pro `x`?",
|
||||
"Yes": "Ano",
|
||||
"No": "Ne",
|
||||
"Import and Export Data": "Import a Export údajů",
|
||||
"Import": "Inport",
|
||||
"Import Invidious data": "Importovat údaje Invidious",
|
||||
"Import YouTube subscriptions": "Importovat odběry z YouTube",
|
||||
"Import FreeTube subscriptions (.db)": "Importovat odběry z FreeTube (.db)",
|
||||
"Import NewPipe subscriptions (.json)": "Importovat odběry z NewPipe (.json)",
|
||||
"Import NewPipe data (.zip)": "Importovat údeje z NewPipe (.zip)",
|
||||
"Export": "Exportovat",
|
||||
"Export subscriptions as OPML": "Exportovat odběry jako OPML",
|
||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportovat údaje jako OPML (na NewPipe a FreeTube)",
|
||||
"Export data as JSON": "Exportovat data jako JSON",
|
||||
"Delete account?": "Smazat účet?",
|
||||
"History": "Historie",
|
||||
"An alternative front-end to YouTube": "Alternativní front-end pro YouTube",
|
||||
"JavaScript license information": "Informace o licenci JavaScript",
|
||||
"source": "zdrojový kód",
|
||||
"Log in": "Přihlásit se",
|
||||
"Log in/register": "Přihlásit se/vytvořit účet",
|
||||
"Log in with Google": "Přihlásit se s Googlem",
|
||||
"User ID": "Uživatelské IČ",
|
||||
"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",
|
||||
"Google verification code": "Verifikační číslo Google",
|
||||
"Preferences": "Nastavení",
|
||||
"preferences_category_player": "Nastavení přehravače",
|
||||
"preferences_video_loop_label": "Vždy opakovat: ",
|
||||
"preferences_autoplay_label": "Automatické přehrávání: ",
|
||||
"preferences_continue_label": "Přehrát další ve výchozím stavu: ",
|
||||
"preferences_continue_autoplay_label": "Automaticky přehrát další video: ",
|
||||
"preferences_listen_label": "Poslouchat ve výchozím nastavení: ",
|
||||
"preferences_local_label": "Video přes proxy: ",
|
||||
"preferences_speed_label": "Základní Rychlost: ",
|
||||
"preferences_quality_label": "Preferovaná kvalita videa: ",
|
||||
"preferences_volume_label": "Hlasitost přehrávače: ",
|
||||
"preferences_comments_label": "Předpřipravené komentáře: ",
|
||||
"youtube": "YouTube",
|
||||
"reddit": "reddit",
|
||||
"preferences_captions_label": "Standartní Titulky: ",
|
||||
"Fallback captions: ": "Záložní titulky: ",
|
||||
"preferences_related_videos_label": "Zobrazit podobné videa: ",
|
||||
"preferences_annotations_label": "Zobrazovat poznámky ve výchozím nastavení: ",
|
||||
"preferences_extend_desc_label": "Rozšířit automaticky popis u videa: ",
|
||||
"preferences_category_visual": "Nastavení vzhledu",
|
||||
"preferences_player_style_label": "Styl přehrávače ",
|
||||
"Dark mode: ": "Tmavý režim ",
|
||||
"preferences_dark_mode_label": "Vzhled: ",
|
||||
"dark": "tmavý",
|
||||
"light": "světlý",
|
||||
"preferences_thin_mode_label": "Kompaktní režim: ",
|
||||
"preferences_category_subscription": "Nastavení předplatných",
|
||||
"preferences_annotations_subscribed_label": "Ve výchozím nastavení zobrazovat poznámky u odebíraných kanálů: ",
|
||||
"Redirect homepage to feed: ": "Přesměrovávat domovskou stránku na informační kanál: ",
|
||||
"preferences_max_results_label": "Počet videí zobrazovaných v informačním kanále: ",
|
||||
"preferences_sort_label": "Roztřídit videa podle: ",
|
||||
"published": "publikováno",
|
||||
"published - reverse": "podle publikování - obrátit",
|
||||
"alphabetically": "podle abecedy",
|
||||
"alphabetically - reverse": "podle abecedy - převrátit",
|
||||
"channel name": "název kanálu",
|
||||
"channel name - reverse": "podle jména kanálu - převrátit",
|
||||
"Only show latest video from channel: ": "Jenom zobrazit nejnovjejší video z kanálu: ",
|
||||
"Only show latest unwatched video from channel: ": "Zobrazit jen nejnovější nezhlédnuté video z daného kanálu: ",
|
||||
"preferences_unseen_only_label": "Zobrazit jen již nezhlédnuté: ",
|
||||
"preferences_notifications_only_label": "Zobrazit pouze upozornění (pokud nějaká jsou): ",
|
||||
"Enable web notifications": "Povolit webové upozornění",
|
||||
"`x` uploaded a video": "`x` nahrál(a) video",
|
||||
"`x` is live": "`x` je živě",
|
||||
"preferences_category_data": "Nastavení dat",
|
||||
"Clear watch history": "Smazat historii",
|
||||
"Import/export data": "importovat/exportovat data",
|
||||
"Change password": "Změnit heslo",
|
||||
"Manage subscriptions": "Spravovat odebírané kanály",
|
||||
"Manage tokens": "Spravovat klíče",
|
||||
"Watch history": "Historie Sledování",
|
||||
"Delete account": "Smazat Účet",
|
||||
"preferences_category_admin": "Administrátorská nastavení",
|
||||
"preferences_default_home_label": "Základní domovská stránka: ",
|
||||
"preferences_feed_menu_label": "Menu doporučených: ",
|
||||
"CAPTCHA enabled: ": "CAPTCHA povolen: ",
|
||||
"Login enabled: ": "Přihlášení povoleno: ",
|
||||
"Registration enabled: ": "Registrace povolena ",
|
||||
"Report statistics: ": "Oznámit statistiky: ",
|
||||
"Save preferences": "Uložit nastavení",
|
||||
"Subscription manager": "Správa Odběrů",
|
||||
"Token manager": "Správa klíčů",
|
||||
"Token": "Klíč",
|
||||
"Import/export": "Importovat/exportovat",
|
||||
"unsubscribe": "odhlásit odběr",
|
||||
"revoke": "vrátit zpět",
|
||||
"Subscriptions": "Odběry",
|
||||
"search": "hledat",
|
||||
"Log out": "Odhlásit se",
|
||||
"Source available here.": "Zdrojový kód dostupný zde.",
|
||||
"View JavaScript license information.": "Zobrazit informace o licenci JavaScript .",
|
||||
"View privacy policy.": "Zobrazit Zásady ochrany osobních údajů.",
|
||||
"Trending": "Trendy",
|
||||
"Public": "Veřejné",
|
||||
"Unlisted": "Nevypsáno",
|
||||
"Private": "Soukromé",
|
||||
"View all playlists": "Zobrazit všechny playlisty",
|
||||
"Updated `x` ago": "Aktualizováno před `x`",
|
||||
"Delete playlist `x`?": "Smazat playlist `x`?",
|
||||
"Delete playlist": "Smazat playlist",
|
||||
"Create playlist": "Vytvořit playlist",
|
||||
"Title": "Název",
|
||||
"Editing playlist `x`": "Upravování playlistu `x`",
|
||||
"Show more": "Zobrazit více",
|
||||
"Show less": "Zobrazit méně",
|
||||
"Watch on YouTube": "Sledovat na YouTube",
|
||||
"Hide annotations": "Skrýt vysvětlivky",
|
||||
"Show annotations": "Zobrazit vysvětlivky",
|
||||
"Genre: ": "Žánr: ",
|
||||
"License: ": "Licence: ",
|
||||
"Family friendly? ": "Vhodné pro děti? ",
|
||||
"Engagement: ": "Závaznost: ",
|
||||
"English": "Angličtina",
|
||||
"English (auto-generated)": "Angličtina (automaticky generováno)",
|
||||
"Afrikaans": "Afrikánština",
|
||||
"Albanian": "Albánština",
|
||||
"Amharic": "Amharština",
|
||||
"Arabic": "Arabština",
|
||||
"Armenian": "Arménština",
|
||||
"Azerbaijani": "Azerbajdžánština",
|
||||
"Bangla": "Bengálština",
|
||||
"Basque": "Baskičtina",
|
||||
"Belarusian": "Běloruština",
|
||||
"Bosnian": "Bosenština",
|
||||
"Bulgarian": "Bulharština",
|
||||
"Burmese": "Barmština",
|
||||
"Catalan": "Katalánština",
|
||||
"Cebuano": "Cebuánština",
|
||||
"Chinese (Simplified)": "Čínština (zjednodušená)",
|
||||
"Chinese (Traditional)": "Čínština (tradiční)",
|
||||
"Corsican": "Korsičtina",
|
||||
"Croatian": "Chorvatština",
|
||||
"Czech": "Čeština",
|
||||
"Danish": "Dánština",
|
||||
"Dutch": "Nizozemština",
|
||||
"Esperanto": "Esperanto",
|
||||
"Estonian": "Estonština",
|
||||
"Filipino": "Filipínština",
|
||||
"Finnish": "Finština",
|
||||
"French": "Francouzština",
|
||||
"Galician": "Galicijština",
|
||||
"Georgian": "Gruzínština",
|
||||
"German": "Němčina",
|
||||
"Greek": "Řečtina",
|
||||
"Gujarati": "Gudžarátština",
|
||||
"Haitian Creole": "Haitská kreolština",
|
||||
"Hausa": "Hauština",
|
||||
"Hawaiian": "Havajština",
|
||||
"Hebrew": "Hebrejština",
|
||||
"Hindi": "Hindština",
|
||||
"Hmong": "Hmongština",
|
||||
"Hungarian": "Maďarština",
|
||||
"Icelandic": "Islandština",
|
||||
"Igbo": "Igboština",
|
||||
"Indonesian": "Indonéština",
|
||||
"Irish": "Irština",
|
||||
"Italian": "Italština",
|
||||
"Japanese": "Japonština",
|
||||
"Javanese": "Javánština",
|
||||
"Kannada": "Kannadština",
|
||||
"Kazakh": "Kazaština",
|
||||
"Khmer": "Khmerština",
|
||||
"Korean": "Korejština",
|
||||
"Kurdish": "Kurdština",
|
||||
"Kyrgyz": "Kyrgyzština",
|
||||
"Lao": "Laoština",
|
||||
"Latin": "Latina",
|
||||
"Latvian": "Lotyština",
|
||||
"Lithuanian": "Litevština",
|
||||
"Luxembourgish": "Lucemburština",
|
||||
"Macedonian": "Makedonština",
|
||||
"Malagasy": "Malgaština",
|
||||
"Malay": "Malajština",
|
||||
"Malayalam": "Malajálamština",
|
||||
"Maltese": "Maltština",
|
||||
"Maori": "Maorština",
|
||||
"Marathi": "Maráthština",
|
||||
"Mongolian": "Mongolština",
|
||||
"Nepali": "Nepálština",
|
||||
"Norwegian Bokmål": "Norština Bokmål",
|
||||
"Nyanja": "Čičevština",
|
||||
"Pashto": "Paštština",
|
||||
"Persian": "Perština",
|
||||
"Polish": "Polština",
|
||||
"Portuguese": "Portugalština",
|
||||
"Punjabi": "Paňdžábština",
|
||||
"Romanian": "Rumunština",
|
||||
"Russian": "Ruština",
|
||||
"Samoan": "Samojština",
|
||||
"Scottish Gaelic": "Skotská gaelština",
|
||||
"Serbian": "Srbština",
|
||||
"Shona": "Shona",
|
||||
"Sindhi": "Sindhština",
|
||||
"Sinhala": "Sinhálština",
|
||||
"Slovak": "Slovenština",
|
||||
"Slovenian": "Slovinština",
|
||||
"Somali": "Somálština",
|
||||
"Southern Sotho": "Sesothština",
|
||||
"Spanish": "Španělština",
|
||||
"Spanish (Latin America)": "Španělština (Latinská Amerika)",
|
||||
"Sundanese": "Sundština",
|
||||
"Swahili": "Svahilština",
|
||||
"Swedish": "Švédština",
|
||||
"Tajik": "Tádžičtina",
|
||||
"Tamil": "Tamilština",
|
||||
"Telugu": "Telugština",
|
||||
"Thai": "Thajština",
|
||||
"Turkish": "Turečtina",
|
||||
"Ukrainian": "Ukrajinština",
|
||||
"Urdu": "Urdština",
|
||||
"Uzbek": "Uzbečtina",
|
||||
"Vietnamese": "Vietnamština",
|
||||
"Welsh": "Velština",
|
||||
"Western Frisian": "Západofríština",
|
||||
"Xhosa": "Xhoština",
|
||||
"Yiddish": "Jidiš",
|
||||
"Yoruba": "Jorubština",
|
||||
"Zulu": "Zuluština",
|
||||
"Popular": "Populární",
|
||||
"About": "Informace",
|
||||
"Rating: ": "Hodnocení: ",
|
||||
"preferences_locale_label": "Jazyk: ",
|
||||
"Default": "Výchozí",
|
||||
"Music": "Hudba",
|
||||
"Gaming": "Hry",
|
||||
"News": "Zprávy",
|
||||
"Movies": "Filmy",
|
||||
"Download": "Stáhnout",
|
||||
"Download as: ": "Stáhnout jako: ",
|
||||
"(edited)": "(upraveno)",
|
||||
"`x` marked it with a ❤": "`x` to označil(a) se ❤",
|
||||
"Audio mode": "Audiový režim",
|
||||
"Video mode": "Videový režim",
|
||||
"Videos": "Videa",
|
||||
"Community": "Komunita",
|
||||
"rating": "hodnocení",
|
||||
"date": "datum",
|
||||
"views": "zhlédnutí",
|
||||
"duration": "délka",
|
||||
"hour": "hodina",
|
||||
"today": "dnes",
|
||||
"week": "týden",
|
||||
"month": "měsíc",
|
||||
"year": "rok",
|
||||
"video": "video",
|
||||
"channel": "kanál",
|
||||
"playlist": "playlist",
|
||||
"movie": "film",
|
||||
"show": "zobrazit",
|
||||
"hd": "HD",
|
||||
"subtitles": "titulky",
|
||||
"creative_commons": "Creative Commons",
|
||||
"3d": "3D",
|
||||
"live": "živě",
|
||||
"4k": "4k",
|
||||
"location": "umístění",
|
||||
"hdr": "HDR",
|
||||
"filter": "filtr"
|
||||
}
|
||||
402
locales/da.json
Normal file
402
locales/da.json
Normal file
@@ -0,0 +1,402 @@
|
||||
{
|
||||
"LIVE": "LIVE",
|
||||
"Shared `x` ago": "Delt for `x` siden",
|
||||
"Unsubscribe": "Opsig abonnement",
|
||||
"Subscribe": "Abonner",
|
||||
"View channel on YouTube": "Vis kanal på YouTube",
|
||||
"View playlist on YouTube": "Vis afspilningsliste på YouTube",
|
||||
"newest": "nyeste",
|
||||
"oldest": "ældste",
|
||||
"popular": "populært",
|
||||
"last": "sidste",
|
||||
"Next page": "Næste side",
|
||||
"Previous page": "Forrige side",
|
||||
"Clear watch history?": "Ryd afspilningshistorik?",
|
||||
"New password": "Nyt kodeord",
|
||||
"New passwords must match": "Nye kodeord skal matche",
|
||||
"Cannot change password for Google accounts": "Kan ikke skifte kodeord til Google-konti",
|
||||
"Authorize token?": "Godkend token?",
|
||||
"Authorize token for `x`?": "Godkend token til `x`?",
|
||||
"Yes": "Ja",
|
||||
"No": "Nej",
|
||||
"Import and Export Data": "Importer og Eksporter Data",
|
||||
"Import": "Importer",
|
||||
"Import Invidious data": "Importer Invidious data",
|
||||
"Import YouTube subscriptions": "Importer YouTube abonnementer",
|
||||
"Import FreeTube subscriptions (.db)": "Importer FreeTube abonnementer (.db)",
|
||||
"Import NewPipe subscriptions (.json)": "Importer NewPipe abonnementer (.json)",
|
||||
"Import NewPipe data (.zip)": "Importer NewPipe data (.zip)",
|
||||
"Export": "Exporter",
|
||||
"Export subscriptions as OPML": "Exporter abonnementer som OPML",
|
||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exporter abonnementer som OPML (til NewPipe & FreeTube)",
|
||||
"Export data as JSON": "Exporter data som JSON",
|
||||
"Delete account?": "Slet konto?",
|
||||
"History": "Historik",
|
||||
"An alternative front-end to YouTube": "Et alternativt front-end til YouTube",
|
||||
"JavaScript license information": "JavaScript licens information",
|
||||
"source": "kilde",
|
||||
"Log in": "Log på",
|
||||
"Log in/register": "Log på/registrer",
|
||||
"Log in with Google": "Log på med Google",
|
||||
"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",
|
||||
"Google verification code": "Google-verifikationskode",
|
||||
"Preferences": "Præferencer",
|
||||
"preferences_category_player": "Afspillerindstillinger",
|
||||
"preferences_video_loop_label": "Altid gentag: ",
|
||||
"preferences_autoplay_label": "Auto afspil: ",
|
||||
"preferences_continue_label": "Afspil næste som standard: ",
|
||||
"preferences_continue_autoplay_label": "Auto afspil næste video: ",
|
||||
"preferences_listen_label": "Lyt som standard: ",
|
||||
"preferences_local_label": "Proxy videoer: ",
|
||||
"preferences_speed_label": "Standard hastighed: ",
|
||||
"preferences_quality_label": "Foretrukken video kvalitet: ",
|
||||
"preferences_volume_label": "Lydstyrke: ",
|
||||
"preferences_comments_label": "Standard kommentarer: ",
|
||||
"youtube": "YouTube",
|
||||
"reddit": "Reddit",
|
||||
"preferences_captions_label": "Standard undertekster: ",
|
||||
"Fallback captions: ": "Alternative undertekster: ",
|
||||
"preferences_related_videos_label": "Vis relaterede videoer: ",
|
||||
"preferences_annotations_label": "Vis annotationer som standard: ",
|
||||
"preferences_extend_desc_label": "Automatisk udvid videoens beskrivelse: ",
|
||||
"preferences_vr_mode_label": "Interaktiv 360 graders videoer: ",
|
||||
"preferences_category_visual": "Visuelle præferencer",
|
||||
"preferences_player_style_label": "Afspiller stil: ",
|
||||
"Dark mode: ": "Mørk tilstand: ",
|
||||
"preferences_dark_mode_label": "Tema: ",
|
||||
"dark": "mørk",
|
||||
"light": "lys",
|
||||
"preferences_thin_mode_label": "Tynd tilstand: ",
|
||||
"preferences_category_subscription": "Abonnements præferencer",
|
||||
"preferences_annotations_subscribed_label": "Vis annotationer som standard for abonnerede kanaler: ",
|
||||
"Redirect homepage to feed: ": "Omdiriger startside til feed: ",
|
||||
"preferences_max_results_label": "Antal videoer vist i feed: ",
|
||||
"preferences_sort_label": "Sorter videoer efter: ",
|
||||
"published": "offentliggjort",
|
||||
"published - reverse": "offentliggjort - omvendt",
|
||||
"alphabetically": "alfabetisk",
|
||||
"alphabetically - reverse": "alfabetisk - omvendt",
|
||||
"channel name": "kanalnavn",
|
||||
"channel name - reverse": "kanalnavn - omvendt",
|
||||
"Only show latest video from channel: ": "Vis kun seneste video fra kanal: ",
|
||||
"Only show latest unwatched video from channel: ": "Vis kun seneste usete video fra kanal: ",
|
||||
"preferences_unseen_only_label": "Vis kun usete: ",
|
||||
"preferences_notifications_only_label": "Vis kun notifikationer (hvis der er nogle): ",
|
||||
"Enable web notifications": "Aktiver webnotifikationer",
|
||||
"`x` uploaded a video": "`x` uploadede en video",
|
||||
"`x` is live": "`x` er live",
|
||||
"preferences_category_data": "Data præferencer",
|
||||
"Clear watch history": "Ryd afspilningshistorik",
|
||||
"Import/export data": "Importer/exporter data",
|
||||
"Change password": "Skift adgangskode",
|
||||
"Manage subscriptions": "Administrer abonnementer",
|
||||
"Manage tokens": "Administrer tokens",
|
||||
"Watch history": "Afspilningshistorik",
|
||||
"Delete account": "Slet konto",
|
||||
"preferences_category_admin": "Administrator præferencer",
|
||||
"preferences_default_home_label": "Standard startside: ",
|
||||
"preferences_feed_menu_label": "Feed menu: ",
|
||||
"Top enabled: ": "Top aktiveret: ",
|
||||
"CAPTCHA enabled: ": "CAPTCHA aktiveret: ",
|
||||
"Login enabled: ": "Login aktiveret: ",
|
||||
"Registration enabled: ": "Registrering aktiveret: ",
|
||||
"Report statistics: ": "Indsend statistik: ",
|
||||
"Save preferences": "Gem præferencer",
|
||||
"Subscription manager": "Abonnementsmanager",
|
||||
"Token manager": "Tokenmanager",
|
||||
"Token": "Token",
|
||||
"Import/export": "Importer/eksporter",
|
||||
"unsubscribe": "opsig abonnement",
|
||||
"revoke": "tilbagekald",
|
||||
"Subscriptions": "Abonnementer",
|
||||
"search": "søg",
|
||||
"Log out": "Log ud",
|
||||
"Source available here.": "Kilde tilgængelig her.",
|
||||
"View JavaScript license information.": "Vis JavaScriptlicensinformation.",
|
||||
"View privacy policy.": "Vis privatpolitik.",
|
||||
"Trending": "Trending",
|
||||
"Public": "Offentlig",
|
||||
"Unlisted": "Skjult",
|
||||
"Private": "Privat",
|
||||
"View all playlists": "Vis alle afspilningslister",
|
||||
"Updated `x` ago": "Opdateret for `x` siden",
|
||||
"Delete playlist `x`?": "Fjern spilleliste `x`?",
|
||||
"Delete playlist": "Slet afspilningsliste",
|
||||
"Create playlist": "Opret afspilningsliste",
|
||||
"Title": "Titel",
|
||||
"Playlist privacy": "Privatlivsindstillinger for afspilningsliste",
|
||||
"Editing playlist `x`": "Redigerer afspilningsliste `x`",
|
||||
"Show more": "Vis mere",
|
||||
"Show less": "Vis mindre",
|
||||
"Watch on YouTube": "Se på YouTube",
|
||||
"Hide annotations": "Skjul annotationer",
|
||||
"Show annotations": "Vis annotationer",
|
||||
"Genre: ": "Genre: ",
|
||||
"License: ": "Licens: ",
|
||||
"Family friendly? ": "Familievenlig? ",
|
||||
"Wilson score: ": "Wilson score: ",
|
||||
"Engagement: ": "Engagement: ",
|
||||
"Whitelisted regions: ": "Whitelistede regioner: ",
|
||||
"Blacklisted regions: ": "Blacklistede regioner: ",
|
||||
"Shared `x`": "Delt `x`",
|
||||
"Premieres in `x`": "Har premiere om `x`",
|
||||
"Premieres `x`": "Har premiere om `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.": "Hej! Det ser ud til at du har JavaScript slået fra. Klik her for at se kommentarer, vær opmærksom på at de kan tage længere om at indlæse.",
|
||||
"View YouTube comments": "Vis YouTube kommentarer",
|
||||
"View more comments on Reddit": "Se flere kommentarer på Reddit",
|
||||
"View `x` comments": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "Vis `x` kommentarer.([^.,0-9]|^)1([^.,0-9]|$)",
|
||||
"": "Vis `x` kommentarer"
|
||||
},
|
||||
"View Reddit comments": "Vis Reddit kommentarer",
|
||||
"Hide replies": "Skjul svar",
|
||||
"Show replies": "Vis svar",
|
||||
"Incorrect password": "Forkert adgangskode",
|
||||
"Quota exceeded, try again in a few hours": "Kvota overskredet, prøv igen om et par timer",
|
||||
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Login fejlet, tjek at totrinsbekræftelse (Authenticator eller SMS) er slået til.",
|
||||
"Invalid TFA code": "Ugyldig TFA kode",
|
||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Login fejlede. Dette kan skyldes, at to-faktor autentificering ikke er aktiveret for din konto.",
|
||||
"Wrong answer": "Forkert svar",
|
||||
"Erroneous CAPTCHA": "Fejlagtig CAPTCHA",
|
||||
"CAPTCHA is a required field": "CAPTCHA er et obligatorisk felt",
|
||||
"User ID is a required field": "Bruger ID er et krævet felt",
|
||||
"Password is a required field": "Adgangskode er et obligatorisk felt",
|
||||
"Wrong username or password": "Forkert brugernavn eller adgangskode",
|
||||
"Please sign in using 'Log in with Google'": "Log ind via 'Log ind med Google'",
|
||||
"Password cannot be empty": "Adgangskoden må ikke være tom",
|
||||
"Password cannot be longer than 55 characters": "Adgangskoden må ikke være længere end 55 tegn",
|
||||
"Please log in": "Venligst log ind",
|
||||
"channel:`x`": "kanal: 'x'",
|
||||
"Deleted or invalid channel": "Slettet eller invalid kanal",
|
||||
"This channel does not exist.": "Denne kanal eksisterer ikke.",
|
||||
"Could not get channel info.": "Kunne ikke hente kanal info.",
|
||||
"Could not fetch comments": "Kunne ikke hente kommentarer",
|
||||
"`x` ago": "'x' siden",
|
||||
"Load more": "Hent flere",
|
||||
"Could not create mix.": "Kunne ikke skabe blanding.",
|
||||
"Empty playlist": "Tom playliste",
|
||||
"Not a playlist.": "Ikke en playliste.",
|
||||
"Playlist does not exist.": "Playlist eksisterer ikke.",
|
||||
"Esperanto": "Esperanto",
|
||||
"Czech": "Tjekkisk",
|
||||
"Danish": "Dansk",
|
||||
"Community": "Samfund",
|
||||
"Afrikaans": "Afrikansk",
|
||||
"Portuguese": "Portugisisk",
|
||||
"Ukrainian": "Ukrainsk",
|
||||
"Fallback comments: ": "Fallback kommentarer: ",
|
||||
"Popular": "Populær",
|
||||
"footer_donate_page": "Doner",
|
||||
"Gujarati": "Gujarati",
|
||||
"Punjabi": "Punjabi",
|
||||
"Sundanese": "Sundanesisk",
|
||||
"Urdu": "Urdu",
|
||||
"preferences_region_label": "Indhold land: ",
|
||||
"Hidden field \"challenge\" is a required field": "Det skjulte felt \"challenge\" er et påkrævet felt",
|
||||
"Albanian": "Albansk",
|
||||
"preferences_quality_dash_label": "Fortrukket DASH video kvalitet: ",
|
||||
"live": "Direkte",
|
||||
"Lao": "Lao-tse",
|
||||
"Filipino": "Filippinsk",
|
||||
"Greek": "Græsk",
|
||||
"Kurdish": "Kurdisk",
|
||||
"Malay": "Malaysisk",
|
||||
"Romanian": "Rumænsk",
|
||||
"Somali": "Somalisk",
|
||||
"preferences_locale_label": "Sprog: ",
|
||||
"News": "Nyheder",
|
||||
"permalink": "permalink",
|
||||
"date": "Upload dato",
|
||||
"features": "Funktioner",
|
||||
"filter": "Filter",
|
||||
"Khmer": "Khmer",
|
||||
"Finnish": "Finsk",
|
||||
"week": "Denne uge",
|
||||
"Korean": "Koreansk",
|
||||
"Telugu": "Telugu",
|
||||
"Malayalam": "Malayalam",
|
||||
"View as playlist": "Se som spilleliste",
|
||||
"Hungarian": "Ungarsk",
|
||||
"Welsh": "Walisisk",
|
||||
"subtitles": "Undertekster/CC",
|
||||
"Bosnian": "Bosnisk",
|
||||
"Yiddish": "Jiddisch",
|
||||
"Belarusian": "Belarussisk",
|
||||
"today": "I dag",
|
||||
"Shona": "Shona",
|
||||
"Slovenian": "Slovensk",
|
||||
"Gaming": "Gaming",
|
||||
"Bangla": "Bengali",
|
||||
"Swahili": "Swahili",
|
||||
"`x` marked it with a ❤": "`x`markeret med et ❤",
|
||||
"Kyrgyz": "Kirgisisk",
|
||||
"Turkish": "Tyrkisk",
|
||||
"adminprefs_modified_source_code_url_label": "URL-adresse til modificeret kildekodelager",
|
||||
"Switch Invidious Instance": "Skift Invidious instans",
|
||||
"Samoan": "Samoansk",
|
||||
"Spanish": "Spansk",
|
||||
"%A %B %-d, %Y": "%A %B %-d, %Y",
|
||||
"footer_documentation": "Dokumentation",
|
||||
"Pashto": "Pashto",
|
||||
"footer_modfied_source_code": "Modificeret Kildekode",
|
||||
"Released under the AGPLv3 on Github.": "Udgivet under AGPLv3 på Github.",
|
||||
"Tajik": "Tadsjikisk",
|
||||
"month": "Denne måned",
|
||||
"Hebrew": "Hebraisk",
|
||||
"Kannada": "Kannada",
|
||||
"Current version: ": "Nuværende version: ",
|
||||
"Amharic": "Amharisk",
|
||||
"Swedish": "Svensk",
|
||||
"Corsican": "Korsikansk",
|
||||
"movie": "Film",
|
||||
"Could not pull trending pages.": "Kunne ikke hente trending sider.",
|
||||
"English": "Engelsk",
|
||||
"hd": "HD",
|
||||
"Hausa": "Islandsk",
|
||||
"year": "Dette år",
|
||||
"Japanese": "Japansk",
|
||||
"content_type": "Type",
|
||||
"Icelandic": "Islandsk",
|
||||
"Basque": "Baskisk",
|
||||
"rating": "Bedømmelse",
|
||||
"Yoruba": "Yoruba",
|
||||
"Erroneous token": "Fejlagtig token",
|
||||
"Videos": "Videoer",
|
||||
"show": "Vis",
|
||||
"Luxembourgish": "Luxemboursk",
|
||||
"Vietnamese": "Vietnamesisk",
|
||||
"Latvian": "Lettisk",
|
||||
"Indonesian": "Indonesisk",
|
||||
"duration": "Varighed",
|
||||
"footer_original_source_code": "Original kildekode",
|
||||
"Search": "Søg",
|
||||
"Serbian": "Serbisk",
|
||||
"Armenian": "Armensk",
|
||||
"Bulgarian": "Bulgarsk",
|
||||
"French": "Fransk",
|
||||
"Burmese": "Burmesisk",
|
||||
"Macedonian": "Makedonsk",
|
||||
"Southern Sotho": "Sydlige Sotho",
|
||||
"About": "Omkring",
|
||||
"Malagasy": "Madagaskiske",
|
||||
"Rating: ": "Bedømmelse: ",
|
||||
"Movies": "Film",
|
||||
"YouTube comment permalink": "Youtube kommentarer permalink",
|
||||
"location": "Lokation",
|
||||
"hdr": "HDR",
|
||||
"Cebuano": "Cebuano (Sugbuanon)",
|
||||
"Nyanja": "Nyanja",
|
||||
"Chinese (Simplified)": "Kinesisk (forenklet)",
|
||||
"Chinese (Traditional)": "Kinesisk (traditionelt)",
|
||||
"Dutch": "Hollandsk",
|
||||
"Estonian": "Estisk",
|
||||
"preferences_automatic_instance_redirect_label": "Automatisk eksempel omdirigering (Fallback til redirect.invidious.io): ",
|
||||
"Nepali": "Nepalesisk",
|
||||
"Norwegian Bokmål": "Norsk Bokmål",
|
||||
"(edited)": "(ændret)",
|
||||
"preferences_show_nick_label": "Vis kælenavn på toppen: ",
|
||||
"Galician": "Galisisk",
|
||||
"German": "Tysk",
|
||||
"Maori": "Maori",
|
||||
"Slovak": "Slovakisk",
|
||||
"relevance": "Relevans",
|
||||
"hour": "Sidste time",
|
||||
"playlist": "Spilleliste",
|
||||
"long": "Lang (> 20 minutter)",
|
||||
"creative_commons": "Creative Commons",
|
||||
"Marathi": "Marathi",
|
||||
"Sindhi": "Sindhi",
|
||||
"preferences_category_misc": "Diverse indstillinger",
|
||||
"Erroneous challenge": "Fejlagtig udfordring",
|
||||
"Hindi": "Hindi",
|
||||
"Igbo": "Igbo",
|
||||
"Javanese": "Javanesisk",
|
||||
"Kazakh": "Kasabhisk",
|
||||
"Latin": "Latinsk",
|
||||
"Lithuanian": "Lituaisk",
|
||||
"Mongolian": "Mongolsk",
|
||||
"Spanish (Latin America)": "Spansk (Latinamerika)",
|
||||
"Uzbek": "Usbekisk",
|
||||
"Western Frisian": "Vestfrisisk",
|
||||
"Top": "Top",
|
||||
"Music": "Musik",
|
||||
"views": "Antal visninger",
|
||||
"sort": "Sorter efter",
|
||||
"Zulu": "Zulu",
|
||||
"Invidious Private Feed for `x`": "Invidious Privat Feed til `x`",
|
||||
"English (auto-generated)": "Engelsk (autogenereret)",
|
||||
"Arabic": "Arabisk",
|
||||
"Croatian": "Kroatisk",
|
||||
"Hawaiian": "Hawaiiansk",
|
||||
"Maltese": "Maltesisk",
|
||||
"Polish": "Polsk",
|
||||
"Russian": "Russisk",
|
||||
"Download": "Hent",
|
||||
"Download as: ": "Hent som: ",
|
||||
"Playlists": "Spillelister",
|
||||
"next_steps_error_message_refresh": "Opdater",
|
||||
"next_steps_error_message_go_to_youtube": "Gå til Youtube",
|
||||
"footer_source_code": "Kildekode",
|
||||
"Tamil": "Tamil",
|
||||
"Xhosa": "Xhosa",
|
||||
"next_steps_error_message": "Efter det burde du prøve at: ",
|
||||
"Sinhala": "Singalesisk (Sinhala)",
|
||||
"Thai": "Thai",
|
||||
"Broken? Try another Invidious Instance": "I stykker? Prøv en anden Invidious instans",
|
||||
"No such user": "Brugeren findes ikke",
|
||||
"Token is expired, please try again": "Token er udløbet, prøv igen",
|
||||
"Catalan": "Catalansk",
|
||||
"Haitian Creole": "Haitiansk",
|
||||
"Irish": "Irsk",
|
||||
"Persian": "Persisk",
|
||||
"Scottish Gaelic": "Skotsk Gælisk",
|
||||
"Default": "Standard",
|
||||
"Video mode": "Videotilstand",
|
||||
"short": "Kort (< 4 minutter)",
|
||||
"Hidden field \"token\" is a required field": "Det skjulte felt \"token\" er et påkrævet felt",
|
||||
"Azerbaijani": "Aserbajdsjansk",
|
||||
"Georgian": "Georgisk",
|
||||
"Italian": "Italiensk",
|
||||
"Audio mode": "Lydtilstand",
|
||||
"video": "Video",
|
||||
"channel": "Kanal",
|
||||
"3d": "3D",
|
||||
"4k": "4K",
|
||||
"Hmong": "Hmong",
|
||||
"preferences_quality_option_medium": "Medium",
|
||||
"preferences_quality_option_small": "Lille",
|
||||
"preferences_quality_dash_option_best": "Bedste",
|
||||
"preferences_quality_dash_option_worst": "Værste",
|
||||
"preferences_quality_dash_option_4320p": "4320p",
|
||||
"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_144p": "144p",
|
||||
"invidious": "Invidious",
|
||||
"purchased": "Købt",
|
||||
"360": "360°",
|
||||
"none": "ingen",
|
||||
"videoinfo_started_streaming_x_ago": "Streamen blev startet for `x`siden",
|
||||
"videoinfo_watch_on_youTube": "Se på YouTube",
|
||||
"videoinfo_youTube_embed_link": "Integrer",
|
||||
"videoinfo_invidious_embed_link": "Integrer Link",
|
||||
"download_subtitles": "Undertekster - `x`(.vtt)",
|
||||
"user_created_playlists": "`x`opretede spillelister",
|
||||
"user_saved_playlists": "´x`gemte spillelister",
|
||||
"Video unavailable": "Video ikke tilgængelig",
|
||||
"preferences_save_player_pos_label": "Gem den nuværende videotid: ",
|
||||
"preferences_quality_dash_option_auto": "Auto",
|
||||
"preferences_quality_option_hd720": "HD720",
|
||||
"preferences_quality_dash_option_2160p": "2160p",
|
||||
"preferences_quality_option_dash": "DASH (adaptiv kvalitet)",
|
||||
"preferences_quality_dash_option_1440p": "1440p",
|
||||
"preferences_quality_dash_option_240p": "240p"
|
||||
}
|
||||
234
locales/de.json
234
locales/de.json
@@ -1,22 +1,19 @@
|
||||
{
|
||||
"`x` subscribers": "`x` Abonnenten",
|
||||
"`x` videos": "`x` Videos",
|
||||
"`x` playlists": "",
|
||||
"LIVE": "LIVE",
|
||||
"Shared `x` ago": "Vor `x` geteilt",
|
||||
"Unsubscribe": "Abbestellen",
|
||||
"Unsubscribe": "Abo beenden",
|
||||
"Subscribe": "Abonnieren",
|
||||
"View channel on YouTube": "Kanal auf YouTube anzeigen",
|
||||
"View playlist on YouTube": "Wiedergabeliste auf YouTube anzeigen",
|
||||
"newest": "neueste",
|
||||
"oldest": "älteste",
|
||||
"popular": "beliebt",
|
||||
"last": "letzte",
|
||||
"popular": "beliebteste",
|
||||
"last": "neueste",
|
||||
"Next page": "Nächste Seite",
|
||||
"Previous page": "Vorherige Seite",
|
||||
"Clear watch history?": "Verlauf löschen?",
|
||||
"New password": "Neues Passwort",
|
||||
"New passwords must match": "Neue Passwörter müssen gleich sein",
|
||||
"New passwords must match": "Neue Passwörter müssen übereinstimmen",
|
||||
"Cannot change password for Google accounts": "Ich kann das Passwort deines Google Kontos nicht ändern",
|
||||
"Authorize token?": "Token autorisieren?",
|
||||
"Authorize token for `x`?": "Token für `x` autorisieren?",
|
||||
@@ -33,15 +30,15 @@
|
||||
"Export subscriptions as OPML": "Abonnements als OPML exportieren",
|
||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Abonnements als OPML exportieren (für NewPipe & FreeTube)",
|
||||
"Export data as JSON": "Daten als JSON exportieren",
|
||||
"Delete account?": "Account löschen?",
|
||||
"Delete account?": "Konto löschen?",
|
||||
"History": "Verlauf",
|
||||
"An alternative front-end to YouTube": "Eine alternative Oberfläche für YouTube",
|
||||
"JavaScript license information": "JavaScript Lizenzinformationen",
|
||||
"source": "Quelle",
|
||||
"Log in": "Einloggen",
|
||||
"Log in/register": "Einloggen/Registrieren",
|
||||
"Log in with Google": "Mit Google einloggen",
|
||||
"User ID": "Benutzer ID",
|
||||
"Log in": "Anmelden",
|
||||
"Log in/register": "Anmelden/registrieren",
|
||||
"Log in with Google": "Mit Google anmelden",
|
||||
"User ID": "Benutzer-ID",
|
||||
"Password": "Passwort",
|
||||
"Time (h:mm:ss):": "Zeit (h:mm:ss):",
|
||||
"Text CAPTCHA": "Text CAPTCHA",
|
||||
@@ -51,35 +48,39 @@
|
||||
"E-mail": "E-Mail",
|
||||
"Google verification code": "Google-Bestätigungscode",
|
||||
"Preferences": "Einstellungen",
|
||||
"Player preferences": "Wiedergabeeinstellungen",
|
||||
"Always loop: ": "Immer wiederholen: ",
|
||||
"Autoplay: ": "Automatisch abspielen: ",
|
||||
"Play next by default: ": "Immer automatisch nächstes Video spielen: ",
|
||||
"Autoplay next video: ": "nächstes Video automatisch abspielen: ",
|
||||
"Listen by default: ": "Nur Ton als Standard: ",
|
||||
"Proxy videos: ": "Proxy-Videos: ",
|
||||
"Default speed: ": "Standardgeschwindigkeit: ",
|
||||
"Preferred video quality: ": "Bevorzugte Videoqualität: ",
|
||||
"Player volume: ": "Wiedergabelautstärke: ",
|
||||
"Default comments: ": "Standardkommentare: ",
|
||||
"youtube": "youtube",
|
||||
"reddit": "reddit",
|
||||
"Default captions: ": "Standarduntertitel: ",
|
||||
"preferences_category_player": "Wiedergabeeinstellungen",
|
||||
"preferences_video_loop_label": "Immer wiederholen: ",
|
||||
"preferences_autoplay_label": "Automatisch abspielen: ",
|
||||
"preferences_continue_label": "Immer automatisch nächstes Video spielen: ",
|
||||
"preferences_continue_autoplay_label": "nächstes Video automatisch abspielen: ",
|
||||
"preferences_listen_label": "Nur Ton als Standard: ",
|
||||
"preferences_local_label": "Proxy-Videos: ",
|
||||
"preferences_speed_label": "Standardgeschwindigkeit: ",
|
||||
"preferences_quality_label": "Bevorzugte Videoqualität: ",
|
||||
"preferences_volume_label": "Wiedergabelautstärke: ",
|
||||
"preferences_comments_label": "Standardkommentare: ",
|
||||
"youtube": "YouTube",
|
||||
"reddit": "Reddit",
|
||||
"preferences_captions_label": "Standarduntertitel: ",
|
||||
"Fallback captions: ": "Ersatzuntertitel: ",
|
||||
"Show related videos: ": "Ähnliche Videos anzeigen? ",
|
||||
"Show annotations by default: ": "Standardmäßig Anmerkungen anzeigen? ",
|
||||
"Visual preferences": "Anzeigeeinstellungen",
|
||||
"Player style: ": "Abspielgeräterstil: ",
|
||||
"preferences_related_videos_label": "Ähnliche Videos anzeigen? ",
|
||||
"preferences_annotations_label": "Standardmäßig Anmerkungen anzeigen? ",
|
||||
"preferences_extend_desc_label": "Videobeschreibung automatisch erweitern: ",
|
||||
"preferences_vr_mode_label": "Interaktive 360 Grad Videos: ",
|
||||
"preferences_category_visual": "Anzeigeeinstellungen",
|
||||
"preferences_player_style_label": "Abspielgeräterstil: ",
|
||||
"Dark mode: ": "Nachtmodus: ",
|
||||
"Theme: ": "Modus: ",
|
||||
"preferences_dark_mode_label": "Modus: ",
|
||||
"dark": "Nachtmodus",
|
||||
"light": "klarer Modus",
|
||||
"Thin mode: ": "Schlanker Modus: ",
|
||||
"Subscription preferences": "Abonnementeinstellungen",
|
||||
"Show annotations by default for subscribed channels: ": "Anmerkungen für abonnierte Kanäle standardmäßig anzeigen? ",
|
||||
"light": "hell",
|
||||
"preferences_thin_mode_label": "Schlanker Modus: ",
|
||||
"preferences_category_misc": "Sonstige Einstellungen",
|
||||
"preferences_automatic_instance_redirect_label": "Automatische Instanzweiterleitung (über redirect.invidious.io): ",
|
||||
"preferences_category_subscription": "Abonnementeinstellungen",
|
||||
"preferences_annotations_subscribed_label": "Anmerkungen für abonnierte Kanäle standardmäßig anzeigen? ",
|
||||
"Redirect homepage to feed: ": "Startseite zu Feed umleiten: ",
|
||||
"Number of videos shown in feed: ": "Anzahl von Videos die im Feed angezeigt werden: ",
|
||||
"Sort videos by: ": "Videos sortieren nach: ",
|
||||
"preferences_max_results_label": "Anzahl von Videos die im Feed angezeigt werden: ",
|
||||
"preferences_sort_label": "Videos sortieren nach: ",
|
||||
"published": "veröffentlicht",
|
||||
"published - reverse": "veröffentlicht - invertiert",
|
||||
"alphabetically": "alphabetisch",
|
||||
@@ -88,57 +89,59 @@
|
||||
"channel name - reverse": "Kanalname - invertiert",
|
||||
"Only show latest video from channel: ": "Nur neueste Videos des Kanals anzeigen: ",
|
||||
"Only show latest unwatched video from channel: ": "Nur neueste ungesehene Videos des Kanals anzeigen: ",
|
||||
"Only show unwatched: ": "Nur ungesehene anzeigen: ",
|
||||
"Only show notifications (if there are any): ": "Nur Benachrichtigungen anzeigen (wenn es welche gibt): ",
|
||||
"preferences_unseen_only_label": "Nur ungesehene anzeigen: ",
|
||||
"preferences_notifications_only_label": "Nur Benachrichtigungen anzeigen (wenn es welche gibt): ",
|
||||
"Enable web notifications": "Webbenachrichtigungen aktivieren",
|
||||
"`x` uploaded a video": "`x` hat ein Video hochgeladen",
|
||||
"`x` is live": "`x` ist live",
|
||||
"Data preferences": "Dateneinstellungen",
|
||||
"preferences_category_data": "Dateneinstellungen",
|
||||
"Clear watch history": "Verlauf löschen",
|
||||
"Import/export data": "Daten im-/exportieren",
|
||||
"Import/export data": "Daten importieren/exportieren",
|
||||
"Change password": "Passwort ändern",
|
||||
"Manage subscriptions": "Abonnements verwalten",
|
||||
"Manage tokens": "Tokens verwalten",
|
||||
"Watch history": "Verlauf",
|
||||
"Delete account": "Account löschen",
|
||||
"Administrator preferences": "Administrator-Einstellungen",
|
||||
"Default homepage: ": "Standard-Startseite: ",
|
||||
"Feed menu: ": "Feed-Menü: ",
|
||||
"preferences_category_admin": "Administrator-Einstellungen",
|
||||
"preferences_default_home_label": "Standard-Startseite: ",
|
||||
"preferences_feed_menu_label": "Feed-Menü: ",
|
||||
"preferences_show_nick_label": "Nutzernamen oben anzeigen: ",
|
||||
"Top enabled: ": "Top aktiviert? ",
|
||||
"CAPTCHA enabled: ": "CAPTCHA aktiviert? ",
|
||||
"Login enabled: ": "Login aktiviert? ",
|
||||
"Login enabled: ": "Anmeldung aktiviert: ",
|
||||
"Registration enabled: ": "Registrierung aktiviert? ",
|
||||
"Report statistics: ": "Statistiken berichten? ",
|
||||
"Save preferences": "Einstellungen speichern",
|
||||
"Subscription manager": "Abonnementverwaltung",
|
||||
"Token manager": "Tokenverwalter",
|
||||
"Token": "Token",
|
||||
"`x` subscriptions": "`x` Abonnements",
|
||||
"`x` tokens": "`x` Tokens",
|
||||
"Import/export": "Importieren/Exportieren",
|
||||
"unsubscribe": "abbestellen",
|
||||
"revoke": "widerrufen",
|
||||
"Subscriptions": "Abonnements",
|
||||
"`x` unseen notifications": "`x` ungesehene Benachrichtigungen",
|
||||
"search": "Suchen",
|
||||
"Log out": "Abmelden",
|
||||
"Released under the AGPLv3 by Omar Roth.": "Veröffentlicht unter AGPLv3 von Omar Roth.",
|
||||
"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 privacy policy.": "Datenschutzerklärung einsehen.",
|
||||
"Trending": "Trending",
|
||||
"Public": "",
|
||||
"Trending": "Angesagt",
|
||||
"Public": "Öffentlich",
|
||||
"Unlisted": "Nicht aufgeführt",
|
||||
"Private": "",
|
||||
"View all playlists": "",
|
||||
"Updated `x` ago": "",
|
||||
"Delete playlist `x`?": "",
|
||||
"Delete playlist": "",
|
||||
"Create playlist": "",
|
||||
"Title": "",
|
||||
"Playlist privacy": "",
|
||||
"Editing playlist `x`": "",
|
||||
"Private": "Privat",
|
||||
"View all playlists": "Alle Wiedergabelisten anzeigen",
|
||||
"Updated `x` ago": "Aktualisiert `x` vor",
|
||||
"Delete playlist `x`?": "Wiedergabeliste löschen `x`?",
|
||||
"Delete playlist": "Wiedergabeliste löschen",
|
||||
"Create playlist": "Wiedergabeliste erstellen",
|
||||
"Title": "Titel",
|
||||
"Playlist privacy": "Vertrauliche Wiedergabeliste",
|
||||
"Editing playlist `x`": "Wiedergabeliste bearbeiten `x`",
|
||||
"Show more": "Mehr anzeigen",
|
||||
"Show less": "Weniger anzeigen",
|
||||
"Watch on YouTube": "Video auf YouTube ansehen",
|
||||
"Switch Invidious Instance": "Invidious Instanz wechseln",
|
||||
"Broken? Try another Invidious Instance": "Funktioniert nicht? Probiere eine andere Invidious Instanz aus",
|
||||
"Hide annotations": "Anmerkungen ausblenden",
|
||||
"Show annotations": "Anmerkungen anzeigen",
|
||||
"Genre: ": "Genre: ",
|
||||
@@ -149,28 +152,30 @@
|
||||
"Whitelisted regions: ": "Erlaubte Regionen: ",
|
||||
"Blacklisted regions: ": "Unerlaubte Regionen: ",
|
||||
"Shared `x`": "Geteilt `x`",
|
||||
"`x` views": "`x` Aufrufe",
|
||||
"Premieres in `x`": "Zuerst gesehen in `x`",
|
||||
"Premieres `x`": "Erster Start `x`",
|
||||
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "Hallo! Anscheinend haben Sie JavaScript deaktiviert. Klicken Sie hier um Kommentare anzuzeigen, beachten sie dass es etwas länger dauern kann um sie zu laden.",
|
||||
"View YouTube comments": "YouTube Kommentare anzeigen",
|
||||
"View more comments on Reddit": "Mehr Kommentare auf Reddit anzeigen",
|
||||
"View `x` comments": "`x` Kommentare anzeigen",
|
||||
"View `x` comments": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` Kommentare anzeigen",
|
||||
"": "`x` Kommentare anzeigen"
|
||||
},
|
||||
"View Reddit comments": "Reddit Kommentare anzeigen",
|
||||
"Hide replies": "Antworten verstecken",
|
||||
"Show replies": "Antworten anzeigen",
|
||||
"Incorrect password": "Falsches Passwort",
|
||||
"Quota exceeded, try again in a few hours": "Kontingent überschritten, versuche es in ein paar Stunden erneut",
|
||||
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Login nicht möglich, stellen Sie sicher dass two-factor Authentifikation (Authentifizierung oder SMS) aktiviert ist.",
|
||||
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "Anmeldung nicht möglich, stellen Sie sicher, dass die Zwei-Faktor-Authentisierung (Authenticator oder SMS) aktiviert ist.",
|
||||
"Invalid TFA code": "Ungültiger TFA Code",
|
||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Login fehlgeschlagen. Das kann daran liegen dass two-factor Authentifizierung in ihrem Account nicht aktiviert ist.",
|
||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "Die Anmeldung ist fehlgeschlagen. Dies kann daran liegen, dass die Zwei-Faktor-Authentisierung für Ihr Konto nicht aktiviert ist.",
|
||||
"Wrong answer": "Ungültige Antwort",
|
||||
"Erroneous CAPTCHA": "Ungültiges CAPTCHA",
|
||||
"CAPTCHA is a required field": "CAPTCHA ist eine erforderliche Eingabe",
|
||||
"User ID is a required field": "Benutzer ID ist eine erforderliche Eingabe",
|
||||
"Password is a required field": "Passwort ist eine erforderliche Eingabe",
|
||||
"Wrong username or password": "Ungültiger Benutzername oder Passwort",
|
||||
"Please sign in using 'Log in with Google'": "Bitte melden sie sich mit 'Mit Google anmelden' an",
|
||||
"Please sign in using 'Log in with Google'": "Bitte melden Sie sich mit „Mit Google anmelden“ an",
|
||||
"Password cannot be empty": "Passwort darf nicht leer sein",
|
||||
"Password cannot be longer than 55 characters": "Passwort darf nicht länger als 55 Zeichen sein",
|
||||
"Please log in": "Bitte anmelden",
|
||||
@@ -180,17 +185,15 @@
|
||||
"This channel does not exist.": "Dieser Kanal existiert nicht.",
|
||||
"Could not get channel info.": "Kanalinformationen konnten nicht geladen werden.",
|
||||
"Could not fetch comments": "Kommentare konnten nicht geladen werden",
|
||||
"View `x` replies": "Zeige `x` Antworten",
|
||||
"`x` ago": "vor `x`",
|
||||
"Load more": "Mehr laden",
|
||||
"`x` points": "`x` Punkte",
|
||||
"Could not create mix.": "Mix konnte nicht erstellt werden.",
|
||||
"Empty playlist": "Playlist ist leer",
|
||||
"Not a playlist.": "Ungültige Playlist.",
|
||||
"Playlist does not exist.": "Playlist existiert nicht.",
|
||||
"Could not pull trending pages.": "Trending 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",
|
||||
"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.",
|
||||
"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",
|
||||
"Erroneous token": "Ungültiger Token",
|
||||
"No such user": "Ungültiger Benutzer",
|
||||
@@ -301,19 +304,13 @@
|
||||
"Yiddish": "Jiddisch",
|
||||
"Yoruba": "Joruba",
|
||||
"Zulu": "Zulu",
|
||||
"`x` years": "`x` Jahre",
|
||||
"`x` months": "`x` Monate",
|
||||
"`x` weeks": "`x` Wochen",
|
||||
"`x` days": "`x` Tage",
|
||||
"`x` hours": "`x` Stunden",
|
||||
"`x` minutes": "`x` Minuten",
|
||||
"`x` seconds": "`x` Sekunden",
|
||||
"Fallback comments: ": "Alternative Kommentare: ",
|
||||
"Popular": "Populär",
|
||||
"Search": "Suchen",
|
||||
"Top": "Top",
|
||||
"About": "Über",
|
||||
"Rating: ": "Bewertung: ",
|
||||
"Language: ": "Sprache: ",
|
||||
"preferences_locale_label": "Sprache: ",
|
||||
"View as playlist": "Als Wiedergabeliste anzeigen",
|
||||
"Default": "Standard",
|
||||
"Music": "Musik",
|
||||
@@ -322,7 +319,7 @@
|
||||
"Movies": "Filme",
|
||||
"Download": "Herunterladen",
|
||||
"Download as: ": "Herunterladen als: ",
|
||||
"%A %B %-d, %Y": "%A %B %-d, %Y",
|
||||
"%A %B %-d, %Y": "%A %-d %B %Y",
|
||||
"(edited)": "(editiert)",
|
||||
"YouTube comment permalink": "YouTube-Kommentar Permalink",
|
||||
"permalink": "Permalink",
|
||||
@@ -332,5 +329,74 @@
|
||||
"Videos": "Videos",
|
||||
"Playlists": "Wiedergabelisten",
|
||||
"Community": "Gemeinschaft",
|
||||
"Current version: ": "Aktuelle Version: "
|
||||
}
|
||||
"relevance": "Relevanz",
|
||||
"rating": "Bewertung",
|
||||
"date": "Datum",
|
||||
"views": "Aufrufe",
|
||||
"content_type": "Inhaltstyp",
|
||||
"duration": "Dauer",
|
||||
"features": "Eigenschaften",
|
||||
"sort": "sortieren",
|
||||
"hour": "Letzte Stunde",
|
||||
"today": "Heute",
|
||||
"week": "Diese Woche",
|
||||
"month": "Diesen Monat",
|
||||
"year": "Dieses Jahr",
|
||||
"video": "Video",
|
||||
"channel": "Kanal",
|
||||
"playlist": "Wiedergabeliste",
|
||||
"movie": "Film",
|
||||
"show": "Anzeigen",
|
||||
"hd": "HD",
|
||||
"subtitles": "Untertitel / CC",
|
||||
"creative_commons": "Creative Commons",
|
||||
"3d": "3D",
|
||||
"live": "Live",
|
||||
"4k": "4K",
|
||||
"location": "Standort",
|
||||
"hdr": "HDR",
|
||||
"filter": "Filtern",
|
||||
"Current version: ": "Aktuelle Version: ",
|
||||
"next_steps_error_message": "Danach folgendes versuchen: ",
|
||||
"next_steps_error_message_refresh": "Aktualisieren",
|
||||
"next_steps_error_message_go_to_youtube": "Zu YouTube gehen",
|
||||
"footer_donate_page": "Spende",
|
||||
"long": "Lang (> 20 Minuten)",
|
||||
"footer_original_source_code": "Original Quellcode",
|
||||
"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",
|
||||
"short": "Kurz (< 4 Minuten)",
|
||||
"preferences_region_label": "Land der Inhalte: ",
|
||||
"preferences_quality_option_dash": "DASH (automatische Qualität)",
|
||||
"preferences_quality_option_hd720": "HD720",
|
||||
"preferences_quality_option_medium": "Mittel",
|
||||
"preferences_quality_option_small": "Niedrig",
|
||||
"preferences_quality_dash_option_auto": "Auto",
|
||||
"preferences_quality_dash_option_4320p": "4320p",
|
||||
"preferences_quality_dash_option_2160p": "2160p",
|
||||
"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",
|
||||
"invidious": "Invidious",
|
||||
"videoinfo_invidious_embed_link": "Link zum Einbetten",
|
||||
"download_subtitles": "Untertitel - `x` (.vtt)",
|
||||
"Video unavailable": "Video nicht verfügbar",
|
||||
"user_created_playlists": "`x` Wiedergabelisten erstellt",
|
||||
"user_saved_playlists": "`x` Wiedergabelisten gespeichert",
|
||||
"preferences_save_player_pos_label": "Aktuelle Position speichern: ",
|
||||
"360": "360°",
|
||||
"preferences_quality_dash_option_best": "Höchste",
|
||||
"preferences_quality_dash_option_worst": "Niedrigste",
|
||||
"preferences_quality_dash_option_1440p": "1440p",
|
||||
"videoinfo_youTube_embed_link": "Eingebettet",
|
||||
"purchased": "Gekauft",
|
||||
"none": "keine",
|
||||
"videoinfo_started_streaming_x_ago": "Stream begann vor `x`",
|
||||
"videoinfo_watch_on_youTube": "Auf YouTube ansehen",
|
||||
"preferences_quality_dash_label": "Bevorzugte DASH-Videoqualität: "
|
||||
}
|
||||
|
||||
317
locales/el.json
317
locales/el.json
@@ -1,19 +1,10 @@
|
||||
{
|
||||
"`x` subscribers": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` συνδρομητής",
|
||||
"": "`x` συνδρομητές"
|
||||
},
|
||||
"`x` videos": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` βίντεο",
|
||||
"": "`x` βίντεο"
|
||||
},
|
||||
"`x` playlists": "",
|
||||
"LIVE": "ΖΩΝΤΑΝΑ",
|
||||
"Shared `x` ago": "Μοιράστηκε πριν `x`",
|
||||
"Shared `x` ago": "Μοιράστηκε πριν από `x`",
|
||||
"Unsubscribe": "Απεγγραφή",
|
||||
"Subscribe": "Εγγραφή",
|
||||
"View channel on YouTube": "Προβολή καναλιού στο YouTube",
|
||||
"View playlist on YouTube": "",
|
||||
"View playlist on YouTube": "Προβολή καταλόγου αναπαραγωγής στο YouTube",
|
||||
"newest": "νεότερα",
|
||||
"oldest": "παλιότερα",
|
||||
"popular": "δημοφιλή",
|
||||
@@ -30,15 +21,15 @@
|
||||
"No": "Όχι",
|
||||
"Import and Export Data": "Εισαγωγή και Εξαγωγή Δεδομένων",
|
||||
"Import": "Εισαγωγή",
|
||||
"Import Invidious data": "Εισαγωγή δεδομένων Invidious",
|
||||
"Import YouTube subscriptions": "Εισαγωγή συνδρομών YouTube",
|
||||
"Import Invidious data": "Εsαγωγή δεδομένων Invidious JSON",
|
||||
"Import YouTube subscriptions": "Εισαγωγή συνδρομών YouTube/OPML",
|
||||
"Import FreeTube subscriptions (.db)": "Εισαγωγή συνδρομών FreeTube (.db)",
|
||||
"Import NewPipe subscriptions (.json)": "Εισαγωγή συνδρομών NewPipe (.json)",
|
||||
"Import NewPipe data (.zip)": "Εισαγωγή δεδομένων NewPipe (.zip)",
|
||||
"Export": "Εξαγωγή",
|
||||
"Export subscriptions as OPML": "Εξαγωγή συνδρομών ως OPML",
|
||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Εξαγωγή συνδρομών ως OPML (για NewPipe & FreeTube)",
|
||||
"Export data as JSON": "Εξαγωγή δεδομένων ως JSON",
|
||||
"Export data as JSON": "Εξαγωγή δεδομένων Invidious ως JSON",
|
||||
"Delete account?": "Διαγραφή λογαριασμού;",
|
||||
"History": "Ιστορικό",
|
||||
"An alternative front-end to YouTube": "Μία εναλλακτική πλατφόρμα για το YouTube",
|
||||
@@ -54,38 +45,38 @@
|
||||
"Image CAPTCHA": "Εικόνα CAPTCHA",
|
||||
"Sign In": "Σύνδεση",
|
||||
"Register": "Εγγραφή",
|
||||
"E-mail": "E-mail",
|
||||
"E-mail": "Ηλεκτρονικό ταχυδρομείο",
|
||||
"Google verification code": "Κωδικός επαλήθευσης Google",
|
||||
"Preferences": "Προτιμήσεις",
|
||||
"Player preferences": "Προτιμήσεις αναπαραγωγής",
|
||||
"Always loop: ": "Αυτόματη επανάληψη: ",
|
||||
"Autoplay: ": "Αυτόματη αναπαραγωγή: ",
|
||||
"Play next by default: ": "Αναπαραγωγή επόμενου: ",
|
||||
"Autoplay next video: ": "Αυτόματη αναπαραγωγή επόμενου: ",
|
||||
"Listen by default: ": "Φόρτωση μόνο ήχου: ",
|
||||
"Proxy videos: ": "Αναπαραγωγή με διακομιστή μεσολάβησης (proxy): ",
|
||||
"Default speed: ": "Προεπιλεγμένη ταχύτητα: ",
|
||||
"Preferred video quality: ": "Προτιμώμενη ανάλυση: ",
|
||||
"Player volume: ": "Ένταση αναπαραγωγής: ",
|
||||
"Default comments: ": "Προεπιλεγμένα σχόλια: ",
|
||||
"youtube": "youtube",
|
||||
"reddit": "reddit",
|
||||
"Default captions: ": "Προεπιλεγμένοι υπότιτλοι: ",
|
||||
"preferences_category_player": "Προτιμήσεις αναπαραγωγής",
|
||||
"preferences_video_loop_label": "Αυτόματη επανάληψη: ",
|
||||
"preferences_autoplay_label": "Αυτόματη αναπαραγωγή: ",
|
||||
"preferences_continue_label": "Αναπαραγωγή επόμενου: ",
|
||||
"preferences_continue_autoplay_label": "Αυτόματη αναπαραγωγή επόμενου: ",
|
||||
"preferences_listen_label": "Φόρτωση μόνο ήχου: ",
|
||||
"preferences_local_label": "Αναπαραγωγή με διακομιστή μεσολάβησης (proxy): ",
|
||||
"preferences_speed_label": "Προεπιλεγμένη ταχύτητα: ",
|
||||
"preferences_quality_label": "Προτιμώμενη ανάλυση: ",
|
||||
"preferences_volume_label": "Ένταση αναπαραγωγής: ",
|
||||
"preferences_comments_label": "Προεπιλεγμένα σχόλια: ",
|
||||
"youtube": "YouTube",
|
||||
"reddit": "Reddit",
|
||||
"preferences_captions_label": "Προεπιλεγμένοι υπότιτλοι: ",
|
||||
"Fallback captions: ": "Εναλλακτικοί υπότιτλοι: ",
|
||||
"Show related videos: ": "Προβολή σχετικών βίντεο; ",
|
||||
"Show annotations by default: ": "Αυτόματη προβολή σημειώσεων; :",
|
||||
"Visual preferences": "Προτιμήσεις εμφάνισης",
|
||||
"Player style: ": "",
|
||||
"preferences_related_videos_label": "Προβολή σχετικών βίντεο; ",
|
||||
"preferences_annotations_label": "Αυτόματη προβολή σημειώσεων: ",
|
||||
"preferences_category_visual": "Προτιμήσεις εμφάνισης",
|
||||
"preferences_player_style_label": "Τεχνοτροπία της συσκευής αναπαραγωγης: ",
|
||||
"Dark mode: ": "Σκοτεινή λειτουργία: ",
|
||||
"Theme: ": "",
|
||||
"dark": "",
|
||||
"light": "",
|
||||
"Thin mode: ": "Ελαφριά λειτουργία: ",
|
||||
"Subscription preferences": "Προτιμήσεις συνδρομών",
|
||||
"Show annotations by default for subscribed channels: ": "Προβολή σημειώσεων μόνο για κανάλια στα οποία είστε συνδρομητής; ",
|
||||
"preferences_dark_mode_label": "Θέμα: ",
|
||||
"dark": "σκοτεινό",
|
||||
"light": "φωτεινό",
|
||||
"preferences_thin_mode_label": "Ελαφριά λειτουργία: ",
|
||||
"preferences_category_subscription": "Προτιμήσεις συνδρομών",
|
||||
"preferences_annotations_subscribed_label": "Προβολή σημειώσεων μόνο για κανάλια στα οποία είστε συνδρομητής; ",
|
||||
"Redirect homepage to feed: ": "Ανακατεύθυνση αρχικής στη ροή συνδρομών: ",
|
||||
"Number of videos shown in feed: ": "Αριθμός βίντεο ανά σελίδα ροής συνδρομών: ",
|
||||
"Sort videos by: ": "Ταξινόμηση ανά: ",
|
||||
"preferences_max_results_label": "Αριθμός βίντεο ανά σελίδα ροής συνδρομών: ",
|
||||
"preferences_sort_label": "Ταξινόμηση ανά: ",
|
||||
"published": "ημερομηνία δημοσίευσης",
|
||||
"published - reverse": "ημερομηνία δημοσίευσης - ανάποδα",
|
||||
"alphabetically": "αλφαβητικά",
|
||||
@@ -94,12 +85,12 @@
|
||||
"channel name - reverse": "όνομα καναλιού - ανάποδα",
|
||||
"Only show latest video from channel: ": "Προβολή μόνο του τελευταίου βίντεο του καναλιού: ",
|
||||
"Only show latest unwatched video from channel: ": "Προβολή μόνο του τελευταίου μη-προβεβλημένου βίντεο του καναλιού: ",
|
||||
"Only show unwatched: ": "Προβολή μόνο μη-προβεβλημένων: ",
|
||||
"Only show notifications (if there are any): ": "Προβολή μόνο ειδοποιήσεων (αν υπάρχουν): ",
|
||||
"Enable web notifications": "",
|
||||
"`x` uploaded a video": "",
|
||||
"`x` is live": "",
|
||||
"Data preferences": "Προτιμήσεις δεδομένων",
|
||||
"preferences_unseen_only_label": "Προβολή μόνο μη-προβεβλημένων: ",
|
||||
"preferences_notifications_only_label": "Προβολή μόνο ειδοποιήσεων (αν υπάρχουν): ",
|
||||
"Enable web notifications": "Ενεργοποίηση ειδοποιήσεων δικτύου",
|
||||
"`x` uploaded a video": "`x` κοινοποίησε ένα βίντεο",
|
||||
"`x` is live": "`x` κάνει live",
|
||||
"preferences_category_data": "Προτιμήσεις δεδομένων",
|
||||
"Clear watch history": "Εκκαθάριση ιστορικού προβολής",
|
||||
"Import/export data": "Εισαγωγή/εξαγωγή δεδομένων",
|
||||
"Change password": "Αλλαγή κωδικού πρόσβασης",
|
||||
@@ -107,9 +98,9 @@
|
||||
"Manage tokens": "Διαχείριση διασυνδέσεων",
|
||||
"Watch history": "Ιστορικό προβολής",
|
||||
"Delete account": "Διαγραφή λογαριασμού",
|
||||
"Administrator preferences": "Προτιμήσεις διαχειριστή",
|
||||
"Default homepage: ": "Προεπιλεγμένη αρχική: ",
|
||||
"Feed menu: ": "Μενού ροής συνδρομών: ",
|
||||
"preferences_category_admin": "Προτιμήσεις διαχειριστή",
|
||||
"preferences_default_home_label": "Προεπιλεγμένη αρχική: ",
|
||||
"preferences_feed_menu_label": "Μενού ροής συνδρομών: ",
|
||||
"Top enabled: ": "Ενεργοποίηση κορυφαίων; ",
|
||||
"CAPTCHA enabled: ": "Ενεργοποίηση CAPTCHA; ",
|
||||
"Login enabled: ": "Ενεργοποίηση σύνδεσης; ",
|
||||
@@ -119,61 +110,47 @@
|
||||
"Subscription manager": "Διαχειριστής συνδρομών",
|
||||
"Token manager": "Διαχειριστής διασυνδέσεων",
|
||||
"Token": "Διασύνδεση",
|
||||
"`x` subscriptions": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` συνδρομή",
|
||||
"": "`x` συνδρομές"
|
||||
},
|
||||
"`x` tokens": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` διασύνδεση",
|
||||
"": "`x` διασυνδέσεις"
|
||||
},
|
||||
"Import/export": "Εισαγωγή/εξαγωγή",
|
||||
"unsubscribe": "κατάργηση συνδρομής",
|
||||
"revoke": "ανάκληση",
|
||||
"Subscriptions": "Συνδρομές",
|
||||
"`x` unseen notifications": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` καινούρια ειδοποίηση",
|
||||
"": "`x` καινούριες ειδοποιήσεις"
|
||||
},
|
||||
"search": "αναζήτηση",
|
||||
"Log out": "Αποσύνδεση",
|
||||
"Released under the AGPLv3 by Omar Roth.": "Κυκλοφορεί υπό την άδεια AGPLv3 από τον Omar Roth.",
|
||||
"Source available here.": "Προβολή πηγαίου κώδικα εδώ.",
|
||||
"View JavaScript license information.": "Προβολή πληροφοριών άδειας JavaScript.",
|
||||
"View privacy policy.": "Προβολή πολιτικής απορρήτου.",
|
||||
"Trending": "Τάσεις",
|
||||
"Public": "",
|
||||
"Public": "Δημόσιο",
|
||||
"Unlisted": "Κρυφό",
|
||||
"Private": "",
|
||||
"View all playlists": "",
|
||||
"Updated `x` ago": "",
|
||||
"Delete playlist `x`?": "",
|
||||
"Delete playlist": "",
|
||||
"Create playlist": "",
|
||||
"Title": "",
|
||||
"Playlist privacy": "",
|
||||
"Editing playlist `x`": "",
|
||||
"Private": "Ιδιωτικό",
|
||||
"View all playlists": "Προβολή όλων των καταλόγων αναπαραγωγής",
|
||||
"Updated `x` ago": "Ενημερώθηκε πριν από `x`",
|
||||
"Delete playlist `x`?": "Διαγραφή `x` καταλόγου αναπαραγωγής;",
|
||||
"Delete playlist": "Διαγραφή καταλόγου αναπαραγωγής",
|
||||
"Create playlist": "Δημιουργία καταλόγου αναπαραγωγής",
|
||||
"Title": "Τίτλος",
|
||||
"Playlist privacy": "Ιδιωτικότητα καταλόγων αναπαραγωγής",
|
||||
"Editing playlist `x`": "Επεξεργασία `x` καταλόγου αναπαραγωγής",
|
||||
"Watch on YouTube": "Προβολή στο YouTube",
|
||||
"Hide annotations": "Απόκρυψη σημειώσεων",
|
||||
"Show annotations": "Προβολή σημειώσεων",
|
||||
"Genre: ": "Είδος: ",
|
||||
"License: ": "Άδεια: ",
|
||||
"Family friendly? ": "Φιλικό προς την οικογένεια; ",
|
||||
"Wilson score: ": "Wilson score: ",
|
||||
"Wilson score: ": "Αποτελέσματα Wilson: ",
|
||||
"Engagement: ": "Ενδιαφέρον: ",
|
||||
"Whitelisted regions: ": "Επιτρεπτές περιοχές: ",
|
||||
"Blacklisted regions: ": "Μη-επιτρεπτές περιοχές: ",
|
||||
"Shared `x`": "Μοιράστηκε το `x`",
|
||||
"`x` views": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` προβολή",
|
||||
"": "`x` προβολές"
|
||||
},
|
||||
"Premieres in `x`": "Πρώτη προβολή σε `x`",
|
||||
"Premieres `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.": "Γεια! Φαίνεται πως έχετε απενεργοποιήσει το JavaScript. Πατήστε εδώ για προβολή σχολίων, αλλά έχετε υπ'όψιν σας πως ίσως φορτώσουν πιο αργά. ",
|
||||
"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.": "Γεια! Φαίνεται πως έχετε απενεργοποιήσει το JavaScript. Πατήστε εδώ για προβολή σχολίων, αλλά έχετε υπ'όψιν σας πως ίσως φορτώσουν πιο αργά.",
|
||||
"View YouTube comments": "Προβολή σχολίων από το YouTube",
|
||||
"View more comments on Reddit": "Προβολή περισσότερων σχολίων στο Reddit",
|
||||
"View `x` comments": "Προβολή `x` σχολίων",
|
||||
"View `x` comments": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "Προβολή `x` σχολίων",
|
||||
"": "Προβολή `x` σχολίων"
|
||||
},
|
||||
"View Reddit comments": "Προβολή σχολίων από το Reddit",
|
||||
"Hide replies": "Απόκρυψη απαντήσεων",
|
||||
"Show replies": "Προβολή απαντήσεων",
|
||||
@@ -198,19 +175,11 @@
|
||||
"This channel does not exist.": "Αυτό το κανάλι δεν υπάρχει.",
|
||||
"Could not get channel info.": "Αδύναμια εύρεσης πληροφοριών καναλιού.",
|
||||
"Could not fetch comments": "Αδυναμία λήψης σχολίων",
|
||||
"View `x` replies": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "Προβολή `x` απάντησης",
|
||||
"": "Προβολή `x` απαντήσεων"
|
||||
},
|
||||
"`x` ago": "Πριν `x`",
|
||||
"Load more": "Φόρτωση περισσότερων",
|
||||
"`x` points": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` βαθμός",
|
||||
"": "`x` βαθμοί"
|
||||
},
|
||||
"Could not create mix.": "Αδυναμία δημιουργίας μίξης.",
|
||||
"Empty playlist": "Κενή λίστα αναπαραγωγής",
|
||||
"Not a playlist.": "Μη έγκυρη λίστα αναπαραγωγής",
|
||||
"Not a playlist.": "Μη έγκυρη λίστα αναπαραγωγής.",
|
||||
"Playlist does not exist.": "Μη υπαρκτή λίστα αναπαραγωγής.",
|
||||
"Could not pull trending pages.": "Αδυναμία λήψης σελίδας τάσεων.",
|
||||
"Hidden field \"challenge\" is a required field": "Το Κρυφό πεδίο \"δοκιμασία\" είναι απαραίτητο",
|
||||
@@ -325,40 +294,12 @@
|
||||
"Yiddish": "Γίντις",
|
||||
"Yoruba": "Γιορούμπα",
|
||||
"Zulu": "Ζουλού",
|
||||
"`x` years": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` χρόνο",
|
||||
"": "`x` χρόνια"
|
||||
},
|
||||
"`x` months": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` μήνα",
|
||||
"": "`x` μήνες"
|
||||
},
|
||||
"`x` weeks": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` εβδομάδα",
|
||||
"": "`x` εβδομάδες"
|
||||
},
|
||||
"`x` days": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` ημέρα",
|
||||
"": "`x` ημέρες"
|
||||
},
|
||||
"`x` hours": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` ώρα",
|
||||
"": "`x` ώρες"
|
||||
},
|
||||
"`x` minutes": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` λεπτό",
|
||||
"": "`x` λεπτά"
|
||||
},
|
||||
"`x` seconds": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` δευτερόλεπτο",
|
||||
"": "`x` δευτερόλεπτα"
|
||||
},
|
||||
"Fallback comments: ": "Εναλλακτικά σχόλια: ",
|
||||
"Popular": "Δημοφιλή",
|
||||
"Top": "Κορυφαία",
|
||||
"About": "Σχετικά",
|
||||
"Rating: ": "Aξιολόγηση: ",
|
||||
"Language: ": "Γλώσσα: ",
|
||||
"preferences_locale_label": "Γλώσσα: ",
|
||||
"View as playlist": "Προβολή ως λίστα αναπαραγωγής",
|
||||
"Default": "Προεπιλογή",
|
||||
"Music": "Μουσική",
|
||||
@@ -370,12 +311,142 @@
|
||||
"%A %B %-d, %Y": "%A %B %-d, %Y",
|
||||
"(edited)": "(τροποποιημένο)",
|
||||
"YouTube comment permalink": "Σύνδεσμος YouTube σχολίου",
|
||||
"permalink": "",
|
||||
"permalink": "μόνιμος σύνδεσμος",
|
||||
"`x` marked it with a ❤": "Ο χρηστης `x` έβαλε ❤",
|
||||
"Audio mode": "Λειτουργία ήχου",
|
||||
"Video mode": "Λειτουργία βίντεο",
|
||||
"Videos": "Βίντεο",
|
||||
"Playlists": "Λίστες Αναπαραγωγής",
|
||||
"Community": "",
|
||||
"Current version: ": "Τρέχουσα έκδοση: "
|
||||
}
|
||||
"Community": "Κοινότητα",
|
||||
"Current version: ": "Τρέχουσα έκδοση: ",
|
||||
"generic_playlists_count": "{{count}} λίστα αναπαραγωγής",
|
||||
"generic_playlists_count_plural": "{{count}} λίστες αναπαραγωγής",
|
||||
"preferences_quality_dash_option_worst": "Χειρότερη",
|
||||
"preferences_quality_dash_option_2160p": "2160 p",
|
||||
"Video unavailable": "Το βίντεο δεν είναι διαθέσιμο",
|
||||
"preferences_quality_dash_option_auto": "Αυτόματη",
|
||||
"preferences_quality_dash_option_1440p": "1440p",
|
||||
"preferences_quality_dash_option_1080p": "1080p",
|
||||
"comments_view_x_replies": "Προβολή {{count}} απάντησης",
|
||||
"comments_view_x_replies_plural": "Προβολή {{count}} απαντήσεων",
|
||||
"crash_page_report_issue": "Εάν κανένα από τα παραπάνω δεν βοήθησε, παρακαλούμε <a href=\"`x`\">ανοίξτε ένα νέο θέμα στο GitHub</a> (κατά προτίμηση στα αγγλικά) και συμπεριλάβετε το ακόλουθο κείμενο στο μήνυμά σας (ΜΗΝ μεταφράζετε αυτό το κείμενο):",
|
||||
"generic_count_hours": "{{count}} ώρα",
|
||||
"generic_count_hours_plural": "{{count}} ώρες",
|
||||
"generic_count_minutes": "{{count}} λεπτό",
|
||||
"generic_count_minutes_plural": "{{count}} λεπτά",
|
||||
"generic_count_seconds": "{{count}} δευτερόλεπτο",
|
||||
"generic_count_seconds_plural": "{{count}} δευτερόλεπτα",
|
||||
"preferences_quality_dash_label": "Προτιμώμενη ποιότητα βίντεο DASH: ",
|
||||
"preferences_quality_dash_option_best": "Καλύτερη",
|
||||
"preferences_quality_dash_option_480p": "480p",
|
||||
"preferences_quality_dash_option_360p": "360p",
|
||||
"preferences_quality_dash_option_240p": "240p",
|
||||
"preferences_quality_dash_option_144p": "144p",
|
||||
"generic_subscribers_count": "{{count}} συνδρομητής",
|
||||
"generic_subscribers_count_plural": "{{count}} συνδρομητές",
|
||||
"generic_subscriptions_count": "{{count}} συνδρομή",
|
||||
"generic_subscriptions_count_plural": "{{count}} συνδρομές",
|
||||
"generic_count_years": "{{count}} έτος",
|
||||
"generic_count_years_plural": "{{count}} έτη",
|
||||
"generic_count_months": "{{count}} μήνας",
|
||||
"generic_count_months_plural": "{{count}} μήνες",
|
||||
"generic_count_weeks": "{{count}} εβδομάδα",
|
||||
"generic_count_weeks_plural": "{{count}} εβδομάδες",
|
||||
"generic_count_days": "{{count}} ημέρα",
|
||||
"generic_count_days_plural": "{{count}} ημέρες",
|
||||
"crash_page_you_found_a_bug": "Φαίνεται ότι βρήκατε ένα σφάλμα στο Invidious!",
|
||||
"crash_page_before_reporting": "Πριν αναφέρετε ένα σφάλμα, βεβαιωθείτε ότι έχετε:",
|
||||
"crash_page_refresh": "προσπαθήσει να <a href=\"`x`\">ανανεώσετε τη σελίδα</a>",
|
||||
"crash_page_read_the_faq": "διαβάσει τις <a href=\"`x`\">Συχνές Ερωτήσεις (ΣΕ)</a>",
|
||||
"crash_page_search_issue": "αναζητήσει για <a href=\"`x`\">υπάρχοντα θέματα στο Github</a>",
|
||||
"generic_views_count": "{{count}} προβολή",
|
||||
"generic_views_count_plural": "{{count}} προβολές",
|
||||
"generic_videos_count": "{{count}} βίντεο",
|
||||
"generic_videos_count_plural": "{{count}} βίντεο",
|
||||
"preferences_quality_option_hd720": "HD720",
|
||||
"preferences_quality_option_medium": "Μεσαία",
|
||||
"preferences_quality_option_small": "Μικρό",
|
||||
"preferences_quality_option_dash": "DASH (προσαρμοστική ποιότητα)",
|
||||
"preferences_quality_dash_option_4320p": "4320p",
|
||||
"preferences_quality_dash_option_720p": "720p",
|
||||
"invidious": "Invidious",
|
||||
"preferences_region_label": "Χώρα περιεχομένου: ",
|
||||
"preferences_category_misc": "Διάφορες προτιμήσεις",
|
||||
"Show more": "Εμφάνιση περισσότερων",
|
||||
"today": "Σήμερα",
|
||||
"360": "360°",
|
||||
"videoinfo_started_streaming_x_ago": "Ξεκίνησε η ροή `x` πριν από",
|
||||
"videoinfo_watch_on_youTube": "Παρακολουθήστε στο YouTube",
|
||||
"download_subtitles": "Υπότιτλοι - `x` (.vtt)",
|
||||
"user_created_playlists": "`x` δημιουργημένες λίστες αναπαραγωγής",
|
||||
"user_saved_playlists": "`x` αποθηκευμένες λίστες αναπαραγωγής",
|
||||
"rating": "Αξιολόγηση",
|
||||
"relevance": "Συνάφεια",
|
||||
"purchased": "Αγορασμένο",
|
||||
"date": "Ημερομηνία μεταφόρτωσης",
|
||||
"content_type": "Τύπος",
|
||||
"duration": "Διάρκεια",
|
||||
"week": "Αυτή την εβδομάδα",
|
||||
"year": "Φέτος",
|
||||
"channel": "Κανάλι",
|
||||
"playlist": "Λίστα αναπαραγωγής",
|
||||
"long": "Μεγάλο (> 20 λεπτά)",
|
||||
"hd": "HD",
|
||||
"location": "Τοποθεσία",
|
||||
"3d": "3D",
|
||||
"next_steps_error_message": "Μετά από αυτό θα πρέπει να προσπαθήσετε να: ",
|
||||
"next_steps_error_message_go_to_youtube": "Μεταβείτε στο YouTube",
|
||||
"footer_donate_page": "Δωρεά",
|
||||
"footer_original_source_code": "Πρωτότυπος πηγαίος κώδικας",
|
||||
"preferences_show_nick_label": "Εμφάνιση ψευδώνυμου στην κορυφή: ",
|
||||
"hour": "Τελευταία ώρα",
|
||||
"adminprefs_modified_source_code_url_label": "URL σε αποθετήριο τροποποιημένου πηγαίου κώδικα",
|
||||
"subtitles": "Υπότιτλοι/CC",
|
||||
"month": "Αυτόν τον μήνα",
|
||||
"Released under the AGPLv3 on Github.": "Κυκλοφορεί υπό την AGPLv3 στο Github.",
|
||||
"sort": "Ταξινόμηση κατά",
|
||||
"filter": "Φίλτρο",
|
||||
"movie": "Ταινία",
|
||||
"footer_modfied_source_code": "Τροποποιημένος πηγαίος κώδικας",
|
||||
"features": "Χαρακτηριστικά",
|
||||
"4k": "4K",
|
||||
"footer_documentation": "Τεκμηρίωση",
|
||||
"short": "Σύντομο (< 4 λεπτά)",
|
||||
"next_steps_error_message_refresh": "Ανανέωση",
|
||||
"video": "Βίντεο",
|
||||
"live": "Ζωντανά",
|
||||
"creative_commons": "Creative Commons",
|
||||
"Search": "Αναζήτηση",
|
||||
"hdr": "HDR",
|
||||
"preferences_extend_desc_label": "Αυτόματη επέκταση της περιγραφής του βίντεο: ",
|
||||
"preferences_vr_mode_label": "Διαδραστικά βίντεο 360 μοιρών (απαιτεί WebGL): ",
|
||||
"Show less": "Εμφάνιση λιγότερων",
|
||||
"footer_source_code": "Πηγαίος κώδικας",
|
||||
"Chinese (Taiwan)": "Κινέζικα (Ταϊβάν)",
|
||||
"Portuguese (Brazil)": "Πορτογαλικά (Βραζιλία)",
|
||||
"German (auto-generated)": "Γερμανικά (αυτόματη παραγωγή)",
|
||||
"Korean (auto-generated)": "Κορεάτικα (αυτόματη παραγωγή)",
|
||||
"Russian (auto-generated)": "Ρωσικά (αυτόματη παραγωγή)",
|
||||
"Spanish (auto-generated)": "Ισπανικά (αυτόματη παραγωγή)",
|
||||
"Vietnamese (auto-generated)": "Βιετναμέζικα (αυτόματη παραγωγή)",
|
||||
"English (United Kingdom)": "Αγγλικά (Ηνωμένο Βασίλειο)",
|
||||
"English (United States)": "Αγγλικά (Ηνωμένων Πολιτειών)",
|
||||
"Cantonese (Hong Kong)": "Καντονέζικα (Χονγκ Κονγκ)",
|
||||
"Chinese": "Κινεζικά",
|
||||
"Chinese (China)": "Κινέζικα (Κίνα)",
|
||||
"Chinese (Hong Kong)": "Κινεζικά (Χονγκ Κονγκ)",
|
||||
"Dutch (auto-generated)": "Ολαμδικά (αυτόματη παραγωγή)",
|
||||
"French (auto-generated)": "Γαλλικά (αυτόματη παραγωγή)",
|
||||
"Interlingue": "Ιντερλίνγκουα",
|
||||
"Indonesian (auto-generated)": "Ινδονησιακά (αυτόματη παραγωγή)",
|
||||
"Italian (auto-generated)": "Ιταλικά (αυτόματη παραγωγή)",
|
||||
"Japanese (auto-generated)": "Ιαπωνικά (αυτόματη παραγωγή)",
|
||||
"Portuguese (auto-generated)": "Πορτογαλικά (αυτόματη παραγωγή)",
|
||||
"Spanish (Mexico)": "Ισπανικά (Μεξικό)",
|
||||
"Spanish (Spain)": "Ισπανικά (Ισπανία)",
|
||||
"Turkish (auto-generated)": "Τούρκικα (αυτόματη παραγωγή)",
|
||||
"none": "κανένα",
|
||||
"videoinfo_youTube_embed_link": "Ενσωμάτωση",
|
||||
"videoinfo_invidious_embed_link": "Σύνδεσμος Ενσωμάτωσης",
|
||||
"show": "Μπάρα προόδου διαβάσματος"
|
||||
}
|
||||
|
||||
@@ -1,16 +1,14 @@
|
||||
{
|
||||
"`x` subscribers": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` subscriber",
|
||||
"": "`x` subscribers"
|
||||
},
|
||||
"`x` videos": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` video",
|
||||
"": "`x` videos"
|
||||
},
|
||||
"`x` playlists": {
|
||||
"(\\D|^)1(\\D|$)": "`x` playlist",
|
||||
"": "`x` playlists"
|
||||
},
|
||||
"generic_views_count": "{{count}} view",
|
||||
"generic_views_count_plural": "{{count}} views",
|
||||
"generic_videos_count": "{{count}} video",
|
||||
"generic_videos_count_plural": "{{count}} videos",
|
||||
"generic_playlists_count": "{{count}} playlist",
|
||||
"generic_playlists_count_plural": "{{count}} playlists",
|
||||
"generic_subscribers_count": "{{count}} subscriber",
|
||||
"generic_subscribers_count_plural": "{{count}} subscribers",
|
||||
"generic_subscriptions_count": "{{count}} subscription",
|
||||
"generic_subscriptions_count_plural": "{{count}} subscriptions",
|
||||
"LIVE": "LIVE",
|
||||
"Shared `x` ago": "Shared `x` ago",
|
||||
"Unsubscribe": "Unsubscribe",
|
||||
@@ -33,15 +31,15 @@
|
||||
"No": "No",
|
||||
"Import and Export Data": "Import and Export Data",
|
||||
"Import": "Import",
|
||||
"Import Invidious data": "Import Invidious data",
|
||||
"Import YouTube subscriptions": "Import YouTube subscriptions",
|
||||
"Import Invidious data": "Import Invidious JSON data",
|
||||
"Import YouTube subscriptions": "Import YouTube/OPML subscriptions",
|
||||
"Import FreeTube subscriptions (.db)": "Import FreeTube subscriptions (.db)",
|
||||
"Import NewPipe subscriptions (.json)": "Import NewPipe subscriptions (.json)",
|
||||
"Import NewPipe data (.zip)": "Import NewPipe data (.zip)",
|
||||
"Export": "Export",
|
||||
"Export subscriptions as OPML": "Export subscriptions as OPML",
|
||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Export subscriptions as OPML (for NewPipe & FreeTube)",
|
||||
"Export data as JSON": "Export data as JSON",
|
||||
"Export data as JSON": "Export Invidious data as JSON",
|
||||
"Delete account?": "Delete account?",
|
||||
"History": "History",
|
||||
"An alternative front-end to YouTube": "An alternative front-end to YouTube",
|
||||
@@ -60,35 +58,60 @@
|
||||
"E-mail": "E-mail",
|
||||
"Google verification code": "Google verification code",
|
||||
"Preferences": "Preferences",
|
||||
"Player preferences": "Player preferences",
|
||||
"Always loop: ": "Always loop: ",
|
||||
"Autoplay: ": "Autoplay: ",
|
||||
"Play next by default: ": "Play next by default: ",
|
||||
"Autoplay next video: ": "Autoplay next video: ",
|
||||
"Listen by default: ": "Listen by default: ",
|
||||
"Proxy videos: ": "Proxy videos: ",
|
||||
"Default speed: ": "Default speed: ",
|
||||
"Preferred video quality: ": "Preferred video quality: ",
|
||||
"Player volume: ": "Player volume: ",
|
||||
"Default comments: ": "Default comments: ",
|
||||
"youtube": "youtube",
|
||||
"reddit": "reddit",
|
||||
"Default captions: ": "Default captions: ",
|
||||
"preferences_category_player": "Player preferences",
|
||||
"preferences_video_loop_label": "Always loop: ",
|
||||
"preferences_autoplay_label": "Autoplay: ",
|
||||
"preferences_continue_label": "Play next by default: ",
|
||||
"preferences_continue_autoplay_label": "Autoplay next video: ",
|
||||
"preferences_listen_label": "Listen by default: ",
|
||||
"preferences_local_label": "Proxy videos: ",
|
||||
"preferences_watch_history_label": "Enable watch history: ",
|
||||
"preferences_notifications_label": "Enable notifications: ",
|
||||
"preferences_speed_label": "Default speed: ",
|
||||
"preferences_quality_label": "Preferred video quality: ",
|
||||
"preferences_quality_option_dash": "DASH (adaptative quality)",
|
||||
"preferences_quality_option_hd720": "HD720",
|
||||
"preferences_quality_option_medium": "Medium",
|
||||
"preferences_quality_option_small": "Small",
|
||||
"preferences_quality_dash_label": "Preferred DASH video quality: ",
|
||||
"preferences_quality_dash_option_auto": "Auto",
|
||||
"preferences_quality_dash_option_best": "Best",
|
||||
"preferences_quality_dash_option_worst": "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_volume_label": "Player volume: ",
|
||||
"preferences_comments_label": "Default comments: ",
|
||||
"youtube": "YouTube",
|
||||
"reddit": "Reddit",
|
||||
"invidious": "Invidious",
|
||||
"preferences_captions_label": "Default captions: ",
|
||||
"Fallback captions: ": "Fallback captions: ",
|
||||
"Show related videos: ": "Show related videos: ",
|
||||
"Show annotations by default: ": "Show annotations by default: ",
|
||||
"Visual preferences": "Visual preferences",
|
||||
"Player style: ": "Player style: ",
|
||||
"preferences_related_videos_label": "Show related videos: ",
|
||||
"preferences_annotations_label": "Show annotations by default: ",
|
||||
"preferences_extend_desc_label": "Automatically extend video description: ",
|
||||
"preferences_vr_mode_label": "Interactive 360 degree videos (requires WebGL): ",
|
||||
"preferences_category_visual": "Visual preferences",
|
||||
"preferences_region_label": "Content country: ",
|
||||
"preferences_player_style_label": "Player style: ",
|
||||
"Dark mode: ": "Dark mode: ",
|
||||
"Theme: ": "Theme: ",
|
||||
"preferences_dark_mode_label": "Theme: ",
|
||||
"dark": "dark",
|
||||
"light": "light",
|
||||
"Thin mode: ": "Thin mode: ",
|
||||
"Subscription preferences": "Subscription preferences",
|
||||
"Show annotations by default for subscribed channels: ": "Show annotations by default for subscribed channels? ",
|
||||
"preferences_thin_mode_label": "Thin mode: ",
|
||||
"preferences_category_misc": "Miscellaneous preferences",
|
||||
"preferences_automatic_instance_redirect_label": "Automatic instance redirection (fallback to redirect.invidious.io): ",
|
||||
"preferences_category_subscription": "Subscription preferences",
|
||||
"preferences_annotations_subscribed_label": "Show annotations by default for subscribed channels? ",
|
||||
"Redirect homepage to feed: ": "Redirect homepage to feed: ",
|
||||
"Number of videos shown in feed: ": "Number of videos shown in feed: ",
|
||||
"Sort videos by: ": "Sort videos by: ",
|
||||
"preferences_max_results_label": "Number of videos shown in feed: ",
|
||||
"preferences_sort_label": "Sort videos by: ",
|
||||
"published": "published",
|
||||
"published - reverse": "published - reverse",
|
||||
"alphabetically": "alphabetically",
|
||||
@@ -97,12 +120,12 @@
|
||||
"channel name - reverse": "channel name - reverse",
|
||||
"Only show latest video from channel: ": "Only show latest video from channel: ",
|
||||
"Only show latest unwatched video from channel: ": "Only show latest unwatched video from channel: ",
|
||||
"Only show unwatched: ": "Only show unwatched: ",
|
||||
"Only show notifications (if there are any): ": "Only show notifications (if there are any): ",
|
||||
"preferences_unseen_only_label": "Only show unwatched: ",
|
||||
"preferences_notifications_only_label": "Only show notifications (if there are any): ",
|
||||
"Enable web notifications": "Enable web notifications",
|
||||
"`x` uploaded a video": "`x` uploaded a video",
|
||||
"`x` is live": "`x` is live",
|
||||
"Data preferences": "Data preferences",
|
||||
"preferences_category_data": "Data preferences",
|
||||
"Clear watch history": "Clear watch history",
|
||||
"Import/export data": "Import/export data",
|
||||
"Change password": "Change password",
|
||||
@@ -110,9 +133,10 @@
|
||||
"Manage tokens": "Manage tokens",
|
||||
"Watch history": "Watch history",
|
||||
"Delete account": "Delete account",
|
||||
"Administrator preferences": "Administrator preferences",
|
||||
"Default homepage: ": "Default homepage: ",
|
||||
"Feed menu: ": "Feed menu: ",
|
||||
"preferences_category_admin": "Administrator preferences",
|
||||
"preferences_default_home_label": "Default homepage: ",
|
||||
"preferences_feed_menu_label": "Feed menu: ",
|
||||
"preferences_show_nick_label": "Show nickname on top: ",
|
||||
"Top enabled: ": "Top enabled: ",
|
||||
"CAPTCHA enabled: ": "CAPTCHA enabled: ",
|
||||
"Login enabled: ": "Login enabled: ",
|
||||
@@ -122,25 +146,17 @@
|
||||
"Subscription manager": "Subscription manager",
|
||||
"Token manager": "Token manager",
|
||||
"Token": "Token",
|
||||
"`x` subscriptions": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` subscription",
|
||||
"": "`x` subscriptions"
|
||||
},
|
||||
"`x` tokens": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` token",
|
||||
"": "`x` tokens"
|
||||
},
|
||||
"tokens_count": "{{count}} token",
|
||||
"tokens_count_plural": "{{count}} tokens",
|
||||
"Import/export": "Import/export",
|
||||
"unsubscribe": "unsubscribe",
|
||||
"revoke": "revoke",
|
||||
"Subscriptions": "Subscriptions",
|
||||
"`x` unseen notifications": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` unseen notification",
|
||||
"": "`x` unseen notifications"
|
||||
},
|
||||
"subscriptions_unseen_notifs_count": "{{count}} unseen notification",
|
||||
"subscriptions_unseen_notifs_count_plural": "{{count}} unseen notifications",
|
||||
"search": "search",
|
||||
"Log out": "Log out",
|
||||
"Released under the AGPLv3 by Omar Roth.": "Released under the AGPLv3 by Omar Roth.",
|
||||
"Released under the AGPLv3 on Github.": "Released under the AGPLv3 on Github.",
|
||||
"Source available here.": "Source available here.",
|
||||
"View JavaScript license information.": "View JavaScript license information.",
|
||||
"View privacy policy.": "View privacy policy.",
|
||||
@@ -156,7 +172,11 @@
|
||||
"Title": "Title",
|
||||
"Playlist privacy": "Playlist privacy",
|
||||
"Editing playlist `x`": "Editing playlist `x`",
|
||||
"Show more": "Show more",
|
||||
"Show less": "Show less",
|
||||
"Watch on YouTube": "Watch on YouTube",
|
||||
"Switch Invidious Instance": "Switch Invidious Instance",
|
||||
"Broken? Try another Invidious Instance": "Broken? Try another Invidious Instance",
|
||||
"Hide annotations": "Hide annotations",
|
||||
"Show annotations": "Show annotations",
|
||||
"Genre: ": "Genre: ",
|
||||
@@ -167,17 +187,13 @@
|
||||
"Whitelisted regions: ": "Whitelisted regions: ",
|
||||
"Blacklisted regions: ": "Blacklisted regions: ",
|
||||
"Shared `x`": "Shared `x`",
|
||||
"`x` views": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` view",
|
||||
"": "`x` views"
|
||||
},
|
||||
"Premieres in `x`": "Premieres in `x`",
|
||||
"Premieres `x`": "Premieres `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.": "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": "View YouTube comments",
|
||||
"View more comments on Reddit": "View more comments on Reddit",
|
||||
"View `x` comments": {
|
||||
"(\\D|^)1(\\D|$)": "View `x` comment",
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "View `x` comment",
|
||||
"": "View `x` comments"
|
||||
},
|
||||
"View Reddit comments": "View Reddit comments",
|
||||
@@ -204,16 +220,12 @@
|
||||
"This channel does not exist.": "This channel does not exist.",
|
||||
"Could not get channel info.": "Could not get channel info.",
|
||||
"Could not fetch comments": "Could not fetch comments",
|
||||
"View `x` replies": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "View `x` reply",
|
||||
"": "View `x` replies"
|
||||
},
|
||||
"comments_view_x_replies": "View {{count}} reply",
|
||||
"comments_view_x_replies_plural": "View {{count}} replies",
|
||||
"`x` ago": "`x` ago",
|
||||
"Load more": "Load more",
|
||||
"`x` points": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` point",
|
||||
"": "`x` points"
|
||||
},
|
||||
"comments_points_count": "{{count}} point",
|
||||
"comments_points_count_plural": "{{count}} points",
|
||||
"Could not create mix.": "Could not create mix.",
|
||||
"Empty playlist": "Empty playlist",
|
||||
"Not a playlist.": "Not a playlist.",
|
||||
@@ -226,6 +238,8 @@
|
||||
"No such user": "No such user",
|
||||
"Token is expired, please try again": "Token is expired, please try again",
|
||||
"English": "English",
|
||||
"English (United Kingdom)": "English (United Kingdom)",
|
||||
"English (United States)": "English (United States)",
|
||||
"English (auto-generated)": "English (auto-generated)",
|
||||
"Afrikaans": "Afrikaans",
|
||||
"Albanian": "Albanian",
|
||||
@@ -239,23 +253,31 @@
|
||||
"Bosnian": "Bosnian",
|
||||
"Bulgarian": "Bulgarian",
|
||||
"Burmese": "Burmese",
|
||||
"Cantonese (Hong Kong)": "Cantonese (Hong Kong)",
|
||||
"Catalan": "Catalan",
|
||||
"Cebuano": "Cebuano",
|
||||
"Chinese": "Chinese",
|
||||
"Chinese (China)": "Chinese (China)",
|
||||
"Chinese (Hong Kong)": "Chinese (Hong Kong)",
|
||||
"Chinese (Simplified)": "Chinese (Simplified)",
|
||||
"Chinese (Taiwan)": "Chinese (Taiwan)",
|
||||
"Chinese (Traditional)": "Chinese (Traditional)",
|
||||
"Corsican": "Corsican",
|
||||
"Croatian": "Croatian",
|
||||
"Czech": "Czech",
|
||||
"Danish": "Danish",
|
||||
"Dutch": "Dutch",
|
||||
"Dutch (auto-generated)": "Dutch (auto-generated)",
|
||||
"Esperanto": "Esperanto",
|
||||
"Estonian": "Estonian",
|
||||
"Filipino": "Filipino",
|
||||
"Finnish": "Finnish",
|
||||
"French": "French",
|
||||
"French (auto-generated)": "French (auto-generated)",
|
||||
"Galician": "Galician",
|
||||
"Georgian": "Georgian",
|
||||
"German": "German",
|
||||
"German (auto-generated)": "German (auto-generated)",
|
||||
"Greek": "Greek",
|
||||
"Gujarati": "Gujarati",
|
||||
"Haitian Creole": "Haitian Creole",
|
||||
@@ -268,14 +290,19 @@
|
||||
"Icelandic": "Icelandic",
|
||||
"Igbo": "Igbo",
|
||||
"Indonesian": "Indonesian",
|
||||
"Indonesian (auto-generated)": "Indonesian (auto-generated)",
|
||||
"Interlingue": "Interlingue",
|
||||
"Irish": "Irish",
|
||||
"Italian": "Italian",
|
||||
"Italian (auto-generated)": "Italian (auto-generated)",
|
||||
"Japanese": "Japanese",
|
||||
"Japanese (auto-generated)": "Japanese (auto-generated)",
|
||||
"Javanese": "Javanese",
|
||||
"Kannada": "Kannada",
|
||||
"Kazakh": "Kazakh",
|
||||
"Khmer": "Khmer",
|
||||
"Korean": "Korean",
|
||||
"Korean (auto-generated)": "Korean (auto-generated)",
|
||||
"Kurdish": "Kurdish",
|
||||
"Kyrgyz": "Kyrgyz",
|
||||
"Lao": "Lao",
|
||||
@@ -298,9 +325,12 @@
|
||||
"Persian": "Persian",
|
||||
"Polish": "Polish",
|
||||
"Portuguese": "Portuguese",
|
||||
"Portuguese (auto-generated)": "Portuguese (auto-generated)",
|
||||
"Portuguese (Brazil)": "Portuguese (Brazil)",
|
||||
"Punjabi": "Punjabi",
|
||||
"Romanian": "Romanian",
|
||||
"Russian": "Russian",
|
||||
"Russian (auto-generated)": "Russian (auto-generated)",
|
||||
"Samoan": "Samoan",
|
||||
"Scottish Gaelic": "Scottish Gaelic",
|
||||
"Serbian": "Serbian",
|
||||
@@ -312,7 +342,10 @@
|
||||
"Somali": "Somali",
|
||||
"Southern Sotho": "Southern Sotho",
|
||||
"Spanish": "Spanish",
|
||||
"Spanish (auto-generated)": "Spanish (auto-generated)",
|
||||
"Spanish (Latin America)": "Spanish (Latin America)",
|
||||
"Spanish (Mexico)": "Spanish (Mexico)",
|
||||
"Spanish (Spain)": "Spanish (Spain)",
|
||||
"Sundanese": "Sundanese",
|
||||
"Swahili": "Swahili",
|
||||
"Swedish": "Swedish",
|
||||
@@ -321,50 +354,39 @@
|
||||
"Telugu": "Telugu",
|
||||
"Thai": "Thai",
|
||||
"Turkish": "Turkish",
|
||||
"Turkish (auto-generated)": "Turkish (auto-generated)",
|
||||
"Ukrainian": "Ukrainian",
|
||||
"Urdu": "Urdu",
|
||||
"Uzbek": "Uzbek",
|
||||
"Vietnamese": "Vietnamese",
|
||||
"Vietnamese (auto-generated)": "Vietnamese (auto-generated)",
|
||||
"Welsh": "Welsh",
|
||||
"Western Frisian": "Western Frisian",
|
||||
"Xhosa": "Xhosa",
|
||||
"Yiddish": "Yiddish",
|
||||
"Yoruba": "Yoruba",
|
||||
"Zulu": "Zulu",
|
||||
"`x` years": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` year",
|
||||
"": "`x` years"
|
||||
},
|
||||
"`x` months": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` month",
|
||||
"": "`x` months"
|
||||
},
|
||||
"`x` weeks": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` week",
|
||||
"": "`x` weeks"
|
||||
},
|
||||
"`x` days": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` day",
|
||||
"": "`x` days"
|
||||
},
|
||||
"`x` hours": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` hour",
|
||||
"": "`x` hours"
|
||||
},
|
||||
"`x` minutes": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` minute",
|
||||
"": "`x` minutes"
|
||||
},
|
||||
"`x` seconds": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "`x` second",
|
||||
"": "`x` seconds"
|
||||
},
|
||||
"generic_count_years": "{{count}} year",
|
||||
"generic_count_years_plural": "{{count}} years",
|
||||
"generic_count_months": "{{count}} month",
|
||||
"generic_count_months_plural": "{{count}} months",
|
||||
"generic_count_weeks": "{{count}} week",
|
||||
"generic_count_weeks_plural": "{{count}} weeks",
|
||||
"generic_count_days": "{{count}} day",
|
||||
"generic_count_days_plural": "{{count}} days",
|
||||
"generic_count_hours": "{{count}} hour",
|
||||
"generic_count_hours_plural": "{{count}} hours",
|
||||
"generic_count_minutes": "{{count}} minute",
|
||||
"generic_count_minutes_plural": "{{count}} minutes",
|
||||
"generic_count_seconds": "{{count}} second",
|
||||
"generic_count_seconds_plural": "{{count}} seconds",
|
||||
"Fallback comments: ": "Fallback comments: ",
|
||||
"Popular": "Popular",
|
||||
"Search": "Search",
|
||||
"Top": "Top",
|
||||
"About": "About",
|
||||
"Rating: ": "Rating: ",
|
||||
"Language: ": "Language: ",
|
||||
"preferences_locale_label": "Language: ",
|
||||
"View as playlist": "View as playlist",
|
||||
"Default": "Default",
|
||||
"Music": "Music",
|
||||
@@ -383,5 +405,62 @@
|
||||
"Videos": "Videos",
|
||||
"Playlists": "Playlists",
|
||||
"Community": "Community",
|
||||
"Current version: ": "Current version: "
|
||||
}
|
||||
"relevance": "Relevance",
|
||||
"rating": "Rating",
|
||||
"date": "Upload date",
|
||||
"views": "View count",
|
||||
"content_type": "Type",
|
||||
"duration": "Duration",
|
||||
"features": "Features",
|
||||
"sort": "Sort By",
|
||||
"hour": "Last Hour",
|
||||
"today": "Today",
|
||||
"week": "This week",
|
||||
"month": "This month",
|
||||
"year": "This year",
|
||||
"video": "Video",
|
||||
"channel": "Channel",
|
||||
"playlist": "Playlist",
|
||||
"movie": "Movie",
|
||||
"show": "Show",
|
||||
"short": "Short (< 4 minutes)",
|
||||
"long": "Long (> 20 minutes)",
|
||||
"hd": "HD",
|
||||
"subtitles": "Subtitles/CC",
|
||||
"creative_commons": "Creative Commons",
|
||||
"3d": "3D",
|
||||
"live": "Live",
|
||||
"4k": "4K",
|
||||
"location": "Location",
|
||||
"hdr": "HDR",
|
||||
"purchased": "Purchased",
|
||||
"360": "360°",
|
||||
"filter": "Filter",
|
||||
"Current version: ": "Current version: ",
|
||||
"next_steps_error_message": "After which you should try to: ",
|
||||
"next_steps_error_message_refresh": "Refresh",
|
||||
"next_steps_error_message_go_to_youtube": "Go to YouTube",
|
||||
"footer_donate_page": "Donate",
|
||||
"footer_documentation": "Documentation",
|
||||
"footer_source_code": "Source code",
|
||||
"footer_original_source_code": "Original source code",
|
||||
"footer_modfied_source_code": "Modified Source code",
|
||||
"adminprefs_modified_source_code_url_label": "URL to modified source code repository",
|
||||
"none": "none",
|
||||
"videoinfo_started_streaming_x_ago": "Started streaming `x` ago",
|
||||
"videoinfo_watch_on_youTube": "Watch on YouTube",
|
||||
"videoinfo_youTube_embed_link": "Embed",
|
||||
"videoinfo_invidious_embed_link": "Embed Link",
|
||||
"download_subtitles": "Subtitles - `x` (.vtt)",
|
||||
"user_created_playlists": "`x` created playlists",
|
||||
"user_saved_playlists": "`x` saved playlists",
|
||||
"Video unavailable": "Video unavailable",
|
||||
"preferences_save_player_pos_label": "Save playback position: ",
|
||||
"crash_page_you_found_a_bug": "It looks like you found a bug in Invidious!",
|
||||
"crash_page_before_reporting": "Before reporting a bug, make sure that you have:",
|
||||
"crash_page_refresh": "tried to <a href=\"`x`\">refresh the page</a>",
|
||||
"crash_page_switch_instance": "tried to <a href=\"`x`\">use another instance</a>",
|
||||
"crash_page_read_the_faq": "read the <a href=\"`x`\">Frenquently Asked Questions (FAQ)</a>",
|
||||
"crash_page_search_issue": "searched for <a href=\"`x`\">existing issues on Github</a>",
|
||||
"crash_page_report_issue": "If none of the above helped, please <a href=\"`x`\">open a new issue on GitHub</a> (preferably in English) and include the following text in your message (do NOT translate that text):"
|
||||
}
|
||||
|
||||
189
locales/eo.json
189
locales/eo.json
@@ -1,13 +1,10 @@
|
||||
{
|
||||
"`x` subscribers": "`x` abonantoj",
|
||||
"`x` videos": "`x` videoj",
|
||||
"`x` playlists": "",
|
||||
"LIVE": "NUNA",
|
||||
"Shared `x` ago": "Konigita antaŭ `x`",
|
||||
"Unsubscribe": "Malaboni",
|
||||
"Subscribe": "Aboni",
|
||||
"View channel on YouTube": "Vidi kanalon en YouTube",
|
||||
"View playlist on YouTube": "Vidi ludliston en YouTube",
|
||||
"Unsubscribe": "Malabonu",
|
||||
"Subscribe": "Abonu",
|
||||
"View channel on YouTube": "Vidu kanalon en JuTubo",
|
||||
"View playlist on YouTube": "Vidu ludliston en JuTubo",
|
||||
"newest": "pli novaj",
|
||||
"oldest": "pli malnovaj",
|
||||
"popular": "popularaj",
|
||||
@@ -25,7 +22,7 @@
|
||||
"Import and Export Data": "Importi kaj Eksporti Datumojn",
|
||||
"Import": "Importi",
|
||||
"Import Invidious data": "Importi datumojn de Invidious",
|
||||
"Import YouTube subscriptions": "Importi abonojn de YouTube",
|
||||
"Import YouTube subscriptions": "Importi abonojn de JuTubo",
|
||||
"Import FreeTube subscriptions (.db)": "Importi abonojn de FreeTube (.db)",
|
||||
"Import NewPipe subscriptions (.json)": "Importi abonojn de NewPipe (.json)",
|
||||
"Import NewPipe data (.zip)": "Importi datumojn de NewPipe (.zip)",
|
||||
@@ -35,7 +32,7 @@
|
||||
"Export data as JSON": "Eksporti datumojn kiel JSON",
|
||||
"Delete account?": "Ĉu forigi konton?",
|
||||
"History": "Historio",
|
||||
"An alternative front-end to YouTube": "Alternativa fasado al YouTube",
|
||||
"An alternative front-end to YouTube": "Alternativa fasado al JuTubo",
|
||||
"JavaScript license information": "Ĝavoskripta licenca informo",
|
||||
"source": "fonto",
|
||||
"Log in": "Ensaluti",
|
||||
@@ -51,49 +48,53 @@
|
||||
"E-mail": "Retpoŝto",
|
||||
"Google verification code": "Kontrolkodo de Google",
|
||||
"Preferences": "Agordoj",
|
||||
"Player preferences": "Spektilaj agordoj",
|
||||
"Always loop: ": "Ĉiam ripeti: ",
|
||||
"Autoplay: ": "Aŭtomate ludi: ",
|
||||
"Play next by default: ": "Ludi sekvan defaŭlte: ",
|
||||
"Autoplay next video: ": "Aŭtomate ludi sekvan videon: ",
|
||||
"Listen by default: ": "Aŭskulti defaŭlte: ",
|
||||
"Proxy videos: ": "Ĉu uzi prokuran servilon por videoj? ",
|
||||
"Default speed: ": "Defaŭlta rapido: ",
|
||||
"Preferred video quality: ": "Preferita videkvalito: ",
|
||||
"Player volume: ": "Ludila sonforteco: ",
|
||||
"Default comments: ": "Defaŭltaj komentoj: ",
|
||||
"youtube": "youtube",
|
||||
"reddit": "reddit",
|
||||
"Default captions: ": "Defaŭltaj subtekstoj: ",
|
||||
"preferences_category_player": "Spektilaj agordoj",
|
||||
"preferences_video_loop_label": "Ĉiam ripeti: ",
|
||||
"preferences_autoplay_label": "Aŭtomate ludi: ",
|
||||
"preferences_continue_label": "Ludi sekvan defaŭlte: ",
|
||||
"preferences_continue_autoplay_label": "Aŭtomate ludi sekvan filmeton: ",
|
||||
"preferences_listen_label": "Aŭskulti defaŭlte: ",
|
||||
"preferences_local_label": "Ĉu uzi prokuran servilon por filmetojn? ",
|
||||
"preferences_speed_label": "Defaŭlta rapido: ",
|
||||
"preferences_quality_label": "Preferita filmetkvalito: ",
|
||||
"preferences_volume_label": "Ludila sonforteco: ",
|
||||
"preferences_comments_label": "Defaŭltaj komentoj: ",
|
||||
"youtube": "JuTubo",
|
||||
"reddit": "Reddit",
|
||||
"preferences_captions_label": "Defaŭltaj subtekstoj: ",
|
||||
"Fallback captions: ": "Retrodefaŭltaj subtekstoj: ",
|
||||
"Show related videos: ": "Ĉu montri rilatajn videojn? ",
|
||||
"Show annotations by default: ": "Ĉu montri prinotojn defaŭlte? ",
|
||||
"Visual preferences": "Vidaj preferoj",
|
||||
"Player style: ": "Ludila stilo: ",
|
||||
"preferences_related_videos_label": "Ĉu montri rilatajn filmetojn? ",
|
||||
"preferences_annotations_label": "Ĉu montri prinotojn defaŭlte? ",
|
||||
"preferences_extend_desc_label": "Aŭtomate etendi priskribon de filmeto: ",
|
||||
"preferences_vr_mode_label": "Interagaj 360-gradaj filmetoj: ",
|
||||
"preferences_category_visual": "Vidaj preferoj",
|
||||
"preferences_player_style_label": "Ludila stilo: ",
|
||||
"Dark mode: ": "Malhela reĝimo: ",
|
||||
"Theme: ": "Etoso: ",
|
||||
"preferences_dark_mode_label": "Etoso: ",
|
||||
"dark": "malhela",
|
||||
"light": "hela",
|
||||
"Thin mode: ": "Maldika reĝimo: ",
|
||||
"Subscription preferences": "Abonaj agordoj",
|
||||
"Show annotations by default for subscribed channels: ": "Ĉu montri prinotojn defaŭlte por abonitaj kanaloj? ",
|
||||
"preferences_thin_mode_label": "Maldika reĝimo: ",
|
||||
"preferences_category_misc": "Aliaj agordoj",
|
||||
"preferences_automatic_instance_redirect_label": "Aŭtomata alidirektado de instalaĵo (retropaŝo al redirect.invidious.io): ",
|
||||
"preferences_category_subscription": "Abonaj agordoj",
|
||||
"preferences_annotations_subscribed_label": "Ĉu montri prinotojn defaŭlte por abonitaj kanaloj? ",
|
||||
"Redirect homepage to feed: ": "Alidirekti hejmpâgon al fluo: ",
|
||||
"Number of videos shown in feed: ": "Nombro da videoj montritaj en fluo: ",
|
||||
"Sort videos by: ": "Ordi videojn laŭ: ",
|
||||
"preferences_max_results_label": "Nombro da filmetoj montritaj en fluo: ",
|
||||
"preferences_sort_label": "Ordi filmetojn per: ",
|
||||
"published": "publikigo",
|
||||
"published - reverse": "publitigo - renverse",
|
||||
"alphabetically": "alfabete",
|
||||
"alphabetically - reverse": "alfabete - renverse",
|
||||
"channel name": "kanala nombro",
|
||||
"channel name - reverse": "kanala nombro - renverse",
|
||||
"Only show latest video from channel: ": "Nur montri pli novan videon el kanalo: ",
|
||||
"Only show latest unwatched video from channel: ": "Nur montri pli novan malviditan videon el kanalo: ",
|
||||
"Only show unwatched: ": "Nur montri malviditajn: ",
|
||||
"Only show notifications (if there are any): ": "Nur montri sciigojn (se estas): ",
|
||||
"Only show latest video from channel: ": "Nur montri pli novan filmeton el kanalo: ",
|
||||
"Only show latest unwatched video from channel: ": "Nur montri pli novan malviditan filmeton el kanalo: ",
|
||||
"preferences_unseen_only_label": "Nur montri malviditajn: ",
|
||||
"preferences_notifications_only_label": "Nur montri sciigojn (se estas): ",
|
||||
"Enable web notifications": "Ebligi retejajn sciigojn",
|
||||
"`x` uploaded a video": "`x` alŝutis videon",
|
||||
"`x` uploaded a video": "`x` alŝutis filmeton",
|
||||
"`x` is live": "`x` estas nuna",
|
||||
"Data preferences": "Datumagordoj",
|
||||
"preferences_category_data": "Datumagordoj",
|
||||
"Clear watch history": "Forigi vidohistorion",
|
||||
"Import/export data": "Importi/Eksporti datumojn",
|
||||
"Change password": "Ŝanĝi pasvorton",
|
||||
@@ -101,9 +102,10 @@
|
||||
"Manage tokens": "Administri ĵetonojn",
|
||||
"Watch history": "Vidohistorio",
|
||||
"Delete account": "Forigi konton",
|
||||
"Administrator preferences": "Agordoj de administranto",
|
||||
"Default homepage: ": "Defaŭlta hejmpaĝo: ",
|
||||
"Feed menu: ": "Flua menuo: ",
|
||||
"preferences_category_admin": "Agordoj de administranto",
|
||||
"preferences_default_home_label": "Defaŭlta hejmpaĝo: ",
|
||||
"preferences_feed_menu_label": "Flua menuo: ",
|
||||
"preferences_show_nick_label": "Montri kromnomon supre: ",
|
||||
"Top enabled: ": "Ĉu pli bonaj ŝaltitaj? ",
|
||||
"CAPTCHA enabled: ": "Ĉu CAPTCHA ŝaltita? ",
|
||||
"Login enabled: ": "Ĉu ensaluto aktivita? ",
|
||||
@@ -113,32 +115,33 @@
|
||||
"Subscription manager": "Administrilo de abonoj",
|
||||
"Token manager": "Ĵetona administrilo",
|
||||
"Token": "Ĵetono",
|
||||
"`x` subscriptions": "`x` abonoj",
|
||||
"`x` tokens": "`x` ĵetonoj",
|
||||
"Import/export": "Importi/Eksporti",
|
||||
"unsubscribe": "malaboni",
|
||||
"unsubscribe": "malabonu",
|
||||
"revoke": "senvalidigi",
|
||||
"Subscriptions": "Abonoj",
|
||||
"`x` unseen notifications": "`x` neviditaj sciigoj",
|
||||
"search": "serĉi",
|
||||
"Log out": "Elsaluti",
|
||||
"Released under the AGPLv3 by Omar Roth.": "Eldonita sub la AGPLv3 de Omar Roth.",
|
||||
"Released under the AGPLv3 on Github.": "Eldonita sub la AGPLv3 en Github.",
|
||||
"Source available here.": "Fonto havebla ĉi tie.",
|
||||
"View JavaScript license information.": "Vidi Ĝavoskriptan licencan informon.",
|
||||
"View privacy policy.": "Vidi regularon pri privateco.",
|
||||
"Trending": "Tendencoj",
|
||||
"Public": "",
|
||||
"Public": "Publika",
|
||||
"Unlisted": "Ne listigita",
|
||||
"Private": "",
|
||||
"View all playlists": "",
|
||||
"Updated `x` ago": "",
|
||||
"Delete playlist `x`?": "",
|
||||
"Delete playlist": "",
|
||||
"Create playlist": "",
|
||||
"Title": "",
|
||||
"Playlist privacy": "",
|
||||
"Editing playlist `x`": "",
|
||||
"Watch on YouTube": "Vidi videon en Youtube",
|
||||
"Private": "Privata",
|
||||
"View all playlists": "Vidi ĉiujn ludlistojn",
|
||||
"Updated `x` ago": "Ĝisdatigita antaŭ `x`",
|
||||
"Delete playlist `x`?": "Ĉu forigi ludliston `x`?",
|
||||
"Delete playlist": "Forigi ludliston",
|
||||
"Create playlist": "Krei ludliston",
|
||||
"Title": "Titolo",
|
||||
"Playlist privacy": "Privateco de ludlisto",
|
||||
"Editing playlist `x`": "Redaktante ludlisto `x`",
|
||||
"Show more": "Montri pli",
|
||||
"Show less": "Montri malpli",
|
||||
"Watch on YouTube": "Vidi filmeton en JuTubo",
|
||||
"Switch Invidious Instance": "Ŝanĝi instalaĵon de Indivious",
|
||||
"Broken? Try another Invidious Instance": "Ĉu misfunkcio? Provu alian instalaĵon de Indivious",
|
||||
"Hide annotations": "Kaŝi prinotojn",
|
||||
"Show annotations": "Montri prinotojn",
|
||||
"Genre: ": "Ĝenro: ",
|
||||
@@ -149,13 +152,15 @@
|
||||
"Whitelisted regions: ": "Regionoj listigitaj en blanka listo: ",
|
||||
"Blacklisted regions: ": "Regionoj listigitaj en nigra listo: ",
|
||||
"Shared `x`": "Konigita `x`",
|
||||
"`x` views": "`x` spektaĵoj",
|
||||
"Premieres in `x`": "Premieras en `x`",
|
||||
"Premieres `x`": "Premieras `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.": "Saluton! Ŝajnas, ke vi havas Ĝavoskripton malebligitan. Klaku ĉi tie por vidi komentojn, memoru, ke la ŝargado povus daŭri iom pli.",
|
||||
"View YouTube comments": "Vidi komentojn de YouTube",
|
||||
"View YouTube comments": "Vidi komentojn de JuTubo",
|
||||
"View more comments on Reddit": "Vidi pli komentoj en Reddit",
|
||||
"View `x` comments": "Vidi `x` komentojn",
|
||||
"View `x` comments": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "Vidi `x` komentojn",
|
||||
"": "Vidi `x` komentojn"
|
||||
},
|
||||
"View Reddit comments": "Vidi komentojn de Reddit",
|
||||
"Hide replies": "Kaŝi respondojn",
|
||||
"Show replies": "Montri respondojn",
|
||||
@@ -180,10 +185,8 @@
|
||||
"This channel does not exist.": "Ĉi tiu kanalo ne ekzistas.",
|
||||
"Could not get channel info.": "Ne povis havigi kanalan informon.",
|
||||
"Could not fetch comments": "Ne povis venigi komentojn",
|
||||
"View `x` replies": "Vidi `x` respondojn",
|
||||
"`x` ago": "antaŭ `x`",
|
||||
"Load more": "Ŝarĝi pli",
|
||||
"`x` points": "`x` poentoj",
|
||||
"Could not create mix.": "Ne povis krei mikson.",
|
||||
"Empty playlist": "Ludlisto estas malplena",
|
||||
"Not a playlist.": "Nevalida ludlisto.",
|
||||
@@ -301,22 +304,16 @@
|
||||
"Yiddish": "Jida",
|
||||
"Yoruba": "Joruba",
|
||||
"Zulu": "Zulua",
|
||||
"`x` years": "`x` jaroj",
|
||||
"`x` months": "`x` monatoj",
|
||||
"`x` weeks": "`x` semajnoj",
|
||||
"`x` days": "`x` tagoj",
|
||||
"`x` hours": "`x` horoj",
|
||||
"`x` minutes": "`x` minutoj",
|
||||
"`x` seconds": "`x` sekundoj",
|
||||
"Fallback comments: ": "Retrodefaŭltaj komentoj: ",
|
||||
"Popular": "Popularaj",
|
||||
"Search": "Serĉi",
|
||||
"Top": "Supraj",
|
||||
"About": "Pri",
|
||||
"Rating: ": "Takso: ",
|
||||
"Language: ": "Lingvo: ",
|
||||
"preferences_locale_label": "Lingvo: ",
|
||||
"View as playlist": "Vidi kiel ludlisto",
|
||||
"Default": "Defaŭlte",
|
||||
"Music": "Musiko",
|
||||
"Music": "Muziko",
|
||||
"Gaming": "Komputiloludoj",
|
||||
"News": "Novaĵoj",
|
||||
"Movies": "Filmoj",
|
||||
@@ -324,13 +321,53 @@
|
||||
"Download as: ": "Elŝuti kiel: ",
|
||||
"%A %B %-d, %Y": "%A %-d de %B %Y",
|
||||
"(edited)": "(redaktita)",
|
||||
"YouTube comment permalink": "Fiksligilo de la komento en YouTube",
|
||||
"YouTube comment permalink": "Fiksligilo de la komento en JuTubo",
|
||||
"permalink": "konstanta ligilo",
|
||||
"`x` marked it with a ❤": "`x` markis ĝin per ❤",
|
||||
"Audio mode": "Aŭda reĝimo",
|
||||
"Video mode": "Videa reĝimo",
|
||||
"Videos": "Videoj",
|
||||
"Videos": "Filmetoj",
|
||||
"Playlists": "Ludlistoj",
|
||||
"Community": "Komunumo",
|
||||
"Current version: ": "Nuna versio: "
|
||||
}
|
||||
"relevance": "rilateco",
|
||||
"rating": "takso",
|
||||
"date": "dato",
|
||||
"views": "vidoj",
|
||||
"content_type": "enhavtipo",
|
||||
"duration": "daŭro",
|
||||
"features": "trajtoj",
|
||||
"sort": "ordigi",
|
||||
"hour": "horo",
|
||||
"today": "hodiaŭ",
|
||||
"week": "semajno",
|
||||
"month": "monato",
|
||||
"year": "jaro",
|
||||
"video": "filmeto",
|
||||
"channel": "kanalo",
|
||||
"playlist": "ludlisto",
|
||||
"movie": "filmo",
|
||||
"show": "spektaĵo",
|
||||
"hd": "altdistingiva",
|
||||
"subtitles": "subtekstoj",
|
||||
"creative_commons": "Krea Komunaĵo",
|
||||
"3d": "3D",
|
||||
"live": "nuna",
|
||||
"4k": "4k",
|
||||
"location": "loko",
|
||||
"hdr": "granddinamikgama",
|
||||
"filter": "filtri",
|
||||
"Current version: ": "Nuna versio: ",
|
||||
"next_steps_error_message": "Poste, vi provu: ",
|
||||
"next_steps_error_message_refresh": "Reŝargi",
|
||||
"next_steps_error_message_go_to_youtube": "Iri al JuTubo",
|
||||
"long": "Longa (> 20 minutos)",
|
||||
"short": "Mallonga (< 4 minutos)",
|
||||
"footer_documentation": "Dokumentaro",
|
||||
"footer_source_code": "Fontkodo",
|
||||
"adminprefs_modified_source_code_url_label": "URL al modifita deponejo de fontkodo",
|
||||
"footer_modfied_source_code": "Modifita Fontkodo",
|
||||
"footer_original_source_code": "Originala fontkodo",
|
||||
"footer_donate_page": "Donaci",
|
||||
"preferences_region_label": "Lando de la enhavo: ",
|
||||
"preferences_quality_dash_label": "Preferata DASH-a videkvalito: "
|
||||
}
|
||||
|
||||
271
locales/es.json
271
locales/es.json
@@ -1,7 +1,4 @@
|
||||
{
|
||||
"`x` subscribers": "`x` suscriptores",
|
||||
"`x` videos": "`x` vídeos",
|
||||
"`x` playlists": "",
|
||||
"LIVE": "DIRECTO",
|
||||
"Shared `x` ago": "Compartido hace `x`",
|
||||
"Unsubscribe": "Desuscribirse",
|
||||
@@ -24,15 +21,15 @@
|
||||
"No": "No",
|
||||
"Import and Export Data": "Importación y exportación de datos",
|
||||
"Import": "Importar",
|
||||
"Import Invidious data": "Importar datos de Invidious",
|
||||
"Import YouTube subscriptions": "Importar suscripciones de YouTube",
|
||||
"Import Invidious data": "Importar datos JSON de Invidious",
|
||||
"Import YouTube subscriptions": "Importar suscripciones de YouTube/OPML",
|
||||
"Import FreeTube subscriptions (.db)": "Importar suscripciones de FreeTube (.db)",
|
||||
"Import NewPipe subscriptions (.json)": "Importar suscripciones de NewPipe (.json)",
|
||||
"Import NewPipe data (.zip)": "Importar datos de NewPipe (.zip)",
|
||||
"Export": "Exportar",
|
||||
"Export subscriptions as OPML": "Exportar suscripciones como OPML",
|
||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Exportar suscripciones como OPML (para NewPipe y FreeTube)",
|
||||
"Export data as JSON": "Exportar datos como JSON",
|
||||
"Export data as JSON": "Exportar datos de Invidious como JSON",
|
||||
"Delete account?": "¿Quiere borrar la cuenta?",
|
||||
"History": "Historial",
|
||||
"An alternative front-end to YouTube": "Una interfaz alternativa para YouTube",
|
||||
@@ -51,35 +48,39 @@
|
||||
"E-mail": "Correo",
|
||||
"Google verification code": "Código de verificación de Google",
|
||||
"Preferences": "Preferencias",
|
||||
"Player preferences": "Preferencias del reproductor",
|
||||
"Always loop: ": "Repetir siempre: ",
|
||||
"Autoplay: ": "Reproducción automática: ",
|
||||
"Play next by default: ": "Reproducir siguiente por defecto: ",
|
||||
"Autoplay next video: ": "Reproducir automáticamente el vídeo siguiente: ",
|
||||
"Listen by default: ": "Activar el sonido por defecto: ",
|
||||
"Proxy videos: ": "¿Usar un proxy para los vídeos? ",
|
||||
"Default speed: ": "Velocidad por defecto: ",
|
||||
"Preferred video quality: ": "Calidad de vídeo preferida: ",
|
||||
"Player volume: ": "Volumen del reproductor: ",
|
||||
"Default comments: ": "Comentarios por defecto: ",
|
||||
"preferences_category_player": "Preferencias del reproductor",
|
||||
"preferences_video_loop_label": "Repetir siempre: ",
|
||||
"preferences_autoplay_label": "Reproducción automática: ",
|
||||
"preferences_continue_label": "Reproducir siguiente por defecto: ",
|
||||
"preferences_continue_autoplay_label": "Reproducir automáticamente el vídeo siguiente: ",
|
||||
"preferences_listen_label": "Activar el sonido por defecto: ",
|
||||
"preferences_local_label": "¿Usar un proxy para los vídeos? ",
|
||||
"preferences_speed_label": "Velocidad por defecto: ",
|
||||
"preferences_quality_label": "Calidad de vídeo preferida: ",
|
||||
"preferences_volume_label": "Volumen del reproductor: ",
|
||||
"preferences_comments_label": "Comentarios por defecto: ",
|
||||
"youtube": "YouTube",
|
||||
"reddit": "Reddit",
|
||||
"Default captions: ": "Subtítulos por defecto: ",
|
||||
"preferences_captions_label": "Subtítulos por defecto: ",
|
||||
"Fallback captions: ": "Subtítulos alternativos: ",
|
||||
"Show related videos: ": "¿Mostrar vídeos relacionados? ",
|
||||
"Show annotations by default: ": "¿Mostrar anotaciones por defecto? ",
|
||||
"Visual preferences": "Preferencias visuales",
|
||||
"Player style: ": "",
|
||||
"preferences_related_videos_label": "¿Mostrar vídeos relacionados? ",
|
||||
"preferences_annotations_label": "¿Mostrar anotaciones por defecto? ",
|
||||
"preferences_extend_desc_label": "Extender automáticamente la descripción del vídeo: ",
|
||||
"preferences_vr_mode_label": "Vídeos interactivos de 360 grados (necesita WebGL): ",
|
||||
"preferences_category_visual": "Preferencias visuales",
|
||||
"preferences_player_style_label": "Estilo de reproductor: ",
|
||||
"Dark mode: ": "Modo oscuro: ",
|
||||
"Theme: ": "",
|
||||
"dark": "",
|
||||
"light": "",
|
||||
"Thin mode: ": "Modo compacto: ",
|
||||
"Subscription preferences": "Preferencias de la suscripción",
|
||||
"Show annotations by default for subscribed channels: ": "¿Mostrar anotaciones por defecto para los canales suscritos? ",
|
||||
"preferences_dark_mode_label": "Tema: ",
|
||||
"dark": "oscuro",
|
||||
"light": "claro",
|
||||
"preferences_thin_mode_label": "Modo compacto: ",
|
||||
"preferences_category_misc": "Preferencias misceláneas",
|
||||
"preferences_automatic_instance_redirect_label": "Redirección automática de instancia (segunda opción a redirect.invidious.io): ",
|
||||
"preferences_category_subscription": "Preferencias de la suscripción",
|
||||
"preferences_annotations_subscribed_label": "¿Mostrar anotaciones por defecto para los canales suscritos? ",
|
||||
"Redirect homepage to feed: ": "Redirigir la página de inicio a la fuente: ",
|
||||
"Number of videos shown in feed: ": "Número de vídeos mostrados en la fuente: ",
|
||||
"Sort videos by: ": "Ordenar los vídeos por: ",
|
||||
"preferences_max_results_label": "Número de vídeos mostrados en la fuente: ",
|
||||
"preferences_sort_label": "Ordenar los vídeos por: ",
|
||||
"published": "fecha de publicación",
|
||||
"published - reverse": "fecha de publicación: orden inverso",
|
||||
"alphabetically": "alfabéticamente",
|
||||
@@ -88,12 +89,12 @@
|
||||
"channel name - reverse": "nombre del canal: orden inverso",
|
||||
"Only show latest video from channel: ": "Mostrar solo el último vídeo del canal: ",
|
||||
"Only show latest unwatched video from channel: ": "Mostrar solo el último vídeo sin ver del canal: ",
|
||||
"Only show unwatched: ": "Mostrar solo los no vistos: ",
|
||||
"Only show notifications (if there are any): ": "Mostrar solo notificaciones (si hay alguna): ",
|
||||
"Enable web notifications": "",
|
||||
"`x` uploaded a video": "",
|
||||
"`x` is live": "",
|
||||
"Data preferences": "Preferencias de los datos",
|
||||
"preferences_unseen_only_label": "Mostrar solo los no vistos: ",
|
||||
"preferences_notifications_only_label": "Mostrar solo notificaciones (si hay alguna): ",
|
||||
"Enable web notifications": "Habilitar notificaciones web",
|
||||
"`x` uploaded a video": "`x` subió un video",
|
||||
"`x` is live": "`x` esta en vivo",
|
||||
"preferences_category_data": "Preferencias de los datos",
|
||||
"Clear watch history": "Borrar el historial de reproducción",
|
||||
"Import/export data": "Importar/Exportar datos",
|
||||
"Change password": "Cambiar contraseña",
|
||||
@@ -101,9 +102,10 @@
|
||||
"Manage tokens": "Gestionar tokens",
|
||||
"Watch history": "Historial de reproducción",
|
||||
"Delete account": "Borrar cuenta",
|
||||
"Administrator preferences": "Preferencias de administrador",
|
||||
"Default homepage: ": "Página de inicio por defecto: ",
|
||||
"Feed menu: ": "Menú de fuentes: ",
|
||||
"preferences_category_admin": "Preferencias de administrador",
|
||||
"preferences_default_home_label": "Página de inicio por defecto: ",
|
||||
"preferences_feed_menu_label": "Menú de fuentes: ",
|
||||
"preferences_show_nick_label": "Mostrar nombre de usuario arriba: ",
|
||||
"Top enabled: ": "¿Habilitar los destacados? ",
|
||||
"CAPTCHA enabled: ": "¿Habilitar los CAPTCHA? ",
|
||||
"Login enabled: ": "¿Habilitar el inicio de sesión? ",
|
||||
@@ -113,32 +115,33 @@
|
||||
"Subscription manager": "Gestor de suscripciones",
|
||||
"Token manager": "Gestor de tokens",
|
||||
"Token": "Token",
|
||||
"`x` subscriptions": "`x` suscripciones",
|
||||
"`x` tokens": "`x` tokens",
|
||||
"Import/export": "Importar/Exportar",
|
||||
"unsubscribe": "Desuscribirse",
|
||||
"revoke": "revocar",
|
||||
"Subscriptions": "Suscripciones",
|
||||
"`x` unseen notifications": "`x` notificaciones sin ver",
|
||||
"search": "buscar",
|
||||
"Log out": "Cerrar la sesión",
|
||||
"Released under the AGPLv3 by Omar Roth.": "Publicado bajo licencia AGPLv3 por Omar Roth.",
|
||||
"Released under the AGPLv3 on Github.": "Publicado bajo la AGPLv3 en Github.",
|
||||
"Source available here.": "Código fuente disponible aquí.",
|
||||
"View JavaScript license information.": "Ver información de licencia de JavaScript.",
|
||||
"View privacy policy.": "Ver la política de privacidad.",
|
||||
"Trending": "Tendencias",
|
||||
"Public": "",
|
||||
"Public": "Público",
|
||||
"Unlisted": "No listado",
|
||||
"Private": "",
|
||||
"View all playlists": "",
|
||||
"Updated `x` ago": "",
|
||||
"Delete playlist `x`?": "",
|
||||
"Delete playlist": "",
|
||||
"Create playlist": "",
|
||||
"Title": "",
|
||||
"Playlist privacy": "",
|
||||
"Editing playlist `x`": "",
|
||||
"Watch on YouTube": "Ver el vídeo en Youtube",
|
||||
"Private": "Privado",
|
||||
"View all playlists": "Ver todas las listas de reproducción",
|
||||
"Updated `x` ago": "Actualizado hace `x`",
|
||||
"Delete playlist `x`?": "¿Borrar la lista de reproducción `x`?",
|
||||
"Delete playlist": "Borrar lista de reproducción",
|
||||
"Create playlist": "Crear lista de reproducción",
|
||||
"Title": "Título",
|
||||
"Playlist privacy": "Privacidad de la lista de reproducción",
|
||||
"Editing playlist `x`": "Editando la lista de reproducción 'x'",
|
||||
"Show more": "Mostrar más",
|
||||
"Show less": "Mostrar menos",
|
||||
"Watch on YouTube": "Ver el vídeo en YouTube",
|
||||
"Switch Invidious Instance": "Cambiar Instancia de Invidious",
|
||||
"Broken? Try another Invidious Instance": "¿Algún error? Prueba otra instancia de Invidious",
|
||||
"Hide annotations": "Ocultar anotaciones",
|
||||
"Show annotations": "Mostrar anotaciones",
|
||||
"Genre: ": "Género: ",
|
||||
@@ -149,13 +152,15 @@
|
||||
"Whitelisted regions: ": "Regiones permitidas: ",
|
||||
"Blacklisted regions: ": "Regiones bloqueadas: ",
|
||||
"Shared `x`": "Compartido `x`",
|
||||
"`x` views": "`x` visualizaciones",
|
||||
"Premieres in `x`": "Se estrena en `x`",
|
||||
"Premieres `x`": "",
|
||||
"Premieres `x`": "Estrenos `x`",
|
||||
"Hi! Looks like you have JavaScript turned off. Click here to view comments, keep in mind they may take a bit longer to load.": "¡Hola! Parece que tiene JavaScript desactivado. Haga clic aquí para ver los comentarios, pero tenga en cuenta que pueden tardar un poco más en cargarse.",
|
||||
"View YouTube comments": "Ver los comentarios de YouTube",
|
||||
"View more comments on Reddit": "Ver más comentarios en Reddit",
|
||||
"View `x` comments": "Ver `x` comentarios",
|
||||
"View `x` comments": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "Ver `x` comentarios",
|
||||
"": "Ver `x` comentarios"
|
||||
},
|
||||
"View Reddit comments": "Ver los comentarios de Reddit",
|
||||
"Hide replies": "Ocultar las respuestas",
|
||||
"Show replies": "Mostrar las respuestas",
|
||||
@@ -180,10 +185,8 @@
|
||||
"This channel does not exist.": "El canal no existe.",
|
||||
"Could not get channel info.": "No se ha podido obtener información del canal.",
|
||||
"Could not fetch comments": "No se han podido recuperar los comentarios",
|
||||
"View `x` replies": "Ver `x` respuestas",
|
||||
"`x` ago": "hace `x`",
|
||||
"Load more": "Cargar más",
|
||||
"`x` points": "`x` puntos",
|
||||
"Could not create mix.": "No se ha podido crear la mezcla.",
|
||||
"Empty playlist": "La lista de reproducción está vacía",
|
||||
"Not a playlist.": "Lista de reproducción no válida.",
|
||||
@@ -196,7 +199,7 @@
|
||||
"No such user": "Usuario no válido",
|
||||
"Token is expired, please try again": "El símbolo ha caducado, inténtelo de nuevo",
|
||||
"English": "Inglés",
|
||||
"English (auto-generated)": "Inglés (autogenerado)",
|
||||
"English (auto-generated)": "Inglés (generados automáticamente)",
|
||||
"Afrikaans": "Afrikáans",
|
||||
"Albanian": "Albanés",
|
||||
"Amharic": "Amárico",
|
||||
@@ -301,19 +304,13 @@
|
||||
"Yiddish": "Yidis",
|
||||
"Yoruba": "Yoruba",
|
||||
"Zulu": "Zulú",
|
||||
"`x` years": "`x` años",
|
||||
"`x` months": "`x` meses",
|
||||
"`x` weeks": "`x` semanas",
|
||||
"`x` days": "`x` días",
|
||||
"`x` hours": "`x` horas",
|
||||
"`x` minutes": "`x` minutos",
|
||||
"`x` seconds": "`x` segundos",
|
||||
"Fallback comments: ": "Comentarios alternativos: ",
|
||||
"Popular": "Populares",
|
||||
"Search": "Buscar",
|
||||
"Top": "Destacados",
|
||||
"About": "Acerca de",
|
||||
"Rating: ": "Valoración: ",
|
||||
"Language: ": "Idioma: ",
|
||||
"preferences_locale_label": "Idioma: ",
|
||||
"View as playlist": "Ver como lista de reproducción",
|
||||
"Default": "Por defecto",
|
||||
"Music": "Música",
|
||||
@@ -325,12 +322,142 @@
|
||||
"%A %B %-d, %Y": "%A %B %-d, %Y",
|
||||
"(edited)": "(editado)",
|
||||
"YouTube comment permalink": "Enlace permanente de YouTube del comentario",
|
||||
"permalink": "",
|
||||
"permalink": "enlace permanente",
|
||||
"`x` marked it with a ❤": "`x` lo ha marcado con un ❤",
|
||||
"Audio mode": "Modo de audio",
|
||||
"Video mode": "Modo de vídeo",
|
||||
"Videos": "Vídeos",
|
||||
"Playlists": "Listas de reproducción",
|
||||
"Community": "",
|
||||
"Current version: ": "Versión actual: "
|
||||
}
|
||||
"Community": "Comunidad",
|
||||
"relevance": "relevancia",
|
||||
"rating": "valoración",
|
||||
"date": "fecha",
|
||||
"views": "visualizaciones",
|
||||
"content_type": "content_type",
|
||||
"duration": "duración",
|
||||
"features": "funcionalidades",
|
||||
"sort": "ordenar",
|
||||
"hour": "hora",
|
||||
"today": "hoy",
|
||||
"week": "semana",
|
||||
"month": "mes",
|
||||
"year": "año",
|
||||
"video": "vídeo",
|
||||
"channel": "canal",
|
||||
"playlist": "lista de reproducción",
|
||||
"movie": "película",
|
||||
"show": "programa",
|
||||
"hd": "hd",
|
||||
"subtitles": "subtítulos",
|
||||
"creative_commons": "creative_commons",
|
||||
"3d": "3d",
|
||||
"live": "directo",
|
||||
"4k": "4k",
|
||||
"location": "ubicación",
|
||||
"hdr": "hdr",
|
||||
"filter": "filtro",
|
||||
"Current version: ": "Versión actual: ",
|
||||
"next_steps_error_message": "Después de lo cual deberías intentar: ",
|
||||
"next_steps_error_message_refresh": "Recargar",
|
||||
"next_steps_error_message_go_to_youtube": "Ir a YouTube",
|
||||
"short": "Corto (< 4 minutos)",
|
||||
"long": "Largo (> 20 minutos)",
|
||||
"footer_documentation": "Documentación",
|
||||
"footer_original_source_code": "Código fuente original",
|
||||
"adminprefs_modified_source_code_url_label": "URL al repositorio de código fuente modificado",
|
||||
"footer_source_code": "Código fuente",
|
||||
"footer_modfied_source_code": "Código fuente modificado",
|
||||
"footer_donate_page": "Donar",
|
||||
"preferences_region_label": "País del contenido: ",
|
||||
"preferences_quality_dash_label": "Calidad de vídeo DASH preferida: ",
|
||||
"preferences_quality_option_hd720": "HD720",
|
||||
"preferences_quality_option_medium": "Intermedia",
|
||||
"preferences_quality_dash_option_auto": "Automática",
|
||||
"none": "ninguno",
|
||||
"videoinfo_started_streaming_x_ago": "Comenzó difusión hace `x`",
|
||||
"download_subtitles": "Subtítulos- `x` (.vtt)",
|
||||
"user_created_playlists": "`x` listas de reproducción creadas",
|
||||
"user_saved_playlists": "`x` listas de reproducción guardadas",
|
||||
"Video unavailable": "Vídeo no disponible",
|
||||
"videoinfo_youTube_embed_link": "Insertar",
|
||||
"preferences_quality_dash_option_2160p": "2160p",
|
||||
"preferences_quality_dash_option_4320p": "4320p",
|
||||
"invidious": "Invidious",
|
||||
"preferences_quality_dash_option_480p": "480p",
|
||||
"preferences_quality_option_dash": "DASH (calidad adaptativa)",
|
||||
"preferences_quality_dash_option_720p": "720p",
|
||||
"preferences_quality_dash_option_360p": "360p",
|
||||
"preferences_quality_dash_option_240p": "240p",
|
||||
"preferences_quality_dash_option_144p": "144p",
|
||||
"preferences_quality_option_small": "Pequeña",
|
||||
"preferences_quality_dash_option_1440p": "1440p",
|
||||
"preferences_quality_dash_option_best": "La mejor",
|
||||
"preferences_quality_dash_option_worst": "La peor",
|
||||
"videoinfo_invidious_embed_link": "Enlace para Insertar",
|
||||
"preferences_quality_dash_option_1080p": "1080p",
|
||||
"purchased": "Comprado",
|
||||
"360": "360°",
|
||||
"videoinfo_watch_on_youTube": "Ver en YouTube",
|
||||
"preferences_save_player_pos_label": "Guardar posición de reproducción: ",
|
||||
"generic_views_count": "{{count}} visualización",
|
||||
"generic_views_count_plural": "{{count}} visualizaciones",
|
||||
"generic_subscribers_count": "{{count}} suscriptor",
|
||||
"generic_subscribers_count_plural": "{{count}} suscriptores",
|
||||
"generic_subscriptions_count": "{{count}} suscripción",
|
||||
"generic_subscriptions_count_plural": "{{count}} suscripciones",
|
||||
"subscriptions_unseen_notifs_count": "{{count}} notificación no vista",
|
||||
"subscriptions_unseen_notifs_count_plural": "{{count}} notificaciones no vistas",
|
||||
"generic_count_days": "{{count}} día",
|
||||
"generic_count_days_plural": "{{count}} días",
|
||||
"comments_view_x_replies": "Ver {{count}} respuesta",
|
||||
"comments_view_x_replies_plural": "Ver {{count}} respuestas",
|
||||
"generic_count_weeks": "{{count}} semana",
|
||||
"generic_count_weeks_plural": "{{count}} semanas",
|
||||
"generic_playlists_count": "{{count}} lista de reproducción",
|
||||
"generic_playlists_count_plural": "{{count}} listas de reproducción",
|
||||
"generic_videos_count": "{{count}} vídeo",
|
||||
"generic_videos_count_plural": "{{count}} vídeos",
|
||||
"generic_count_months": "{{count}} mes",
|
||||
"generic_count_months_plural": "{{count}} meses",
|
||||
"comments_points_count": "{{count}} punto",
|
||||
"comments_points_count_plural": "{{count}} puntos",
|
||||
"generic_count_years": "{{count}} año",
|
||||
"generic_count_years_plural": "{{count}} años",
|
||||
"generic_count_hours": "{{count}} hora",
|
||||
"generic_count_hours_plural": "{{count}} horas",
|
||||
"generic_count_minutes": "{{count}} minuto",
|
||||
"generic_count_minutes_plural": "{{count}} minutos",
|
||||
"generic_count_seconds": "{{count}} segundo",
|
||||
"generic_count_seconds_plural": "{{count}} segundos",
|
||||
"crash_page_before_reporting": "Antes de notificar un error asegúrate de que has:",
|
||||
"crash_page_switch_instance": "probado a <a href=\"`x`\">usar otra instancia</a>",
|
||||
"crash_page_read_the_faq": "leído las <a href=\"`x`\">Preguntas Frecuentes</a>",
|
||||
"crash_page_search_issue": "buscado <a href=\"`x`\">problemas existentes en Github</a>",
|
||||
"crash_page_you_found_a_bug": "¡Parece que has encontrado un error en Invidious!",
|
||||
"crash_page_refresh": "probado a <a href=\"`x`\">recargar la página</a>",
|
||||
"crash_page_report_issue": "Si nada de lo anterior ha sido de ayuda, por favor, <a href=\"`x`\">abre una nueva incidencia en GitHub</a> (preferiblemente en inglés) e incluye el siguiente texto en tu mensaje (NO traduzcas este texto):",
|
||||
"English (United States)": "Inglés (Estados Unidos)",
|
||||
"Cantonese (Hong Kong)": "Cantonés (Hong Kong)",
|
||||
"Dutch (auto-generated)": "Neerlandés (generados automáticamente)",
|
||||
"French (auto-generated)": "Francés (generados automáticamente)",
|
||||
"Interlingue": "Occidental",
|
||||
"Japanese (auto-generated)": "Japonés (generados automáticamente)",
|
||||
"Russian (auto-generated)": "Ruso (generados automáticamente)",
|
||||
"Spanish (Spain)": "Español (España)",
|
||||
"Vietnamese (auto-generated)": "Vietnamita (generados automáticamente)",
|
||||
"English (United Kingdom)": "Inglés (Reino Unido)",
|
||||
"Chinese (Taiwan)": "Chino (Taiwán)",
|
||||
"German (auto-generated)": "Alemán (generados automáticamente)",
|
||||
"Italian (auto-generated)": "Italiano (generados automáticamente)",
|
||||
"Turkish (auto-generated)": "Turco (generados automáticamente)",
|
||||
"Portuguese (Brazil)": "Portugués (Brasil)",
|
||||
"Indonesian (auto-generated)": "Indonesio (generados automáticamente)",
|
||||
"Portuguese (auto-generated)": "Portugués (generados automáticamente)",
|
||||
"Chinese": "Chino",
|
||||
"Chinese (Hong Kong)": "Chino (Hong Kong)",
|
||||
"Chinese (China)": "Chino (China)",
|
||||
"Korean (auto-generated)": "Coreano (generados automáticamente)",
|
||||
"Spanish (Mexico)": "Español (Méjico)",
|
||||
"Spanish (auto-generated)": "Español (generados automáticamente)",
|
||||
"preferences_watch_history_label": "Habilitar historial de reproducciones: "
|
||||
}
|
||||
|
||||
346
locales/eu.json
346
locales/eu.json
@@ -1,13 +1,10 @@
|
||||
{
|
||||
"`x` subscribers": "`x` harpidedun",
|
||||
"`x` videos": "`x` bideo",
|
||||
"`x` playlists": "",
|
||||
"LIVE": "ZUZENEAN",
|
||||
"Shared `x` ago": "Duela `x` partekatua",
|
||||
"Unsubscribe": "Harpidetza kendu",
|
||||
"Subscribe": "Harpidetu",
|
||||
"View channel on YouTube": "Ikusi kanala YouTuben",
|
||||
"View playlist on YouTube": "",
|
||||
"View playlist on YouTube": "Ikusi erreprodukzio-zerrenda YouTuben",
|
||||
"newest": "berrienak",
|
||||
"oldest": "zaharrenak",
|
||||
"popular": "ospetsuenak",
|
||||
@@ -16,321 +13,54 @@
|
||||
"Previous page": "Aurreko orria",
|
||||
"Clear watch history?": "Garbitu ikusitakoen historia?",
|
||||
"New password": "Pasahitz berria",
|
||||
"New passwords must match": "",
|
||||
"Cannot change password for Google accounts": "",
|
||||
"Authorize token?": "",
|
||||
"Authorize token for `x`?": "",
|
||||
"New passwords must match": "Pasahitza berriek bat egin behar dute",
|
||||
"Cannot change password for Google accounts": "Ezin da pasahitza aldatu Google kontuetan",
|
||||
"Authorize token?": "Baimendu tokena?",
|
||||
"Yes": "Bai",
|
||||
"No": "Ez",
|
||||
"Import and Export Data": "Datuak inportatu eta esportatu",
|
||||
"Import": "Inportatu",
|
||||
"Import Invidious data": "Invidiouseko datuak inportatu",
|
||||
"Import YouTube subscriptions": "YouTubeko harpidetzak inportatu",
|
||||
"Import FreeTube subscriptions (.db)": "FreeTubeko harpidetzak inportatu (.db)",
|
||||
"Import NewPipe subscriptions (.json)": "NewPipeko harpidetzak inportatu (.json)",
|
||||
"Import NewPipe data (.zip)": "NewPipeko datuak inportatu (.zip)",
|
||||
"Import Invidious data": "Inportatu Invidiouseko datuak",
|
||||
"Import YouTube subscriptions": "Inportatu YouTubeko harpidetzak",
|
||||
"Import FreeTube subscriptions (.db)": "Inportatu FreeTubeko harpidetzak (.db)",
|
||||
"Import NewPipe subscriptions (.json)": "Inportatu NewPipeko harpidetzak (.json)",
|
||||
"Import NewPipe data (.zip)": "Inportatu NewPipeko datuak (.zip)",
|
||||
"Export": "Esportatu",
|
||||
"Export subscriptions as OPML": "Esportatu harpidetzak OPML bezala",
|
||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Harpidetzak OPML bezala esportatu (NewPipe eta FreeTuberako)",
|
||||
"Export data as JSON": "Datuak JSON bezala esportatu",
|
||||
"Export subscriptions as OPML (for NewPipe & FreeTube)": "Esportatu harpidetzak OPML bezala (NewPipe eta FreeTuberako)",
|
||||
"Export data as JSON": "Esportatu datuak JSON bezala",
|
||||
"Delete account?": "Kontua ezabatu?",
|
||||
"History": "Historia",
|
||||
"An alternative front-end to YouTube": "YouTuberako interfaze alternatibo bat",
|
||||
"JavaScript license information": "JavaScript lizentzia informazioa",
|
||||
"source": "iturburua",
|
||||
"Log in": "Saioa hasi",
|
||||
"Log in/register": "Saioa hasi/Izena eman",
|
||||
"Log in with Google": "Googlekin hasi saioa",
|
||||
"Log in/register": "Hasi saioa / Eman izena",
|
||||
"Log in with Google": "Hasi saioa Googlekin",
|
||||
"User ID": "Erabiltzaile IDa",
|
||||
"Password": "Pasahitza",
|
||||
"Time (h:mm:ss):": "Denbora (o:mm:ss):",
|
||||
"Text CAPTCHA": "Testu CAPTCHA",
|
||||
"Image CAPTCHA": "Irudi CAPTCHA",
|
||||
"Sign In": "",
|
||||
"Register": "",
|
||||
"E-mail": "",
|
||||
"Google verification code": "",
|
||||
"Preferences": "",
|
||||
"Player preferences": "",
|
||||
"Always loop: ": "",
|
||||
"Autoplay: ": "",
|
||||
"Play next by default: ": "",
|
||||
"Autoplay next video: ": "",
|
||||
"Listen by default: ": "",
|
||||
"Proxy videos: ": "",
|
||||
"Default speed: ": "",
|
||||
"Preferred video quality: ": "",
|
||||
"Player volume: ": "",
|
||||
"Default comments: ": "",
|
||||
"youtube": "",
|
||||
"reddit": "",
|
||||
"Default captions: ": "",
|
||||
"Fallback captions: ": "",
|
||||
"Show related videos: ": "",
|
||||
"Show annotations by default: ": "",
|
||||
"Visual preferences": "",
|
||||
"Player style: ": "",
|
||||
"Dark mode: ": "",
|
||||
"Theme: ": "",
|
||||
"dark": "",
|
||||
"light": "",
|
||||
"Thin mode: ": "",
|
||||
"Subscription preferences": "",
|
||||
"Show annotations by default for subscribed channels: ": "",
|
||||
"Redirect homepage to feed: ": "",
|
||||
"Number of videos shown in feed: ": "",
|
||||
"Sort videos by: ": "",
|
||||
"published": "",
|
||||
"published - reverse": "",
|
||||
"alphabetically": "",
|
||||
"alphabetically - reverse": "",
|
||||
"channel name": "",
|
||||
"channel name - reverse": "",
|
||||
"Only show latest video from channel: ": "",
|
||||
"Only show latest unwatched video from channel: ": "",
|
||||
"Only show unwatched: ": "",
|
||||
"Only show notifications (if there are any): ": "",
|
||||
"Enable web notifications": "",
|
||||
"`x` uploaded a video": "",
|
||||
"`x` is live": "",
|
||||
"Data preferences": "",
|
||||
"Clear watch history": "",
|
||||
"Import/export data": "",
|
||||
"Change password": "",
|
||||
"Manage subscriptions": "",
|
||||
"Manage tokens": "",
|
||||
"Watch history": "",
|
||||
"Delete account": "",
|
||||
"Administrator preferences": "",
|
||||
"Default homepage: ": "",
|
||||
"Feed menu: ": "",
|
||||
"Top enabled: ": "",
|
||||
"CAPTCHA enabled: ": "",
|
||||
"Login enabled: ": "",
|
||||
"Registration enabled: ": "",
|
||||
"Report statistics: ": "",
|
||||
"Save preferences": "",
|
||||
"Subscription manager": "",
|
||||
"Token manager": "",
|
||||
"Token": "",
|
||||
"`x` subscriptions": "",
|
||||
"`x` tokens": "",
|
||||
"Import/export": "",
|
||||
"unsubscribe": "",
|
||||
"revoke": "",
|
||||
"Subscriptions": "",
|
||||
"`x` unseen notifications": "",
|
||||
"search": "",
|
||||
"Log out": "",
|
||||
"Released under the AGPLv3 by Omar Roth.": "",
|
||||
"Source available here.": "",
|
||||
"View JavaScript license information.": "",
|
||||
"View privacy policy.": "",
|
||||
"Trending": "",
|
||||
"Public": "",
|
||||
"Unlisted": "",
|
||||
"Private": "",
|
||||
"View all playlists": "",
|
||||
"Updated `x` ago": "",
|
||||
"Delete playlist `x`?": "",
|
||||
"Delete playlist": "",
|
||||
"Create playlist": "",
|
||||
"Title": "",
|
||||
"Playlist privacy": "",
|
||||
"Editing playlist `x`": "",
|
||||
"Watch on YouTube": "",
|
||||
"Hide annotations": "",
|
||||
"Show annotations": "",
|
||||
"Genre: ": "",
|
||||
"License: ": "",
|
||||
"Family friendly? ": "",
|
||||
"Wilson score: ": "",
|
||||
"Engagement: ": "",
|
||||
"Whitelisted regions: ": "",
|
||||
"Blacklisted regions: ": "",
|
||||
"Shared `x`": "",
|
||||
"`x` views": "",
|
||||
"Premieres in `x`": "",
|
||||
"Premieres `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": "",
|
||||
"View more comments on Reddit": "",
|
||||
"View `x` comments": "",
|
||||
"View Reddit comments": "",
|
||||
"Hide replies": "",
|
||||
"Show replies": "",
|
||||
"Incorrect password": "",
|
||||
"Quota exceeded, try again in a few hours": "",
|
||||
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "",
|
||||
"Invalid TFA code": "",
|
||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "",
|
||||
"Wrong answer": "",
|
||||
"Erroneous CAPTCHA": "",
|
||||
"CAPTCHA is a required field": "",
|
||||
"User ID is a required field": "",
|
||||
"Password is a required field": "",
|
||||
"Wrong username or password": "",
|
||||
"Please sign in using 'Log in with Google'": "",
|
||||
"Password cannot be empty": "",
|
||||
"Password cannot be longer than 55 characters": "",
|
||||
"Please log in": "",
|
||||
"Invidious Private Feed for `x`": "",
|
||||
"channel:`x`": "",
|
||||
"Deleted or invalid channel": "",
|
||||
"This channel does not exist.": "",
|
||||
"Could not get channel info.": "",
|
||||
"Could not fetch comments": "",
|
||||
"View `x` replies": "",
|
||||
"`x` ago": "",
|
||||
"Load more": "",
|
||||
"`x` points": "",
|
||||
"Could not create mix.": "",
|
||||
"Empty playlist": "",
|
||||
"Not a playlist.": "",
|
||||
"Playlist does not exist.": "",
|
||||
"Could not pull trending pages.": "",
|
||||
"Hidden field \"challenge\" is a required field": "",
|
||||
"Hidden field \"token\" is a required field": "",
|
||||
"Erroneous challenge": "",
|
||||
"Erroneous token": "",
|
||||
"No such user": "",
|
||||
"Token is expired, please try again": "",
|
||||
"English": "",
|
||||
"English (auto-generated)": "",
|
||||
"Afrikaans": "",
|
||||
"Albanian": "",
|
||||
"Amharic": "",
|
||||
"Arabic": "",
|
||||
"Armenian": "",
|
||||
"Azerbaijani": "",
|
||||
"Bangla": "",
|
||||
"Basque": "",
|
||||
"Belarusian": "",
|
||||
"Bosnian": "",
|
||||
"Bulgarian": "",
|
||||
"Burmese": "",
|
||||
"Catalan": "",
|
||||
"Cebuano": "",
|
||||
"Chinese (Simplified)": "",
|
||||
"Chinese (Traditional)": "",
|
||||
"Corsican": "",
|
||||
"Croatian": "",
|
||||
"Czech": "",
|
||||
"Danish": "",
|
||||
"Dutch": "",
|
||||
"Esperanto": "",
|
||||
"Estonian": "",
|
||||
"Filipino": "",
|
||||
"Finnish": "",
|
||||
"French": "",
|
||||
"Galician": "",
|
||||
"Georgian": "",
|
||||
"German": "",
|
||||
"Greek": "",
|
||||
"Gujarati": "",
|
||||
"Haitian Creole": "",
|
||||
"Hausa": "",
|
||||
"Hawaiian": "",
|
||||
"Hebrew": "",
|
||||
"Hindi": "",
|
||||
"Hmong": "",
|
||||
"Hungarian": "",
|
||||
"Icelandic": "",
|
||||
"Igbo": "",
|
||||
"Indonesian": "",
|
||||
"Irish": "",
|
||||
"Italian": "",
|
||||
"Japanese": "",
|
||||
"Javanese": "",
|
||||
"Kannada": "",
|
||||
"Kazakh": "",
|
||||
"Khmer": "",
|
||||
"Korean": "",
|
||||
"Kurdish": "",
|
||||
"Kyrgyz": "",
|
||||
"Lao": "",
|
||||
"Latin": "",
|
||||
"Latvian": "",
|
||||
"Lithuanian": "",
|
||||
"Luxembourgish": "",
|
||||
"Macedonian": "",
|
||||
"Malagasy": "",
|
||||
"Malay": "",
|
||||
"Malayalam": "",
|
||||
"Maltese": "",
|
||||
"Maori": "",
|
||||
"Marathi": "",
|
||||
"Mongolian": "",
|
||||
"Nepali": "",
|
||||
"Norwegian Bokmål": "",
|
||||
"Nyanja": "",
|
||||
"Pashto": "",
|
||||
"Persian": "",
|
||||
"Polish": "",
|
||||
"Portuguese": "",
|
||||
"Punjabi": "",
|
||||
"Romanian": "",
|
||||
"Russian": "",
|
||||
"Samoan": "",
|
||||
"Scottish Gaelic": "",
|
||||
"Serbian": "",
|
||||
"Shona": "",
|
||||
"Sindhi": "",
|
||||
"Sinhala": "",
|
||||
"Slovak": "",
|
||||
"Slovenian": "",
|
||||
"Somali": "",
|
||||
"Southern Sotho": "",
|
||||
"Spanish": "",
|
||||
"Spanish (Latin America)": "",
|
||||
"Sundanese": "",
|
||||
"Swahili": "",
|
||||
"Swedish": "",
|
||||
"Tajik": "",
|
||||
"Tamil": "",
|
||||
"Telugu": "",
|
||||
"Thai": "",
|
||||
"Turkish": "",
|
||||
"Ukrainian": "",
|
||||
"Urdu": "",
|
||||
"Uzbek": "",
|
||||
"Vietnamese": "",
|
||||
"Welsh": "",
|
||||
"Western Frisian": "",
|
||||
"Xhosa": "",
|
||||
"Yiddish": "",
|
||||
"Yoruba": "",
|
||||
"Zulu": "",
|
||||
"`x` years": "",
|
||||
"`x` months": "",
|
||||
"`x` weeks": "",
|
||||
"`x` days": "",
|
||||
"`x` hours": "",
|
||||
"`x` minutes": "",
|
||||
"`x` seconds": "",
|
||||
"Fallback comments: ": "",
|
||||
"Popular": "",
|
||||
"Top": "",
|
||||
"About": "",
|
||||
"Rating: ": "",
|
||||
"Language: ": "",
|
||||
"View as playlist": "",
|
||||
"Default": "",
|
||||
"Music": "",
|
||||
"Gaming": "",
|
||||
"News": "",
|
||||
"Movies": "",
|
||||
"Download": "",
|
||||
"Download as: ": "",
|
||||
"%A %B %-d, %Y": "",
|
||||
"(edited)": "",
|
||||
"YouTube comment permalink": "",
|
||||
"permalink": "",
|
||||
"`x` marked it with a ❤": "",
|
||||
"Audio mode": "",
|
||||
"Video mode": "",
|
||||
"Videos": "",
|
||||
"Playlists": "",
|
||||
"Community": "",
|
||||
"Current version: ": ""
|
||||
}
|
||||
"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",
|
||||
"Preferences": "Hobespenak",
|
||||
"preferences_category_player": "Erreproduzigailuaren hobespenak",
|
||||
"preferences_autoplay_label": "Automatikoki erreproduzitu: ",
|
||||
"preferences_continue_autoplay_label": "Erreproduzitu automatikoki hurrengo bideoa: ",
|
||||
"preferences_quality_label": "Hobetsitako bideoaren kalitatea: ",
|
||||
"preferences_volume_label": "Erreproduzigailuaren bolumena: ",
|
||||
"preferences_comments_label": "Lehenetsitako iruzkinak: ",
|
||||
"youtube": "YouTube",
|
||||
"reddit": "reddit",
|
||||
"preferences_captions_label": "Lehenetsitako azpitituluak: ",
|
||||
"preferences_related_videos_label": "Erakutsi erlazionatutako bideoak: ",
|
||||
"preferences_annotations_label": "Erakutsi oharrak modu lehenetsian: ",
|
||||
"preferences_category_visual": "Hobespen bisualak",
|
||||
"preferences_player_style_label": "Erreproduzigailu mota: ",
|
||||
"Dark mode: ": "Gai iluna: ",
|
||||
"preferences_dark_mode_label": "Gaia: ",
|
||||
"dark": "iluna",
|
||||
"light": "argia"
|
||||
}
|
||||
|
||||
416
locales/fa.json
Normal file
416
locales/fa.json
Normal file
@@ -0,0 +1,416 @@
|
||||
{
|
||||
"generic_views_count_0": "{{count}} بازدید",
|
||||
"generic_videos_count_0": "{{count}} ویدئو",
|
||||
"generic_playlists_count_0": "{{count}} فهرست پخش",
|
||||
"generic_subscribers_count_0": "{{count}} دنبال کننده",
|
||||
"generic_subscriptions_count_0": "{{count}} اشتراک ها",
|
||||
"LIVE": "زنده",
|
||||
"Shared `x` ago": "`x` پیش به اشتراک گذاشته شده",
|
||||
"Unsubscribe": "لغو اشتراک",
|
||||
"Subscribe": "مشترک شدن",
|
||||
"View channel on YouTube": "دیدن کانال در یوتیوب",
|
||||
"View playlist on YouTube": "دیدن فهرست پخش در یوتیوب",
|
||||
"newest": "تازهترین",
|
||||
"oldest": "کهنهترین",
|
||||
"popular": "محبوب",
|
||||
"last": "آخرین",
|
||||
"Next page": "صفحه بعد",
|
||||
"Previous page": "صفحه قبل",
|
||||
"Clear watch history?": "پاک کردن تاریخچه نمایش؟",
|
||||
"New password": "گذرواژه تازه",
|
||||
"New passwords must match": "گذارواژه های تازه باید باهم همخوانی داشته باشند",
|
||||
"Cannot change password for Google accounts": "نمیتوان گذرواژه را برای حساب های کاربری گوگل تغییر داد",
|
||||
"Authorize token?": "توکن دسترسی؟",
|
||||
"Authorize token for `x`?": "توکن دسترسی برای `x`؟",
|
||||
"Yes": "بله",
|
||||
"No": "خیر",
|
||||
"Import and Export Data": "درونبرد و برونبرد داده",
|
||||
"Import": "درونبرد",
|
||||
"Import Invidious data": "درونبرد داده اینویدیوس",
|
||||
"Import YouTube subscriptions": "درونبرد اشتراکهای یوتیوب",
|
||||
"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",
|
||||
"Delete account?": "حذف حساب کاربری؟",
|
||||
"History": "تاریخچه",
|
||||
"An alternative front-end to YouTube": "یک پیشانه جایگزین برای یوتیوب",
|
||||
"JavaScript license information": "اطلاعات پروانه جاوااسکریپت",
|
||||
"source": "منبع",
|
||||
"Log in": "ورود",
|
||||
"Log in/register": "ورود/ثبت نام",
|
||||
"Log in with Google": "ورود با گوگل",
|
||||
"User ID": "شناسه کاربری",
|
||||
"Password": "گذرواژه",
|
||||
"Time (h:mm:ss):": "زمان (h:mm:ss):",
|
||||
"Text CAPTCHA": "کپچای متنی",
|
||||
"Image CAPTCHA": "کپچای تصویری",
|
||||
"Sign In": "ورود",
|
||||
"Register": "ثبت نام",
|
||||
"E-mail": "ایمیل",
|
||||
"Google verification code": "کد تایید گوگل",
|
||||
"Preferences": "ترجیحات",
|
||||
"preferences_category_player": "ترجیحات نمایشدهنده",
|
||||
"preferences_video_loop_label": "همواره ویدئو را بازپخش کن ",
|
||||
"preferences_autoplay_label": "نمایش خودکار: ",
|
||||
"preferences_continue_label": "پخش بعدی به طور پیشفرض: ",
|
||||
"preferences_continue_autoplay_label": "پخش خودکار ویدیو بعدی: ",
|
||||
"preferences_listen_label": "گوش کردن به طور پیشفرض: ",
|
||||
"preferences_local_label": "پروکسی ویدیو ها: ",
|
||||
"preferences_speed_label": "سرعت پیشفرض: ",
|
||||
"preferences_quality_label": "کیفیت ویدیوی ترجیحی: ",
|
||||
"preferences_volume_label": "صدای پخش کننده: ",
|
||||
"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": "ویدئوها ۳۶۰ درجه تعاملی: ",
|
||||
"preferences_category_visual": "ترجیحات بصری",
|
||||
"preferences_player_style_label": "حالت پخش کننده: ",
|
||||
"Dark mode: ": "حالت تاریک: ",
|
||||
"preferences_dark_mode_label": "تم: ",
|
||||
"dark": "تاریک",
|
||||
"light": "روشن",
|
||||
"preferences_thin_mode_label": "حالت نازک: ",
|
||||
"preferences_category_misc": "ترجیحات متفرقه",
|
||||
"preferences_automatic_instance_redirect_label": "هدایت خودکار نمونه (به طور پیشفرض به redirect.invidious.io): ",
|
||||
"preferences_category_subscription": "ترجیحات اشتراک",
|
||||
"preferences_annotations_subscribed_label": "نمایش حاشیه نویسی ها به طور پیشفرض برای کانال های مشترک شده: ",
|
||||
"Redirect homepage to feed: ": "تغییر مسیر صفحه خانه به خوراک: ",
|
||||
"preferences_max_results_label": "تعداد ویدیو های نمایش داده شده در خوراک: ",
|
||||
"preferences_sort_label": "مرتب سازی ویدیو ها بر اساس: ",
|
||||
"published": "منتشر شده",
|
||||
"published - reverse": "منتشر شده - معکوس",
|
||||
"alphabetically": "بر اساس حروف الفبا",
|
||||
"alphabetically - reverse": "بر اساس حروف الفبا - معکوس",
|
||||
"channel name": "نام کانال",
|
||||
"channel name - reverse": "نام کانال - معکوس",
|
||||
"Only show latest video from channel: ": "تنها نمایش آخرین ویدیو های کانال: ",
|
||||
"Only show latest unwatched video from channel: ": "تنها نمایش آخرین ویدیو های تماشا نشده از کانال: ",
|
||||
"preferences_unseen_only_label": "تنها نمایش ویدیو های تماشا نشده: ",
|
||||
"preferences_notifications_only_label": "تنها نمایش اعلان ها (اگر وجود داشته باشد) ",
|
||||
"Enable web notifications": "فعال کردن اعلان های وب",
|
||||
"`x` uploaded a video": "`x` یک ویدیو بارگذاری کرد",
|
||||
"`x` is live": "`x` زنده است",
|
||||
"preferences_category_data": "ترجیحات داده",
|
||||
"Clear watch history": "پاککردن تاریخچه تماشا",
|
||||
"Import/export data": "وارد کردن/خارج کردن داده",
|
||||
"Change password": "تغییر گذرواژه",
|
||||
"Manage subscriptions": "مدیریت اشتراک ها",
|
||||
"Manage tokens": "مدیریت توکن ها",
|
||||
"Watch history": "تاریخچه تماشا",
|
||||
"Delete account": "حذف حساب کاربری",
|
||||
"preferences_category_admin": "ترجیحات مدیریت",
|
||||
"preferences_default_home_label": "صفحه خانه پیشفرض ",
|
||||
"preferences_feed_menu_label": "منو خوراک: ",
|
||||
"preferences_show_nick_label": "نمایش نام مستعار در بالا: ",
|
||||
"Top enabled: ": "بالا فعال شده: ",
|
||||
"CAPTCHA enabled: ": "CAPTCHA فعال شده: ",
|
||||
"Login enabled: ": "ورود فعال شده: ",
|
||||
"Registration enabled: ": "ثبت نام فعال شده: ",
|
||||
"Report statistics: ": "گذارش آمار: ",
|
||||
"Save preferences": "ذخیره ترجیحات",
|
||||
"Subscription manager": "مدیریت اشتراک",
|
||||
"Token manager": "مدیر توکن",
|
||||
"Token": "توکن",
|
||||
"tokens_count_0": "{{count}} توکن ها",
|
||||
"Import/export": "وارد کردن/خارج کردن",
|
||||
"unsubscribe": "لغو اشتراک",
|
||||
"revoke": "ابطال",
|
||||
"Subscriptions": "اشتراک ها",
|
||||
"subscriptions_unseen_notifs_count_0": "{{count}} اعلان نادیده",
|
||||
"search": "جستجو",
|
||||
"Log out": "خروج",
|
||||
"Released under the AGPLv3 on Github.": "منتشر شده تحت پروانه AGPLv3 روی گیتهاب.",
|
||||
"Source available here.": "منبع اینجا دردسترس است.",
|
||||
"View JavaScript license information.": "نمایش اطلاعات مجوز جاوا اسکریپت.",
|
||||
"View privacy policy.": "نمایش سیاست حفظ حریم خصوصی.",
|
||||
"Trending": "روند",
|
||||
"Public": "عمومی",
|
||||
"Unlisted": "لیست نشده",
|
||||
"Private": "خصوصی",
|
||||
"View all playlists": "نمایش همه سیاهههای پخش",
|
||||
"Updated `x` ago": "بروز شده `x` پیش",
|
||||
"Delete playlist `x`?": "حذف سیاههٔ پخش `x`؟",
|
||||
"Delete playlist": "حذف سیاههٔ پخش",
|
||||
"Create playlist": "ایجاد سیاههٔ پخش",
|
||||
"Title": "عنوان",
|
||||
"Playlist privacy": "حریم خصوصی سیاههٔ پخش",
|
||||
"Editing playlist `x`": "تغییر سیاههٔ پخش `x`",
|
||||
"Show more": "نمایش بیشتر",
|
||||
"Show less": "نمایش کمتر",
|
||||
"Watch on YouTube": "تماشا در یوتیوب",
|
||||
"Switch Invidious Instance": "تعویض نمونه اینویدیوس",
|
||||
"Broken? Try another Invidious Instance": "کار نمیکند؟ نمونه دیگری از اینویدیوس را امتحان کنید",
|
||||
"Hide annotations": "مخفی کردن حاشیه نویسی ها",
|
||||
"Show annotations": "نمایش حاشیه نویسی ها",
|
||||
"Genre: ": "ژانر: ",
|
||||
"License: ": "مجوز: ",
|
||||
"Family friendly? ": "خانواده دوستانه؟ ",
|
||||
"Wilson score: ": "امتیاز ویلسون: ",
|
||||
"Engagement: ": "نامزدی: ",
|
||||
"Whitelisted regions: ": "مناطق لیست سفید: ",
|
||||
"Blacklisted regions: ": "مناطق لیست سیاه: ",
|
||||
"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": "نمایش نظرات یوتیوب",
|
||||
"View more comments on Reddit": "نمایش نظرات بیشتر در ردیت",
|
||||
"View `x` comments": {
|
||||
"([^.,0-9]|^)1([^.,0-9]|$)": "نمایش `x` نظرات",
|
||||
"": "نمایش `x` نظرات"
|
||||
},
|
||||
"View Reddit comments": "نمایش نظرات ردیت",
|
||||
"Hide replies": "مخفی کردن پاسخ ها",
|
||||
"Show replies": "نمایش پاسخ ها",
|
||||
"Incorrect password": "گذرواژه نا درست",
|
||||
"Quota exceeded, try again in a few hours": "سهمیه بیشتر شده است، چند ساعت بعد دوباره تلاش کنید",
|
||||
"Unable to log in, make sure two-factor authentication (Authenticator or SMS) is turned on.": "قادر به ورود نیستید، مطمئن شوید احراز تایید-دومرحله (Authenticator یا پیامکوتاه) خاموش باشد.",
|
||||
"Invalid TFA code": "کد TFA نادرست است",
|
||||
"Login failed. This may be because two-factor authentication is not turned on for your account.": "ورود با خطا مواجه شد. این ممکن است به خاطر احراز تایید-دومرحله باشد که برای حساب کاربری شما فعال نشده است.",
|
||||
"Wrong answer": "پاسخ غلط",
|
||||
"Erroneous CAPTCHA": "CAPTCHA نا درست",
|
||||
"CAPTCHA is a required field": "CAPTCHA یک فیلد ضروری است",
|
||||
"User ID is a required field": "شناسه کاربری یک فیلد ضروری است",
|
||||
"Password is a required field": "گذرواژه یک فیلد ضروری است",
|
||||
"Wrong username or password": "نام کاربری یا گذرواژه غلط است",
|
||||
"Please sign in using 'Log in with Google'": "لطفا با استفاده از 'ورود توسط گوگل' وارد شوید",
|
||||
"Password cannot be empty": "گذرواژه نمیتواند خالی باشد",
|
||||
"Password cannot be longer than 55 characters": "گذر واژه نمیتواند از ۵۵ کاراکتر بیشتر باشد",
|
||||
"Please log in": "لطفا وارد شوید",
|
||||
"Invidious Private Feed for `x`": "خوراک خصوصی زشت برای `x`",
|
||||
"channel:`x`": "کانال: `x`",
|
||||
"Deleted or invalid channel": "کانال نا معتبر یا پاک شده است",
|
||||
"This channel does not exist.": "این کانال وجود ندارد.",
|
||||
"Could not get channel info.": "نمیتوان اطلاعات کانال را دریافت کرد.",
|
||||
"Could not fetch comments": "نمیتوان نظرات را دریافت کرد",
|
||||
"comments_view_x_replies_0": "نمایش {{count}} پاسخ ها",
|
||||
"`x` ago": "`x` پیش",
|
||||
"Load more": "بارگذاری بیشتر",
|
||||
"comments_points_count_0": "{{count}} نقطه ها",
|
||||
"Could not create mix.": "نمیتوان میکس ساخت.",
|
||||
"Empty playlist": "سیاههٔ پخش خالی",
|
||||
"Not a playlist.": "یک سیاههٔ پخش نیست.",
|
||||
"Playlist does not exist.": "سیاههٔ پخش وجود ندارد.",
|
||||
"Could not pull trending pages.": "نمیتوان صفحه های پر طرفدار را بکشد.",
|
||||
"Hidden field \"challenge\" is a required field": "فیلد مخفی \"چالش\" یک فیلد ضروری است",
|
||||
"Hidden field \"token\" is a required field": "فیلد مخفی \"توکن\" یک فیلد ضروری است",
|
||||
"Erroneous challenge": "چالش غلط",
|
||||
"Erroneous token": "توکن غلط",
|
||||
"No such user": "چنین کاربری وجود ندارد",
|
||||
"Token is expired, please try again": "توکن ضروری است، لطفا دوباره تلاش کنید",
|
||||
"English": "انگلیسی",
|
||||
"English (auto-generated)": "انگلیسی (خودکار-تولیدشده)",
|
||||
"Afrikaans": "آفریکانس",
|
||||
"Albanian": "آلبانیایی",
|
||||
"Amharic": "امهری",
|
||||
"Arabic": "عربی",
|
||||
"Armenian": "ارمنی",
|
||||
"Azerbaijani": "آذربایجانی",
|
||||
"Bangla": "بنگالی",
|
||||
"Basque": "باسکی",
|
||||
"Belarusian": "بلاروسی",
|
||||
"Bosnian": "بوسنیایی",
|
||||
"Bulgarian": "بلغاری",
|
||||
"Burmese": "برمهای",
|
||||
"Catalan": "کاتالان",
|
||||
"Cebuano": "سبوانو",
|
||||
"Chinese (Simplified)": "چینی (ساده شده)",
|
||||
"Chinese (Traditional)": "چینی (سنتی)",
|
||||
"Corsican": "کرس",
|
||||
"Croatian": "کرواسی",
|
||||
"Czech": "چکی",
|
||||
"Danish": "دانمارکی",
|
||||
"Dutch": "هلندی",
|
||||
"Esperanto": "اسپرانتو",
|
||||
"Estonian": "استونیایی",
|
||||
"Filipino": "فلیپینی",
|
||||
"Finnish": "فنلاندی",
|
||||
"French": "فرانسوی",
|
||||
"Galician": "گالیسی",
|
||||
"Georgian": "گرجی",
|
||||
"German": "آلمانی",
|
||||
"Greek": "یونانی",
|
||||
"Gujarati": "گجراتی",
|
||||
"Haitian Creole": "کریول آییسینی",
|
||||
"Hausa": "هوسه",
|
||||
"Hawaiian": "هاوائی",
|
||||
"Hebrew": "عبری",
|
||||
"Hindi": "هندی",
|
||||
"Hmong": "همونگ",
|
||||
"Hungarian": "مجاری",
|
||||
"Icelandic": "ایسلندی",
|
||||
"Igbo": "ایگبو",
|
||||
"Indonesian": "اندونزیایی",
|
||||
"Irish": "شلتا",
|
||||
"Italian": "ایتالیایی",
|
||||
"Japanese": "ژاپنی",
|
||||
"Javanese": "جاوهای",
|
||||
"Kannada": "کانارا",
|
||||
"Kazakh": "قزاقی",
|
||||
"Khmer": "خمر",
|
||||
"Korean": "کرهای",
|
||||
"Kurdish": "کردی",
|
||||
"Kyrgyz": "قرقیزی",
|
||||
"Lao": "لائو",
|
||||
"Latin": "لاتین",
|
||||
"Latvian": "لتونیایی",
|
||||
"Lithuanian": "لیتوانیایی",
|
||||
"Luxembourgish": "لوکزامبورگی",
|
||||
"Macedonian": "مقدونی",
|
||||
"Malagasy": "مالاگاسی",
|
||||
"Malay": "مالایی",
|
||||
"Malayalam": "مالایالم",
|
||||
"Maltese": "مالتی",
|
||||
"Maori": "مائوری",
|
||||
"Marathi": "مراتی",
|
||||
"Mongolian": "مغولی",
|
||||
"Nepali": "نپالی",
|
||||
"Norwegian Bokmål": "بوکمل",
|
||||
"Nyanja": "چوایی",
|
||||
"Pashto": "پشتو",
|
||||
"Persian": "فارسی",
|
||||
"Polish": "لهستانی",
|
||||
"Portuguese": "پرتغالی",
|
||||
"Punjabi": "پنجابی",
|
||||
"Romanian": "رومانیایی",
|
||||
"Russian": "روسی",
|
||||
"Samoan": "ساموآیی",
|
||||
"Scottish Gaelic": "گیلیک اسکاتلندی",
|
||||
"Serbian": "صربی",
|
||||
"Shona": "شونا",
|
||||
"Sindhi": "سندی",
|
||||
"Sinhala": "سینهالی",
|
||||
"Slovak": "اسلواکی",
|
||||
"Slovenian": "اسلونیایی",
|
||||
"Somali": "سومالیایی",
|
||||
"Southern Sotho": "سوتو",
|
||||
"Spanish": "اسپانیایی",
|
||||
"Spanish (Latin America)": "اسپانیایی (آمریکای لاتین)",
|
||||
"Sundanese": "سوندایی",
|
||||
"Swahili": "سواحلی",
|
||||
"Swedish": "سوئدی",
|
||||
"Tajik": "تاجیک",
|
||||
"Tamil": "تامیلی",
|
||||
"Telugu": "تلوگو",
|
||||
"Thai": "تای",
|
||||
"Turkish": "ترکی",
|
||||
"Ukrainian": "اوکراینی",
|
||||
"Urdu": "اردو",
|
||||
"Uzbek": "ازبکی",
|
||||
"Vietnamese": "ویتنامی",
|
||||
"Welsh": "ولزی",
|
||||
"Western Frisian": "فریسی غربی",
|
||||
"Xhosa": "خوسایی",
|
||||
"Yiddish": "ییدیش",
|
||||
"Yoruba": "یوروبایی",
|
||||
"Zulu": "زولو",
|
||||
"generic_count_years_0": "{{count}} سال",
|
||||
"generic_count_months_0": "{{count}} ماه",
|
||||
"generic_count_weeks_0": "{{count}} هفته",
|
||||
"generic_count_days_0": "{{count}} روز",
|
||||
"generic_count_hours_0": "{{count}} ساعت",
|
||||
"generic_count_minutes_0": "{{count}} دقیقه",
|
||||
"generic_count_seconds_0": "{{count}} ثانیه",
|
||||
"Fallback comments: ": "نظرات عقب گرد: ",
|
||||
"Popular": "محبوب",
|
||||
"Search": "جستجو",
|
||||
"Top": "بالا",
|
||||
"About": "درباره",
|
||||
"Rating: ": "رتبه دهی: ",
|
||||
"preferences_locale_label": "زبان: ",
|
||||
"View as playlist": "نمایش به عنوان سیاههٔ پخش",
|
||||
"Default": "پیشفرض",
|
||||
"Music": "موسیقی",
|
||||
"Gaming": "بازی",
|
||||
"News": "اخبار",
|
||||
"Movies": "فیلمها",
|
||||
"Download": "بارگیری",
|
||||
"Download as: ": "بارگیری به عنوان: ",
|
||||
"%A %B %-d, %Y": "%A %B %-d، %Y",
|
||||
"(edited)": "(ویرایش شده)",
|
||||
"YouTube comment permalink": "پیوست ثابت نظرات یوتیوب",
|
||||
"permalink": "پیوست ثابت",
|
||||
"`x` marked it with a ❤": "`x` نشان گذاری شده با یک ❤",
|
||||
"Audio mode": "حالت صدا",
|
||||
"Video mode": "حالت ویدیو",
|
||||
"Videos": "ویدیو ها",
|
||||
"Playlists": "سیاهههای پخش",
|
||||
"Community": "اجتماع",
|
||||
"relevance": "مرتبط بودن",
|
||||
"rating": "امتیاز",
|
||||
"date": "تاریخ بارگذاری",
|
||||
"views": "تعداد بازدید",
|
||||
"content_type": "نوع",
|
||||
"duration": "مدت",
|
||||
"features": "ویژگیها",
|
||||
"sort": "به ترتیب",
|
||||
"hour": "یک ساعت گذشته",
|
||||
"today": "امروز",
|
||||
"week": "این هفته",
|
||||
"month": "این ماه",
|
||||
"year": "امسال",
|
||||
"video": "ویدئو",
|
||||
"channel": "کانال",
|
||||
"playlist": "سیاههٔ پخش",
|
||||
"movie": "فیلم",
|
||||
"show": "نمایش",
|
||||
"hd": "HD",
|
||||
"subtitles": "زیرنویس",
|
||||
"creative_commons": "کریتیو کامونز",
|
||||
"3d": "سهبعدی",
|
||||
"live": "زنده",
|
||||
"4k": "4K",
|
||||
"location": "مکان",
|
||||
"hdr": "HDR",
|
||||
"filter": "پالایه",
|
||||
"Current version: ": "نسخه فعلی: ",
|
||||
"next_steps_error_message": "اکنون بایستی یکی از این موارد را امتحان کنید: ",
|
||||
"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_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",
|
||||
"invidious": "اینویدیوس",
|
||||
"360": "360°",
|
||||
"footer_donate_page": "کمک مالی",
|
||||
"footer_source_code": "کد منبع",
|
||||
"footer_modfied_source_code": "کد منبع ویرایش شده",
|
||||
"none": "هیچکدام",
|
||||
"videoinfo_started_streaming_x_ago": "پخش جریانی `x` پیش آغاز شد",
|
||||
"videoinfo_watch_on_youTube": "تماشا در یوتیوب",
|
||||
"videoinfo_youTube_embed_link": "توکار",
|
||||
"videoinfo_invidious_embed_link": "پیوند توکار",
|
||||
"download_subtitles": "زیرنویسها - `x` (.vtt)",
|
||||
"Video unavailable": "ویدئو دردسترس نیست",
|
||||
"preferences_save_player_pos_label": "ذخیره زمان کنونی ویدئو: ",
|
||||
"purchased": "خریداری شده",
|
||||
"preferences_quality_dash_label": "کیفیت ترجیحی ویدئو DASH: ",
|
||||
"preferences_region_label": "کشور محتوا: ",
|
||||
"footer_documentation": "مستندات",
|
||||
"footer_original_source_code": "کد منبع اصلی",
|
||||
"long": "بلند (> 20 دقیقه)",
|
||||
"adminprefs_modified_source_code_url_label": "URL مخزن کد منبع ویریش شده",
|
||||
"short": "کوتاه (< 4 دقیقه)"
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user