mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-12-23 17:24:46 +03:00
Compare commits
520 Commits
v10.11.0-r
...
v10.11.5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1e27f460fe | ||
|
|
4cdd8c8233 | ||
|
|
6e60634c9f | ||
|
|
12c5d6b636 | ||
|
|
b617c62f8e | ||
|
|
035b5895b0 | ||
|
|
22da5187c8 | ||
|
|
5804d6840c | ||
|
|
b50ce1ad6b | ||
|
|
481ee03f35 | ||
|
|
d91adb5d54 | ||
|
|
ef7f138a4e | ||
|
|
2e8d9a311b | ||
|
|
4c5a3fbff3 | ||
|
|
636908fc4d | ||
|
|
997362fc97 | ||
|
|
c5147341e3 | ||
|
|
ca33bcebf0 | ||
|
|
d32f487e8e | ||
|
|
fb65f8f853 | ||
|
|
2a0b90e385 | ||
|
|
dde70fd8a2 | ||
|
|
98d1d0cb35 | ||
|
|
ba76a8f3ad | ||
|
|
8cd5652157 | ||
|
|
8aff4227d9 | ||
|
|
026f7472cb | ||
|
|
daca285568 | ||
|
|
fbb9a0b2c7 | ||
|
|
29b3aa8543 | ||
|
|
94f3725208 | ||
|
|
0ee81e87be | ||
|
|
c491a918c2 | ||
|
|
1e7e46cb82 | ||
|
|
5ae444d96d | ||
|
|
ee7ad83427 | ||
|
|
921d7d3364 | ||
|
|
f8e012582a | ||
|
|
def5956cd1 | ||
|
|
abfbaca336 | ||
|
|
6566188e45 | ||
|
|
078f9584ed | ||
|
|
ee34c75386 | ||
|
|
e8150428b6 | ||
|
|
4b38e35bbb | ||
|
|
435bb14bb2 | ||
|
|
2e5ced5098 | ||
|
|
f4a846aa4d | ||
|
|
7c1063177f | ||
|
|
5878b1ffc5 | ||
|
|
3c3c2aee0d | ||
|
|
511223aac4 | ||
|
|
3b2d64995a | ||
|
|
13c4517a66 | ||
|
|
177b6464ca | ||
|
|
5a9a8363f4 | ||
|
|
49efd68fc7 | ||
|
|
90a8a26c6e | ||
|
|
002c83e6f5 | ||
|
|
7222910b05 | ||
|
|
097cb87f6f | ||
|
|
91c3b1617e | ||
|
|
8f71922734 | ||
|
|
d140630208 | ||
|
|
63a3e55297 | ||
|
|
c2e5081d64 | ||
|
|
4187c6f620 | ||
|
|
e7dbb3afec | ||
|
|
f994dd6211 | ||
|
|
da254ee968 | ||
|
|
4ad3141875 | ||
|
|
b5f0199a25 | ||
|
|
6bf88c049e | ||
|
|
40a33da2a5 | ||
|
|
3596fc0693 | ||
|
|
93824dad97 | ||
|
|
e5656af1f2 | ||
|
|
c127c10458 | ||
|
|
7d1824ea27 | ||
|
|
2966d27c97 | ||
|
|
618ec4543e | ||
|
|
0e4031ae52 | ||
|
|
442af96ed9 | ||
|
|
a305204cfa | ||
|
|
75f472e6a7 | ||
|
|
cc32e8f7cb | ||
|
|
14b3085ff1 | ||
|
|
5691eee4f1 | ||
|
|
1520a697ad | ||
|
|
81b8b0ca4a | ||
|
|
ac3fa3c376 | ||
|
|
7a1c1cd342 | ||
|
|
70c32a26fa | ||
|
|
2b94bb54aa | ||
|
|
0a6e8146be | ||
|
|
305b0fdca3 | ||
|
|
d738386fe2 | ||
|
|
ca830d5be7 | ||
|
|
a5bc4524d8 | ||
|
|
175ee12bbc | ||
|
|
a725220c21 | ||
|
|
a245605152 | ||
|
|
f4a53209f4 | ||
|
|
877251bcae | ||
|
|
ace30afcf8 | ||
|
|
fc056b6273 | ||
|
|
ac5efb4775 | ||
|
|
fefd676adc | ||
|
|
59c17a663c | ||
|
|
641551e164 | ||
|
|
bd543d7ac3 | ||
|
|
545e412259 | ||
|
|
7dff92bb82 | ||
|
|
b36aab9399 | ||
|
|
2c7d2d4719 | ||
|
|
5c519270b8 | ||
|
|
55047b1183 | ||
|
|
794e1361d7 | ||
|
|
27c9c9c0ed | ||
|
|
68636b2390 | ||
|
|
2e6430c4f4 | ||
|
|
c88d792963 | ||
|
|
73dbc9e89f | ||
|
|
cf3edd9875 | ||
|
|
ef0131ad69 | ||
|
|
056c318f04 | ||
|
|
49c3443b0c | ||
|
|
e415718fe7 | ||
|
|
8abcfb2a80 | ||
|
|
9aadf97958 | ||
|
|
9e57121171 | ||
|
|
b471811920 | ||
|
|
3cb99add76 | ||
|
|
001f1c4377 | ||
|
|
9ef3706b44 | ||
|
|
864d6d0b8f | ||
|
|
a565e4896e | ||
|
|
ceef9143ad | ||
|
|
a7a92509c7 | ||
|
|
e876e784da | ||
|
|
9b7d5edc86 | ||
|
|
f01cddf273 | ||
|
|
0d4bd0495b | ||
|
|
6f9c4dea6e | ||
|
|
8c51920911 | ||
|
|
8f2fd65810 | ||
|
|
953659980f | ||
|
|
8ab1fecb70 | ||
|
|
f5d42ee180 | ||
|
|
e28d547006 | ||
|
|
b3b9f74014 | ||
|
|
07d31c6ba5 | ||
|
|
a9198e865e | ||
|
|
79ff0b0b00 | ||
|
|
2b45a984dd | ||
|
|
739642b330 | ||
|
|
6097045d71 | ||
|
|
51e20a14c2 | ||
|
|
eb0d05cf1e | ||
|
|
d3d5915f31 | ||
|
|
288640a5d0 | ||
|
|
ff0a1b999f | ||
|
|
da0fe7455e | ||
|
|
bf69f9d8a8 | ||
|
|
badf22fcc2 | ||
|
|
b59e9f90f0 | ||
|
|
056b92dbd5 | ||
|
|
ba80f5e416 | ||
|
|
97ec4c1da2 | ||
|
|
894ba1a410 | ||
|
|
0a0aaefad5 | ||
|
|
c8b97bf533 | ||
|
|
cfa4e357ea | ||
|
|
0f42aa892e | ||
|
|
cce6bf27e0 | ||
|
|
d6cebf1e67 | ||
|
|
c053a6cd78 | ||
|
|
d8c62420bf | ||
|
|
d483c3efe6 | ||
|
|
275c1a3cc1 | ||
|
|
4942b2c15f | ||
|
|
3fc71293b4 | ||
|
|
8ea9bece03 | ||
|
|
baa7f5f0b0 | ||
|
|
b9c96f3d2c | ||
|
|
08f9b932ac | ||
|
|
e6cd73df03 | ||
|
|
71ebb1f456 | ||
|
|
9c298c52f5 | ||
|
|
3e8db40901 | ||
|
|
f9ead9615c | ||
|
|
93af2d6f67 | ||
|
|
027c91949d | ||
|
|
526ec83305 | ||
|
|
dfcacce1b0 | ||
|
|
2a54669a8a | ||
|
|
54d48fa446 | ||
|
|
1736a566cc | ||
|
|
04ab362e59 | ||
|
|
e282b05b8f | ||
|
|
2aa39226c6 | ||
|
|
60fbd39bb9 | ||
|
|
740b9924a0 | ||
|
|
5a6d9180fe | ||
|
|
897975fc57 | ||
|
|
7dab62616f | ||
|
|
f1bd9a40d5 | ||
|
|
469e6e1bc8 | ||
|
|
38f5f8008a | ||
|
|
7bb68d8610 | ||
|
|
27047c35a4 | ||
|
|
42003ca9d2 | ||
|
|
98f5e21bb8 | ||
|
|
162985bb23 | ||
|
|
0d2c551cce | ||
|
|
717e7cbd77 | ||
|
|
58f9bdcf5c | ||
|
|
2a499aaa95 | ||
|
|
4246825239 | ||
|
|
68810c690b | ||
|
|
b73ea1b99d | ||
|
|
59f77c24c9 | ||
|
|
0949212993 | ||
|
|
248aac9a3a | ||
|
|
a1b85a63e7 | ||
|
|
091cb1c34a | ||
|
|
eaf33f01e1 | ||
|
|
db2dbaa62b | ||
|
|
1a7df6daf7 | ||
|
|
a0b3e2b071 | ||
|
|
2618a5fba2 | ||
|
|
2ee887a502 | ||
|
|
a17e157d44 | ||
|
|
6b6745b7fe | ||
|
|
594f9e4f6b | ||
|
|
4cda5f5ff2 | ||
|
|
24410d8a2e | ||
|
|
4d36bd635d | ||
|
|
ef65534071 | ||
|
|
7c6cedd90a | ||
|
|
96590eea85 | ||
|
|
6796b3435d | ||
|
|
8776a447d1 | ||
|
|
c02a24e32a | ||
|
|
deee04ae38 | ||
|
|
580db0c1d2 | ||
|
|
8fcc2496d9 | ||
|
|
f0e60a7ff3 | ||
|
|
a99e67544a | ||
|
|
bca6400bc3 | ||
|
|
986a509955 | ||
|
|
da19f02f7b | ||
|
|
3fad5eb069 | ||
|
|
9923a51aed | ||
|
|
585e9a2fe2 | ||
|
|
8e81737dba | ||
|
|
e4e578b37a | ||
|
|
387bc0c8eb | ||
|
|
cbb569a277 | ||
|
|
1fa63b797b | ||
|
|
aa3a7c88a4 | ||
|
|
0a2cf69a55 | ||
|
|
0845b0c258 | ||
|
|
e043f93a72 | ||
|
|
6ac2d707cb | ||
|
|
20f7ddbf8f | ||
|
|
4849486fa0 | ||
|
|
4ccd3da77a | ||
|
|
bc28dc11c0 | ||
|
|
d9eaeed61d | ||
|
|
c7320dc189 | ||
|
|
71048917dd | ||
|
|
11eab1b663 | ||
|
|
a17a0495d8 | ||
|
|
b3e57a5f7d | ||
|
|
65827cce6f | ||
|
|
b5df0d2a34 | ||
|
|
339a31f0a5 | ||
|
|
a0d4ae1974 | ||
|
|
d65b18a7f3 | ||
|
|
cc93b44947 | ||
|
|
e753adac2c | ||
|
|
0b465842c8 | ||
|
|
da3f3b09d9 | ||
|
|
7a9beb3745 | ||
|
|
c7ee07b14a | ||
|
|
d8dfbc26f6 | ||
|
|
88e0d35ed7 | ||
|
|
1eadb07a12 | ||
|
|
26d9633fed | ||
|
|
19aadd934b | ||
|
|
ce28374d40 | ||
|
|
7aa1c46447 | ||
|
|
ffb7753f8d | ||
|
|
14884f2628 | ||
|
|
41188ff054 | ||
|
|
cb6e38d830 | ||
|
|
4ba34709d6 | ||
|
|
28b8d3ee29 | ||
|
|
9eaca73888 | ||
|
|
29e17b6bc0 | ||
|
|
84cde7383f | ||
|
|
a2c0799489 | ||
|
|
ad133eb6b9 | ||
|
|
50180adc53 | ||
|
|
bd94ca3071 | ||
|
|
869b4f8bbf | ||
|
|
a4d856360b | ||
|
|
beca405ad4 | ||
|
|
c0be325b89 | ||
|
|
dea500b26b | ||
|
|
47634e731a | ||
|
|
cd1d11366e | ||
|
|
76dfaead8b | ||
|
|
5eef85f027 | ||
|
|
e6a7530ced | ||
|
|
00be664b9e | ||
|
|
e1d0f7d1e5 | ||
|
|
0a4ff3f3c0 | ||
|
|
21f214b1a6 | ||
|
|
0650666497 | ||
|
|
877899dcc2 | ||
|
|
bf2f8ec633 | ||
|
|
2eff03b03e | ||
|
|
103932e4fb | ||
|
|
2b94b3b5f6 | ||
|
|
64032e8656 | ||
|
|
329ce8d4c2 | ||
|
|
2a7c924904 | ||
|
|
72664a68bc | ||
|
|
3ec123b616 | ||
|
|
376220661b | ||
|
|
9e88121647 | ||
|
|
c7c7b30d28 | ||
|
|
601ce4c3b1 | ||
|
|
fcc7f53e81 | ||
|
|
e3acf08acc | ||
|
|
c60139a32c | ||
|
|
6d4efe6523 | ||
|
|
43a955dded | ||
|
|
5cae44fdf7 | ||
|
|
c3cb5fd2f9 | ||
|
|
1262ac31dc | ||
|
|
0f5bb5cf76 | ||
|
|
ce78af2ed4 | ||
|
|
4b6fb6c4bb | ||
|
|
db7465e83d | ||
|
|
803e87ca5f | ||
|
|
9e36fa4263 | ||
|
|
a52a230778 | ||
|
|
b00e381109 | ||
|
|
b8fb8bd608 | ||
|
|
34c9adef80 | ||
|
|
c8d2f43660 | ||
|
|
ef733c5ace | ||
|
|
a1eb04dc0b | ||
|
|
711e649e35 | ||
|
|
1d408a1503 | ||
|
|
6391dd9570 | ||
|
|
2007815fa6 | ||
|
|
a5b4eca804 | ||
|
|
76d498ac9d | ||
|
|
90b4345cfd | ||
|
|
317192c23d | ||
|
|
dcb12a73fb | ||
|
|
b15abddfd7 | ||
|
|
cfde5af3b0 | ||
|
|
26a6cfaf65 | ||
|
|
8a8018f0de | ||
|
|
6f49782b7b | ||
|
|
536437bbe3 | ||
|
|
ba54cda774 | ||
|
|
e86315128d | ||
|
|
7320e10329 | ||
|
|
5b544bf1ed | ||
|
|
1a1d9b2404 | ||
|
|
96a05276a6 | ||
|
|
dfab2fb6e2 | ||
|
|
7785b51f57 | ||
|
|
a068f75623 | ||
|
|
1ed191c5b3 | ||
|
|
0e3fbb6abd | ||
|
|
583a861b32 | ||
|
|
3bcfe13652 | ||
|
|
f5a135a1db | ||
|
|
0cea853b45 | ||
|
|
663087b155 | ||
|
|
dddeea1f7b | ||
|
|
a148a4ad02 | ||
|
|
57d077d08e | ||
|
|
774be151aa | ||
|
|
7569ac65a8 | ||
|
|
4621a99c7c | ||
|
|
1e796e0b7a | ||
|
|
4da5483ef4 | ||
|
|
eea0872980 | ||
|
|
36c90ce2ce | ||
|
|
48e93dcbce | ||
|
|
6cee66119e | ||
|
|
c62a07405e | ||
|
|
7bd08ab290 | ||
|
|
088ef0d37a | ||
|
|
ba0f61ef2d | ||
|
|
c70f6bffcf | ||
|
|
21a6d6f0d6 | ||
|
|
aa77dfb92d | ||
|
|
2ad37fe021 | ||
|
|
fd5205a6eb | ||
|
|
60cfa65cdc | ||
|
|
e5139e1004 | ||
|
|
aa1abf8b94 | ||
|
|
742b5637fa | ||
|
|
25a362345d | ||
|
|
310a54f090 | ||
|
|
e9d92bdcb0 | ||
|
|
dc39a51475 | ||
|
|
c51f3a3342 | ||
|
|
7ece959f4e | ||
|
|
c96e828002 | ||
|
|
ab56ceaa16 | ||
|
|
4645633acf | ||
|
|
d6f93759ea | ||
|
|
bf3f37e3d0 | ||
|
|
982e0c9370 | ||
|
|
55e681b9a6 | ||
|
|
7ba77804c4 | ||
|
|
af6f5a8ed0 | ||
|
|
1162fcebf8 | ||
|
|
38d0367c42 | ||
|
|
7d3372018f | ||
|
|
8629831658 | ||
|
|
db55d983f8 | ||
|
|
4d5ba8d7a5 | ||
|
|
6d4169a449 | ||
|
|
8dcb0bfecb | ||
|
|
844d69ab64 | ||
|
|
5c36b44484 | ||
|
|
4e4d7e7764 | ||
|
|
4c268a3579 | ||
|
|
77bcd2f5f6 | ||
|
|
8406924471 | ||
|
|
67fd4ce187 | ||
|
|
b37b39773a | ||
|
|
6f98767aed | ||
|
|
643460f484 | ||
|
|
a4231bf428 | ||
|
|
9c817a97a9 | ||
|
|
f9c4c9b345 | ||
|
|
dde306b170 | ||
|
|
e2b61d951b | ||
|
|
9eff25bfed | ||
|
|
ff4484eb4a | ||
|
|
62b2adbf66 | ||
|
|
9ac8c2a2fa | ||
|
|
90e72fb687 | ||
|
|
630846798d | ||
|
|
9d5be19a27 | ||
|
|
6058ab50f8 | ||
|
|
e3b379052d | ||
|
|
0b6f4b2bd9 | ||
|
|
4f6db1bc22 | ||
|
|
8c8c71125c | ||
|
|
c6e568692e | ||
|
|
d5a76bdff8 | ||
|
|
ebdc756547 | ||
|
|
10d0cec7b9 | ||
|
|
10cc651790 | ||
|
|
7d18f3d6ed | ||
|
|
9b8c12d433 | ||
|
|
ba0eb87371 | ||
|
|
d561cef81f | ||
|
|
b528c1100f | ||
|
|
96c9f4fdad | ||
|
|
6d077fcf40 | ||
|
|
ab99b2bad3 | ||
|
|
db36be7a6b | ||
|
|
85f158e1dd | ||
|
|
e1365bd253 | ||
|
|
1ec66adc30 | ||
|
|
af0bcbc652 | ||
|
|
b2312466e1 | ||
|
|
cc7915c2e6 | ||
|
|
a537c66da1 | ||
|
|
a43adf42f3 | ||
|
|
6996c8a1de | ||
|
|
f976630003 | ||
|
|
965cf93419 | ||
|
|
70ea3f863a | ||
|
|
989aef18af | ||
|
|
ccb917b8df | ||
|
|
7cf6389ab5 | ||
|
|
2473b89a8d | ||
|
|
6575c69a4e | ||
|
|
66d594836c | ||
|
|
43028f735f | ||
|
|
e83b992eef | ||
|
|
8368d10d1b | ||
|
|
e8291fc856 | ||
|
|
308707476d | ||
|
|
e252589900 | ||
|
|
1220cac255 | ||
|
|
7218d82c21 | ||
|
|
a4524eb2ad | ||
|
|
553ba56389 | ||
|
|
afa2103d42 | ||
|
|
7256c9c89d | ||
|
|
f3cdaeaa12 | ||
|
|
368808eba4 | ||
|
|
0fc8ed6aeb | ||
|
|
98daf4aedb | ||
|
|
fcf56b73cb | ||
|
|
e8239a7ee2 | ||
|
|
84cebeae64 | ||
|
|
c0e2875818 | ||
|
|
411ba03bf0 | ||
|
|
b2e19c0306 | ||
|
|
a7891b3f2d | ||
|
|
e7bc86ebb8 | ||
|
|
7aa96dfc20 | ||
|
|
70d07b830d |
@@ -3,7 +3,7 @@
|
|||||||
"isRoot": true,
|
"isRoot": true,
|
||||||
"tools": {
|
"tools": {
|
||||||
"dotnet-ef": {
|
"dotnet-ef": {
|
||||||
"version": "9.0.6",
|
"version": "9.0.11",
|
||||||
"commands": [
|
"commands": [
|
||||||
"dotnet-ef"
|
"dotnet-ef"
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
"dotnetRuntimeVersions": "9.0",
|
"dotnetRuntimeVersions": "9.0",
|
||||||
"aspNetCoreRuntimeVersions": "9.0"
|
"aspNetCoreRuntimeVersions": "9.0"
|
||||||
},
|
},
|
||||||
"ghcr.io/devcontainers-contrib/features/apt-packages:1": {
|
"ghcr.io/devcontainers-extra/features/apt-packages:1": {
|
||||||
"preserve_apt_list": false,
|
"preserve_apt_list": false,
|
||||||
"packages": [
|
"packages": [
|
||||||
"libfontconfig1"
|
"libfontconfig1"
|
||||||
|
|||||||
@@ -294,6 +294,9 @@ dotnet_diagnostic.CA1854.severity = error
|
|||||||
# error on CA1860: Avoid using 'Enumerable.Any()' extension method
|
# error on CA1860: Avoid using 'Enumerable.Any()' extension method
|
||||||
dotnet_diagnostic.CA1860.severity = error
|
dotnet_diagnostic.CA1860.severity = error
|
||||||
|
|
||||||
|
# error on CA1861: Avoid constant arrays as arguments
|
||||||
|
dotnet_diagnostic.CA1861.severity = error
|
||||||
|
|
||||||
# error on CA1862: Use the 'StringComparison' method overloads to perform case-insensitive string comparisons
|
# error on CA1862: Use the 'StringComparison' method overloads to perform case-insensitive string comparisons
|
||||||
dotnet_diagnostic.CA1862.severity = error
|
dotnet_diagnostic.CA1862.severity = error
|
||||||
|
|
||||||
|
|||||||
10
.github/workflows/ci-codeql-analysis.yml
vendored
10
.github/workflows/ci-codeql-analysis.yml
vendored
@@ -20,18 +20,18 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1
|
uses: actions/setup-dotnet@2016bd2012dba4e32de620c46fe006a3ac9f0602 # v5.0.1
|
||||||
with:
|
with:
|
||||||
dotnet-version: '9.0.x'
|
dotnet-version: '9.0.x'
|
||||||
|
|
||||||
- name: Initialize CodeQL
|
- name: Initialize CodeQL
|
||||||
uses: github/codeql-action/init@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
uses: github/codeql-action/init@fe4161a26a8629af62121b670040955b330f9af2 # v4.31.6
|
||||||
with:
|
with:
|
||||||
languages: ${{ matrix.language }}
|
languages: ${{ matrix.language }}
|
||||||
queries: +security-extended
|
queries: +security-extended
|
||||||
- name: Autobuild
|
- name: Autobuild
|
||||||
uses: github/codeql-action/autobuild@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
uses: github/codeql-action/autobuild@fe4161a26a8629af62121b670040955b330f9af2 # v4.31.6
|
||||||
- name: Perform CodeQL Analysis
|
- name: Perform CodeQL Analysis
|
||||||
uses: github/codeql-action/analyze@ce28f5bb42b7a9f2c824e633a3f6ee835bab6858 # v3.29.0
|
uses: github/codeql-action/analyze@fe4161a26a8629af62121b670040955b330f9af2 # v4.31.6
|
||||||
|
|||||||
22
.github/workflows/ci-compat.yml
vendored
22
.github/workflows/ci-compat.yml
vendored
@@ -11,13 +11,13 @@ jobs:
|
|||||||
permissions: read-all
|
permissions: read-all
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||||
|
|
||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1
|
uses: actions/setup-dotnet@2016bd2012dba4e32de620c46fe006a3ac9f0602 # v5.0.1
|
||||||
with:
|
with:
|
||||||
dotnet-version: '9.0.x'
|
dotnet-version: '9.0.x'
|
||||||
|
|
||||||
@@ -26,7 +26,7 @@ jobs:
|
|||||||
dotnet build Jellyfin.Server -o ./out
|
dotnet build Jellyfin.Server -o ./out
|
||||||
|
|
||||||
- name: Upload Head
|
- name: Upload Head
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: abi-head
|
name: abi-head
|
||||||
retention-days: 14
|
retention-days: 14
|
||||||
@@ -40,14 +40,14 @@ jobs:
|
|||||||
permissions: read-all
|
permissions: read-all
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
|
||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1
|
uses: actions/setup-dotnet@2016bd2012dba4e32de620c46fe006a3ac9f0602 # v5.0.1
|
||||||
with:
|
with:
|
||||||
dotnet-version: '9.0.x'
|
dotnet-version: '9.0.x'
|
||||||
|
|
||||||
@@ -65,7 +65,7 @@ jobs:
|
|||||||
dotnet build Jellyfin.Server -o ./out
|
dotnet build Jellyfin.Server -o ./out
|
||||||
|
|
||||||
- name: Upload Head
|
- name: Upload Head
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: abi-base
|
name: abi-base
|
||||||
retention-days: 14
|
retention-days: 14
|
||||||
@@ -85,13 +85,13 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Download abi-head
|
- name: Download abi-head
|
||||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: abi-head
|
name: abi-head
|
||||||
path: abi-head
|
path: abi-head
|
||||||
|
|
||||||
- name: Download abi-base
|
- name: Download abi-base
|
||||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: abi-base
|
name: abi-base
|
||||||
path: abi-base
|
path: abi-base
|
||||||
@@ -115,7 +115,7 @@ jobs:
|
|||||||
} >> $GITHUB_OUTPUT
|
} >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
- name: Find difference comment
|
- name: Find difference comment
|
||||||
uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3.1.0
|
uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad # v4.0.0
|
||||||
id: find-comment
|
id: find-comment
|
||||||
with:
|
with:
|
||||||
issue-number: ${{ github.event.pull_request.number }}
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
@@ -123,7 +123,7 @@ jobs:
|
|||||||
body-includes: abi-diff-workflow-comment
|
body-includes: abi-diff-workflow-comment
|
||||||
|
|
||||||
- name: Reply or edit difference comment (changed)
|
- name: Reply or edit difference comment (changed)
|
||||||
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
|
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
|
||||||
if: ${{ steps.diff.outputs.body != '' }}
|
if: ${{ steps.diff.outputs.body != '' }}
|
||||||
with:
|
with:
|
||||||
issue-number: ${{ github.event.pull_request.number }}
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
@@ -142,7 +142,7 @@ jobs:
|
|||||||
</details>
|
</details>
|
||||||
|
|
||||||
- name: Reply or edit difference comment (unchanged)
|
- name: Reply or edit difference comment (unchanged)
|
||||||
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
|
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
|
||||||
if: ${{ steps.diff.outputs.body == '' && steps.find-comment.outputs.comment-id != '' }}
|
if: ${{ steps.diff.outputs.body == '' && steps.find-comment.outputs.comment-id != '' }}
|
||||||
with:
|
with:
|
||||||
issue-number: ${{ github.event.pull_request.number }}
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
|
|||||||
30
.github/workflows/ci-openapi.yml
vendored
30
.github/workflows/ci-openapi.yml
vendored
@@ -16,18 +16,18 @@ jobs:
|
|||||||
permissions: read-all
|
permissions: read-all
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1
|
uses: actions/setup-dotnet@2016bd2012dba4e32de620c46fe006a3ac9f0602 # v5.0.1
|
||||||
with:
|
with:
|
||||||
dotnet-version: '9.0.x'
|
dotnet-version: '9.0.x'
|
||||||
- name: Generate openapi.json
|
- name: Generate openapi.json
|
||||||
run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests"
|
run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests"
|
||||||
- name: Upload openapi.json
|
- name: Upload openapi.json
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: openapi-head
|
name: openapi-head
|
||||||
retention-days: 14
|
retention-days: 14
|
||||||
@@ -41,7 +41,7 @@ jobs:
|
|||||||
permissions: read-all
|
permissions: read-all
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
ref: ${{ github.event.pull_request.head.sha }}
|
ref: ${{ github.event.pull_request.head.sha }}
|
||||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||||
@@ -55,13 +55,13 @@ jobs:
|
|||||||
ANCESTOR_REF=$(git merge-base upstream/${{ github.base_ref }} origin/$HEAD_REF)
|
ANCESTOR_REF=$(git merge-base upstream/${{ github.base_ref }} origin/$HEAD_REF)
|
||||||
git checkout --progress --force $ANCESTOR_REF
|
git checkout --progress --force $ANCESTOR_REF
|
||||||
- name: Setup .NET
|
- name: Setup .NET
|
||||||
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1
|
uses: actions/setup-dotnet@2016bd2012dba4e32de620c46fe006a3ac9f0602 # v5.0.1
|
||||||
with:
|
with:
|
||||||
dotnet-version: '9.0.x'
|
dotnet-version: '9.0.x'
|
||||||
- name: Generate openapi.json
|
- name: Generate openapi.json
|
||||||
run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests"
|
run: dotnet test tests/Jellyfin.Server.Integration.Tests/Jellyfin.Server.Integration.Tests.csproj -c Release --filter "Jellyfin.Server.Integration.Tests.OpenApiSpecTests"
|
||||||
- name: Upload openapi.json
|
- name: Upload openapi.json
|
||||||
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
|
uses: actions/upload-artifact@330a01c490aca151604b8cf639adc76d48f6c5d4 # v5.0.0
|
||||||
with:
|
with:
|
||||||
name: openapi-base
|
name: openapi-base
|
||||||
retention-days: 14
|
retention-days: 14
|
||||||
@@ -80,12 +80,12 @@ jobs:
|
|||||||
- openapi-base
|
- openapi-base
|
||||||
steps:
|
steps:
|
||||||
- name: Download openapi-head
|
- name: Download openapi-head
|
||||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: openapi-head
|
name: openapi-head
|
||||||
path: openapi-head
|
path: openapi-head
|
||||||
- name: Download openapi-base
|
- name: Download openapi-base
|
||||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: openapi-base
|
name: openapi-base
|
||||||
path: openapi-base
|
path: openapi-base
|
||||||
@@ -120,14 +120,14 @@ jobs:
|
|||||||
echo "" >> openapi-changes-reply.md
|
echo "" >> openapi-changes-reply.md
|
||||||
echo "</details>" >> openapi-changes-reply.md
|
echo "</details>" >> openapi-changes-reply.md
|
||||||
- name: Find difference comment
|
- name: Find difference comment
|
||||||
uses: peter-evans/find-comment@3eae4d37986fb5a8592848f6a574fdf654e61f9e # v3.1.0
|
uses: peter-evans/find-comment@b30e6a3c0ed37e7c023ccd3f1db5c6c0b0c23aad # v4.0.0
|
||||||
id: find-comment
|
id: find-comment
|
||||||
with:
|
with:
|
||||||
issue-number: ${{ github.event.pull_request.number }}
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
direction: last
|
direction: last
|
||||||
body-includes: openapi-diff-workflow-comment
|
body-includes: openapi-diff-workflow-comment
|
||||||
- name: Reply or edit difference comment (changed)
|
- name: Reply or edit difference comment (changed)
|
||||||
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
|
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
|
||||||
if: ${{ steps.read-diff.outputs.ApiChanged == '1' }}
|
if: ${{ steps.read-diff.outputs.ApiChanged == '1' }}
|
||||||
with:
|
with:
|
||||||
issue-number: ${{ github.event.pull_request.number }}
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
@@ -135,7 +135,7 @@ jobs:
|
|||||||
edit-mode: replace
|
edit-mode: replace
|
||||||
body-path: openapi-changes-reply.md
|
body-path: openapi-changes-reply.md
|
||||||
- name: Edit difference comment (unchanged)
|
- name: Edit difference comment (unchanged)
|
||||||
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
|
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
|
||||||
if: ${{ steps.read-diff.outputs.ApiChanged == '0' && steps.find-comment.outputs.comment-id != '' }}
|
if: ${{ steps.read-diff.outputs.ApiChanged == '0' && steps.find-comment.outputs.comment-id != '' }}
|
||||||
with:
|
with:
|
||||||
issue-number: ${{ github.event.pull_request.number }}
|
issue-number: ${{ github.event.pull_request.number }}
|
||||||
@@ -158,7 +158,7 @@ jobs:
|
|||||||
run: |-
|
run: |-
|
||||||
echo "JELLYFIN_VERSION=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
|
echo "JELLYFIN_VERSION=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_ENV
|
||||||
- name: Download openapi-head
|
- name: Download openapi-head
|
||||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: openapi-head
|
name: openapi-head
|
||||||
path: openapi-head
|
path: openapi-head
|
||||||
@@ -172,7 +172,7 @@ jobs:
|
|||||||
strip_components: 1
|
strip_components: 1
|
||||||
target: "/srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
|
target: "/srv/incoming/openapi/unstable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
|
||||||
- name: Move openapi.json (unstable) into place
|
- name: Move openapi.json (unstable) into place
|
||||||
uses: appleboy/ssh-action@2ead5e36573f08b82fbfce1504f1a4b05a647c6f # v1.2.2
|
uses: appleboy/ssh-action@823bd89e131d8d508129f9443cad5855e9ba96f0 # v1.2.4
|
||||||
with:
|
with:
|
||||||
host: "${{ secrets.REPO_HOST }}"
|
host: "${{ secrets.REPO_HOST }}"
|
||||||
username: "${{ secrets.REPO_USER }}"
|
username: "${{ secrets.REPO_USER }}"
|
||||||
@@ -220,7 +220,7 @@ jobs:
|
|||||||
run: |-
|
run: |-
|
||||||
echo "JELLYFIN_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
echo "JELLYFIN_VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_ENV
|
||||||
- name: Download openapi-head
|
- name: Download openapi-head
|
||||||
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
|
uses: actions/download-artifact@018cc2cf5baa6db3ef3c5f8a56943fffe632ef53 # v6.0.0
|
||||||
with:
|
with:
|
||||||
name: openapi-head
|
name: openapi-head
|
||||||
path: openapi-head
|
path: openapi-head
|
||||||
@@ -234,7 +234,7 @@ jobs:
|
|||||||
strip_components: 1
|
strip_components: 1
|
||||||
target: "/srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
|
target: "/srv/incoming/openapi/stable/jellyfin-openapi-${{ env.JELLYFIN_VERSION }}"
|
||||||
- name: Move openapi.json (stable) into place
|
- name: Move openapi.json (stable) into place
|
||||||
uses: appleboy/ssh-action@2ead5e36573f08b82fbfce1504f1a4b05a647c6f # v1.2.2
|
uses: appleboy/ssh-action@823bd89e131d8d508129f9443cad5855e9ba96f0 # v1.2.4
|
||||||
with:
|
with:
|
||||||
host: "${{ secrets.REPO_HOST }}"
|
host: "${{ secrets.REPO_HOST }}"
|
||||||
username: "${{ secrets.REPO_USER }}"
|
username: "${{ secrets.REPO_USER }}"
|
||||||
|
|||||||
6
.github/workflows/ci-tests.yml
vendored
6
.github/workflows/ci-tests.yml
vendored
@@ -20,9 +20,9 @@ jobs:
|
|||||||
|
|
||||||
runs-on: "${{ matrix.os }}"
|
runs-on: "${{ matrix.os }}"
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
- uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
|
|
||||||
- uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4.3.1
|
- uses: actions/setup-dotnet@2016bd2012dba4e32de620c46fe006a3ac9f0602 # v5.0.1
|
||||||
with:
|
with:
|
||||||
dotnet-version: ${{ env.SDK_VERSION }}
|
dotnet-version: ${{ env.SDK_VERSION }}
|
||||||
|
|
||||||
@@ -35,7 +35,7 @@ jobs:
|
|||||||
--verbosity minimal
|
--verbosity minimal
|
||||||
|
|
||||||
- name: Merge code coverage results
|
- name: Merge code coverage results
|
||||||
uses: danielpalme/ReportGenerator-GitHub-Action@c9576654e2fea2faa7b69e59550b3805bf6a9977 # v5.4.7
|
uses: danielpalme/ReportGenerator-GitHub-Action@ee0ae774f6d3afedcbd1683c1ab21b83670bdf8e # v5.5.1
|
||||||
with:
|
with:
|
||||||
reports: "**/coverage.cobertura.xml"
|
reports: "**/coverage.cobertura.xml"
|
||||||
targetdir: "merged/"
|
targetdir: "merged/"
|
||||||
|
|||||||
10
.github/workflows/commands.yml
vendored
10
.github/workflows/commands.yml
vendored
@@ -17,14 +17,14 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Notify as seen
|
- name: Notify as seen
|
||||||
uses: peter-evans/create-or-update-comment@71345be0265236311c031f5c7866368bd1eff043 # v4.0.0
|
uses: peter-evans/create-or-update-comment@e8674b075228eee787fea43ef493e45ece1004c9 # v5.0.0
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.JF_BOT_TOKEN }}
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
comment-id: ${{ github.event.comment.id }}
|
comment-id: ${{ github.event.comment.id }}
|
||||||
reactions: '+1'
|
reactions: '+1'
|
||||||
|
|
||||||
- name: Checkout the latest code
|
- name: Checkout the latest code
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.JF_BOT_TOKEN }}
|
token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
@@ -40,13 +40,13 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: pull in script
|
- name: pull in script
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
repository: jellyfin/jellyfin-triage-script
|
repository: jellyfin/jellyfin-triage-script
|
||||||
- name: install python
|
- name: install python
|
||||||
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
|
||||||
with:
|
with:
|
||||||
python-version: '3.13'
|
python-version: '3.14'
|
||||||
cache: 'pip'
|
cache: 'pip'
|
||||||
- name: install python packages
|
- name: install python packages
|
||||||
run: pip install -r rename/requirements.txt
|
run: pip install -r rename/requirements.txt
|
||||||
|
|||||||
2
.github/workflows/issue-stale.yml
vendored
2
.github/workflows/issue-stale.yml
vendored
@@ -16,7 +16,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: ${{ contains(github.repository, 'jellyfin/') }}
|
if: ${{ contains(github.repository, 'jellyfin/') }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
|
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.JF_BOT_TOKEN }}
|
repo-token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
ascending: true
|
ascending: true
|
||||||
|
|||||||
6
.github/workflows/issue-template-check.yml
vendored
6
.github/workflows/issue-template-check.yml
vendored
@@ -10,13 +10,13 @@ jobs:
|
|||||||
issues: write
|
issues: write
|
||||||
steps:
|
steps:
|
||||||
- name: pull in script
|
- name: pull in script
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
repository: jellyfin/jellyfin-triage-script
|
repository: jellyfin/jellyfin-triage-script
|
||||||
- name: install python
|
- name: install python
|
||||||
uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0
|
uses: actions/setup-python@83679a892e2d95755f2dac6acb0bfd1e9ac5d548 # v6.1.0
|
||||||
with:
|
with:
|
||||||
python-version: '3.13'
|
python-version: '3.14'
|
||||||
cache: 'pip'
|
cache: 'pip'
|
||||||
- name: install python packages
|
- name: install python packages
|
||||||
run: pip install -r main-repo-triage/requirements.txt
|
run: pip install -r main-repo-triage/requirements.txt
|
||||||
|
|||||||
2
.github/workflows/pull-request-stale.yaml
vendored
2
.github/workflows/pull-request-stale.yaml
vendored
@@ -15,7 +15,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
if: ${{ contains(github.repository, 'jellyfin/') }}
|
if: ${{ contains(github.repository, 'jellyfin/') }}
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/stale@5bef64f19d7facfb25b37b414482c7164d639639 # v9.1.0
|
- uses: actions/stale@997185467fa4f803885201cee163a9f38240193d # v10.1.1
|
||||||
with:
|
with:
|
||||||
repo-token: ${{ secrets.JF_BOT_TOKEN }}
|
repo-token: ${{ secrets.JF_BOT_TOKEN }}
|
||||||
ascending: true
|
ascending: true
|
||||||
|
|||||||
4
.github/workflows/release-bump-version.yaml
vendored
4
.github/workflows/release-bump-version.yaml
vendored
@@ -33,7 +33,7 @@ jobs:
|
|||||||
yq-version: v4.9.8
|
yq-version: v4.9.8
|
||||||
|
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
ref: ${{ env.TAG_BRANCH }}
|
ref: ${{ env.TAG_BRANCH }}
|
||||||
|
|
||||||
@@ -66,7 +66,7 @@ jobs:
|
|||||||
NEXT_VERSION: ${{ github.event.inputs.NEXT_VERSION }}
|
NEXT_VERSION: ${{ github.event.inputs.NEXT_VERSION }}
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout Repository
|
- name: Checkout Repository
|
||||||
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
|
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 # v6.0.1
|
||||||
with:
|
with:
|
||||||
ref: ${{ env.TAG_BRANCH }}
|
ref: ${{ env.TAG_BRANCH }}
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
- [DaveChild](https://github.com/DaveChild)
|
- [DaveChild](https://github.com/DaveChild)
|
||||||
- [DavidFair](https://github.com/DavidFair)
|
- [DavidFair](https://github.com/DavidFair)
|
||||||
- [Delgan](https://github.com/Delgan)
|
- [Delgan](https://github.com/Delgan)
|
||||||
|
- [Derpipose](https://github.com/Derpipose)
|
||||||
- [dcrdev](https://github.com/dcrdev)
|
- [dcrdev](https://github.com/dcrdev)
|
||||||
- [dhartung](https://github.com/dhartung)
|
- [dhartung](https://github.com/dhartung)
|
||||||
- [dinki](https://github.com/dinki)
|
- [dinki](https://github.com/dinki)
|
||||||
@@ -61,6 +62,7 @@
|
|||||||
- [ikomhoog](https://github.com/ikomhoog)
|
- [ikomhoog](https://github.com/ikomhoog)
|
||||||
- [iwalton3](https://github.com/iwalton3)
|
- [iwalton3](https://github.com/iwalton3)
|
||||||
- [jftuga](https://github.com/jftuga)
|
- [jftuga](https://github.com/jftuga)
|
||||||
|
- [jkhsjdhjs](https://github.com/jkhsjdhjs)
|
||||||
- [jmshrv](https://github.com/jmshrv)
|
- [jmshrv](https://github.com/jmshrv)
|
||||||
- [joern-h](https://github.com/joern-h)
|
- [joern-h](https://github.com/joern-h)
|
||||||
- [joshuaboniface](https://github.com/joshuaboniface)
|
- [joshuaboniface](https://github.com/joshuaboniface)
|
||||||
@@ -115,6 +117,7 @@
|
|||||||
- [sachk](https://github.com/sachk)
|
- [sachk](https://github.com/sachk)
|
||||||
- [sammyrc34](https://github.com/sammyrc34)
|
- [sammyrc34](https://github.com/sammyrc34)
|
||||||
- [samuel9554](https://github.com/samuel9554)
|
- [samuel9554](https://github.com/samuel9554)
|
||||||
|
- [SapientGuardian](https://github.com/SapientGuardian)
|
||||||
- [scheidleon](https://github.com/scheidleon)
|
- [scheidleon](https://github.com/scheidleon)
|
||||||
- [sebPomme](https://github.com/sebPomme)
|
- [sebPomme](https://github.com/sebPomme)
|
||||||
- [SegiH](https://github.com/SegiH)
|
- [SegiH](https://github.com/SegiH)
|
||||||
@@ -139,6 +142,7 @@
|
|||||||
- [ThibaultNocchi](https://github.com/ThibaultNocchi)
|
- [ThibaultNocchi](https://github.com/ThibaultNocchi)
|
||||||
- [thornbill](https://github.com/thornbill)
|
- [thornbill](https://github.com/thornbill)
|
||||||
- [ThreeFive-O](https://github.com/ThreeFive-O)
|
- [ThreeFive-O](https://github.com/ThreeFive-O)
|
||||||
|
- [tjwalkr3](https://github.com/tjwalkr3)
|
||||||
- [TrisMcC](https://github.com/TrisMcC)
|
- [TrisMcC](https://github.com/TrisMcC)
|
||||||
- [trumblejoe](https://github.com/trumblejoe)
|
- [trumblejoe](https://github.com/trumblejoe)
|
||||||
- [TtheCreator](https://github.com/TtheCreator)
|
- [TtheCreator](https://github.com/TtheCreator)
|
||||||
@@ -198,6 +202,11 @@
|
|||||||
- [revam](https://github.com/revam)
|
- [revam](https://github.com/revam)
|
||||||
- [allesmi](https://github.com/allesmi)
|
- [allesmi](https://github.com/allesmi)
|
||||||
- [ThunderClapLP](https://github.com/ThunderClapLP)
|
- [ThunderClapLP](https://github.com/ThunderClapLP)
|
||||||
|
- [Shoham Peller](https://github.com/spellr)
|
||||||
|
- [theshoeshiner](https://github.com/theshoeshiner)
|
||||||
|
- [TokerX](https://github.com/TokerX)
|
||||||
|
- [GeneMarks](https://github.com/GeneMarks)
|
||||||
|
- [martenumberto](https://github.com/martenumberto)
|
||||||
|
|
||||||
# Emby Contributors
|
# Emby Contributors
|
||||||
|
|
||||||
|
|||||||
@@ -19,4 +19,9 @@
|
|||||||
<AdditionalFiles Include="$(MSBuildThisFileDirectory)/stylecop.json" />
|
<AdditionalFiles Include="$(MSBuildThisFileDirectory)/stylecop.json" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<!-- Custom Analyzers -->
|
||||||
|
<ItemGroup Condition=" '$(MSBuildProjectName)' != 'Jellyfin.CodeAnalysis' AND '$(Configuration)' == 'Debug' ">
|
||||||
|
<ProjectReference Include="$(MSBuildThisFileDirectory)src/Jellyfin.CodeAnalysis/Jellyfin.CodeAnalysis.csproj" OutputItemType="Analyzer" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -4,67 +4,71 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<!-- Run "dotnet list package (dash,dash)outdated" to see the latest versions of each package.-->
|
<!-- Run "dotnet list package (dash,dash)outdated" to see the latest versions of each package.-->
|
||||||
<ItemGroup Label="Package Dependencies">
|
<ItemGroup Label="Package Dependencies">
|
||||||
<PackageVersion Include="AsyncKeyedLock" Version="7.1.6" />
|
<PackageVersion Include="AsyncKeyedLock" Version="7.1.8" />
|
||||||
<PackageVersion Include="AutoFixture.AutoMoq" Version="4.18.1" />
|
<PackageVersion Include="AutoFixture.AutoMoq" Version="4.18.1" />
|
||||||
<PackageVersion Include="AutoFixture.Xunit2" Version="4.18.1" />
|
<PackageVersion Include="AutoFixture.Xunit2" Version="4.18.1" />
|
||||||
<PackageVersion Include="AutoFixture" Version="4.18.1" />
|
<PackageVersion Include="AutoFixture" Version="4.18.1" />
|
||||||
<PackageVersion Include="BDInfo" Version="0.8.0" />
|
<PackageVersion Include="BDInfo" Version="0.8.0" />
|
||||||
<PackageVersion Include="BitFaster.Caching" Version="2.5.3" />
|
<PackageVersion Include="BitFaster.Caching" Version="2.5.4" />
|
||||||
<PackageVersion Include="BlurHashSharp.SkiaSharp" Version="1.4.0-pre.1" />
|
<PackageVersion Include="BlurHashSharp.SkiaSharp" Version="1.4.0-pre.1" />
|
||||||
<PackageVersion Include="BlurHashSharp" Version="1.4.0-pre.1" />
|
<PackageVersion Include="BlurHashSharp" Version="1.4.0-pre.1" />
|
||||||
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
|
<PackageVersion Include="CommandLineParser" Version="2.9.1" />
|
||||||
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
|
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
|
||||||
<PackageVersion Include="Diacritics" Version="3.3.29" />
|
<PackageVersion Include="Diacritics" Version="4.0.17" />
|
||||||
<PackageVersion Include="DiscUtils.Udf" Version="0.16.13" />
|
<PackageVersion Include="DiscUtils.Udf" Version="0.16.13" />
|
||||||
<PackageVersion Include="DotNet.Glob" Version="3.1.3" />
|
<PackageVersion Include="DotNet.Glob" Version="3.1.3" />
|
||||||
<PackageVersion Include="FsCheck.Xunit" Version="3.3.0" />
|
<PackageVersion Include="FsCheck.Xunit" Version="3.3.2" />
|
||||||
<PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="8.3.1.1" />
|
<PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="8.3.1.1" />
|
||||||
<PackageVersion Include="ICU4N.Transliterator" Version="60.1.0-alpha.356" />
|
<PackageVersion Include="ICU4N.Transliterator" Version="60.1.0-alpha.356" />
|
||||||
<PackageVersion Include="IDisposableAnalyzers" Version="4.0.8" />
|
<PackageVersion Include="IDisposableAnalyzers" Version="4.0.8" />
|
||||||
<PackageVersion Include="Ignore" Version="0.2.1" />
|
<PackageVersion Include="Ignore" Version="0.2.1" />
|
||||||
<PackageVersion Include="Jellyfin.XmlTv" Version="10.8.0" />
|
<PackageVersion Include="Jellyfin.XmlTv" Version="10.8.0" />
|
||||||
<PackageVersion Include="libse" Version="4.0.12" />
|
<PackageVersion Include="libse" Version="4.0.12" />
|
||||||
<PackageVersion Include="LrcParser" Version="2025.228.1" />
|
<PackageVersion Include="LrcParser" Version="2025.623.0" />
|
||||||
<PackageVersion Include="MetaBrainz.MusicBrainz" Version="6.1.0" />
|
<PackageVersion Include="MetaBrainz.MusicBrainz" Version="6.1.0" />
|
||||||
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="4.14.0" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.BannedApiAnalyzers" Version="4.14.0" />
|
||||||
<PackageVersion Include="Microsoft.Data.Sqlite" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.Common" Version="4.14.0" />
|
||||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.14.0" />
|
||||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="3.11.0" />
|
||||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Data.Sqlite" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.Caching.Abstractions" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.Configuration.Json" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Http" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks.EntityFrameworkCore" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.6" />
|
<PackageVersion Include="Microsoft.Extensions.Http" Version="9.0.11" />
|
||||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.14.1" />
|
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.11" />
|
||||||
|
<PackageVersion Include="Microsoft.Extensions.Logging" Version="9.0.11" />
|
||||||
|
<PackageVersion Include="Microsoft.Extensions.Options" Version="9.0.11" />
|
||||||
|
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
|
||||||
<PackageVersion Include="MimeTypes" Version="2.5.2" />
|
<PackageVersion Include="MimeTypes" Version="2.5.2" />
|
||||||
<PackageVersion Include="Morestachio" Version="5.0.1.631" />
|
<PackageVersion Include="Morestachio" Version="5.0.1.631" />
|
||||||
<PackageVersion Include="Moq" Version="4.18.4" />
|
<PackageVersion Include="Moq" Version="4.18.4" />
|
||||||
<PackageVersion Include="NEbml" Version="0.12.0" />
|
<PackageVersion Include="NEbml" Version="1.1.0.5" />
|
||||||
<PackageVersion Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
|
||||||
<PackageVersion Include="PlaylistsNET" Version="1.4.1" />
|
<PackageVersion Include="PlaylistsNET" Version="1.4.1" />
|
||||||
<PackageVersion Include="prometheus-net.AspNetCore" Version="8.2.1" />
|
<PackageVersion Include="prometheus-net.AspNetCore" Version="8.2.1" />
|
||||||
<PackageVersion Include="prometheus-net.DotNetRuntime" Version="4.4.1" />
|
<PackageVersion Include="prometheus-net.DotNetRuntime" Version="4.4.1" />
|
||||||
<PackageVersion Include="prometheus-net" Version="8.2.1" />
|
<PackageVersion Include="prometheus-net" Version="8.2.1" />
|
||||||
<PackageVersion Include="Polly" Version="8.6.0" />
|
<PackageVersion Include="Polly" Version="8.6.5" />
|
||||||
<PackageVersion Include="Serilog.AspNetCore" Version="9.0.0" />
|
<PackageVersion Include="Serilog.AspNetCore" Version="9.0.0" />
|
||||||
<PackageVersion Include="Serilog.Enrichers.Thread" Version="4.0.0" />
|
<PackageVersion Include="Serilog.Enrichers.Thread" Version="4.0.0" />
|
||||||
|
<PackageVersion Include="Serilog.Expressions" Version="5.0.0" />
|
||||||
<PackageVersion Include="Serilog.Settings.Configuration" Version="9.0.0" />
|
<PackageVersion Include="Serilog.Settings.Configuration" Version="9.0.0" />
|
||||||
<PackageVersion Include="Serilog.Sinks.Async" Version="2.1.0" />
|
<PackageVersion Include="Serilog.Sinks.Async" Version="2.1.0" />
|
||||||
<PackageVersion Include="Serilog.Sinks.Console" Version="6.0.0" />
|
<PackageVersion Include="Serilog.Sinks.Console" Version="6.1.1" />
|
||||||
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
|
<PackageVersion Include="Serilog.Sinks.File" Version="7.0.0" />
|
||||||
<PackageVersion Include="Serilog.Sinks.Graylog" Version="3.1.1" />
|
<PackageVersion Include="Serilog.Sinks.Graylog" Version="3.1.1" />
|
||||||
<PackageVersion Include="SerilogAnalyzer" Version="0.15.0" />
|
<PackageVersion Include="SerilogAnalyzer" Version="0.15.0" />
|
||||||
@@ -75,18 +79,18 @@
|
|||||||
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="3.116.1" />
|
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="3.116.1" />
|
||||||
<PackageVersion Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" />
|
<PackageVersion Include="SmartAnalyzers.MultithreadingAnalyzer" Version="1.1.31" />
|
||||||
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
|
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.556" />
|
||||||
<PackageVersion Include="Svg.Skia" Version="3.0.3" />
|
<PackageVersion Include="Svg.Skia" Version="3.2.1" />
|
||||||
<PackageVersion Include="Swashbuckle.AspNetCore.ReDoc" Version="6.5.0" />
|
<PackageVersion Include="Swashbuckle.AspNetCore.ReDoc" Version="6.5.0" />
|
||||||
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.2.3" />
|
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.2.3" />
|
||||||
<PackageVersion Include="System.Globalization" Version="4.3.0" />
|
<PackageVersion Include="System.Globalization" Version="4.3.0" />
|
||||||
<PackageVersion Include="System.Linq.Async" Version="6.0.1" />
|
<PackageVersion Include="System.Linq.Async" Version="6.0.3" />
|
||||||
<PackageVersion Include="System.Text.Encoding.CodePages" Version="9.0.6" />
|
<PackageVersion Include="System.Text.Encoding.CodePages" Version="9.0.11" />
|
||||||
<PackageVersion Include="System.Text.Json" Version="9.0.6" />
|
<PackageVersion Include="System.Text.Json" Version="9.0.11" />
|
||||||
<PackageVersion Include="System.Threading.Tasks.Dataflow" Version="9.0.6" />
|
<PackageVersion Include="System.Threading.Tasks.Dataflow" Version="9.0.11" />
|
||||||
<PackageVersion Include="TagLibSharp" Version="2.3.0" />
|
<PackageVersion Include="TagLibSharp" Version="2.3.0" />
|
||||||
<PackageVersion Include="z440.atl.core" Version="6.26.0" />
|
<PackageVersion Include="z440.atl.core" Version="7.9.0" />
|
||||||
<PackageVersion Include="TMDbLib" Version="2.2.0" />
|
<PackageVersion Include="TMDbLib" Version="2.3.0" />
|
||||||
<PackageVersion Include="UTF.Unknown" Version="2.5.1" />
|
<PackageVersion Include="UTF.Unknown" Version="2.6.0" />
|
||||||
<PackageVersion Include="Xunit.Priority" Version="1.1.6" />
|
<PackageVersion Include="Xunit.Priority" Version="1.1.6" />
|
||||||
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
|
<PackageVersion Include="xunit.runner.visualstudio" Version="2.8.2" />
|
||||||
<PackageVersion Include="Xunit.SkippableFact" Version="1.5.23" />
|
<PackageVersion Include="Xunit.SkippableFact" Version="1.5.23" />
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ namespace Emby.Naming.Common
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public NamingOptions()
|
public NamingOptions()
|
||||||
{
|
{
|
||||||
VideoFileExtensions = new[]
|
VideoFileExtensions =
|
||||||
{
|
[
|
||||||
".001",
|
".001",
|
||||||
".3g2",
|
".3g2",
|
||||||
".3gp",
|
".3gp",
|
||||||
@@ -77,10 +77,10 @@ namespace Emby.Naming.Common
|
|||||||
".wmv",
|
".wmv",
|
||||||
".wtv",
|
".wtv",
|
||||||
".xvid"
|
".xvid"
|
||||||
};
|
];
|
||||||
|
|
||||||
VideoFlagDelimiters = new[]
|
VideoFlagDelimiters =
|
||||||
{
|
[
|
||||||
'(',
|
'(',
|
||||||
')',
|
')',
|
||||||
'-',
|
'-',
|
||||||
@@ -88,15 +88,15 @@ namespace Emby.Naming.Common
|
|||||||
'_',
|
'_',
|
||||||
'[',
|
'[',
|
||||||
']'
|
']'
|
||||||
};
|
];
|
||||||
|
|
||||||
StubFileExtensions = new[]
|
StubFileExtensions =
|
||||||
{
|
[
|
||||||
".disc"
|
".disc"
|
||||||
};
|
];
|
||||||
|
|
||||||
StubTypes = new[]
|
StubTypes =
|
||||||
{
|
[
|
||||||
new StubTypeRule(
|
new StubTypeRule(
|
||||||
stubType: "dvd",
|
stubType: "dvd",
|
||||||
token: "dvd"),
|
token: "dvd"),
|
||||||
@@ -136,32 +136,32 @@ namespace Emby.Naming.Common
|
|||||||
new StubTypeRule(
|
new StubTypeRule(
|
||||||
stubType: "tv",
|
stubType: "tv",
|
||||||
token: "DSR")
|
token: "DSR")
|
||||||
};
|
];
|
||||||
|
|
||||||
VideoFileStackingRules = new[]
|
VideoFileStackingRules =
|
||||||
{
|
[
|
||||||
new FileStackRule(@"^(?<filename>.*?)(?:(?<=[\]\)\}])|[ _.-]+)[\(\[]?(?<parttype>cd|dvd|part|pt|dis[ck])[ _.-]*(?<number>[0-9]+)[\)\]]?(?:\.[^.]+)?$", true),
|
new FileStackRule(@"^(?<filename>.*?)(?:(?<=[\]\)\}])|[ _.-]+)[\(\[]?(?<parttype>cd|dvd|part|pt|dis[ck])[ _.-]*(?<number>[0-9]+)[\)\]]?(?:\.[^.]+)?$", true),
|
||||||
new FileStackRule(@"^(?<filename>.*?)(?:(?<=[\]\)\}])|[ _.-]+)[\(\[]?(?<parttype>cd|dvd|part|pt|dis[ck])[ _.-]*(?<number>[a-d])[\)\]]?(?:\.[^.]+)?$", false)
|
new FileStackRule(@"^(?<filename>.*?)(?:(?<=[\]\)\}])|[ _.-]+)[\(\[]?(?<parttype>cd|dvd|part|pt|dis[ck])[ _.-]*(?<number>[a-d])[\)\]]?(?:\.[^.]+)?$", false)
|
||||||
};
|
];
|
||||||
|
|
||||||
CleanDateTimes = new[]
|
CleanDateTimes =
|
||||||
{
|
[
|
||||||
@"(.+[^_\,\.\(\)\[\]\-])[_\.\(\)\[\]\-](19[0-9]{2}|20[0-9]{2})(?![0-9]+|\W[0-9]{2}\W[0-9]{2})([ _\,\.\(\)\[\]\-][^0-9]|).*(19[0-9]{2}|20[0-9]{2})*",
|
@"(.+[^_\,\.\(\)\[\]\-])[_\.\(\)\[\]\-](19[0-9]{2}|20[0-9]{2})(?![0-9]+|\W[0-9]{2}\W[0-9]{2})([ _\,\.\(\)\[\]\-][^0-9]|).*(19[0-9]{2}|20[0-9]{2})*",
|
||||||
@"(.+[^_\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9]{2}|20[0-9]{2})(?![0-9]+|\W[0-9]{2}\W[0-9]{2})([ _\,\.\(\)\[\]\-][^0-9]|).*(19[0-9]{2}|20[0-9]{2})*"
|
@"(.+[^_\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9]{2}|20[0-9]{2})(?![0-9]+|\W[0-9]{2}\W[0-9]{2})([ _\,\.\(\)\[\]\-][^0-9]|).*(19[0-9]{2}|20[0-9]{2})*"
|
||||||
};
|
];
|
||||||
|
|
||||||
CleanStrings = new[]
|
CleanStrings =
|
||||||
{
|
[
|
||||||
@"^\s*(?<cleaned>.+?)[ _\,\.\(\)\[\]\-](3d|sbs|tab|hsbs|htab|mvc|HDR|HDC|UHD|UltraHD|4k|ac3|dts|custom|dc|divx|divx5|dsr|dsrip|dutch|dvd|dvdrip|dvdscr|dvdscreener|screener|dvdivx|cam|fragment|fs|hdtv|hdrip|hdtvrip|internal|limited|multi|subs|ntsc|ogg|ogm|pal|pdtv|proper|repack|rerip|retail|cd[1-9]|r5|bd5|bd|se|svcd|swedish|german|read.nfo|nfofix|unrated|ws|telesync|ts|telecine|tc|brrip|bdrip|480p|480i|576p|576i|720p|720i|1080p|1080i|2160p|hrhd|hrhdtv|hddvd|bluray|blu-ray|x264|x265|h264|h265|xvid|xvidvd|xxx|www.www|AAC|DTS|\[.*\])([ _\,\.\(\)\[\]\-]|$)",
|
@"^\s*(?<cleaned>.+?)[ _\,\.\(\)\[\]\-](3d|sbs|tab|hsbs|htab|mvc|HDR|HDC|UHD|UltraHD|4k|ac3|dts|custom|dc|divx|divx5|dsr|dsrip|dutch|dvd|dvdrip|dvdscr|dvdscreener|screener|dvdivx|cam|fragment|fs|hdtv|hdrip|hdtvrip|internal|limited|multi|subs|ntsc|ogg|ogm|pal|pdtv|proper|repack|rerip|retail|cd[1-9]|r5|bd5|bd|se|svcd|swedish|german|read.nfo|nfofix|unrated|ws|telesync|ts|telecine|tc|brrip|bdrip|480p|480i|576p|576i|720p|720i|1080p|1080i|2160p|hrhd|hrhdtv|hddvd|bluray|blu-ray|x264|x265|h264|h265|xvid|xvidvd|xxx|www.www|AAC|DTS|\[.*\])([ _\,\.\(\)\[\]\-]|$)",
|
||||||
@"^(?<cleaned>.+?)(\[.*\])",
|
@"^(?<cleaned>.+?)(\[.*\])",
|
||||||
@"^\s*(?<cleaned>.+?)\WE[0-9]+(-|~)E?[0-9]+(\W|$)",
|
@"^\s*(?<cleaned>.+?)\WE[0-9]+(-|~)E?[0-9]+(\W|$)",
|
||||||
@"^\s*\[[^\]]+\](?!\.\w+$)\s*(?<cleaned>.+)",
|
@"^\s*\[[^\]]+\](?!\.\w+$)\s*(?<cleaned>.+)",
|
||||||
@"^\s*(?<cleaned>.+?)\s+-\s+[0-9]+\s*$",
|
@"^\s*(?<cleaned>.+?)\s+-\s+[0-9]+\s*$",
|
||||||
@"^\s*(?<cleaned>.+?)(([-._ ](trailer|sample))|-(scene|clip|behindthescenes|deleted|deletedscene|featurette|short|interview|other|extra))$"
|
@"^\s*(?<cleaned>.+?)(([-._ ](trailer|sample))|-(scene|clip|behindthescenes|deleted|deletedscene|featurette|short|interview|other|extra))$"
|
||||||
};
|
];
|
||||||
|
|
||||||
SubtitleFileExtensions = new[]
|
SubtitleFileExtensions =
|
||||||
{
|
[
|
||||||
".ass",
|
".ass",
|
||||||
".mks",
|
".mks",
|
||||||
".sami",
|
".sami",
|
||||||
@@ -171,28 +171,29 @@ namespace Emby.Naming.Common
|
|||||||
".sub",
|
".sub",
|
||||||
".sup",
|
".sup",
|
||||||
".vtt",
|
".vtt",
|
||||||
};
|
];
|
||||||
|
|
||||||
LyricFileExtensions = new[]
|
LyricFileExtensions =
|
||||||
{
|
[
|
||||||
".lrc",
|
".lrc",
|
||||||
".elrc",
|
".elrc",
|
||||||
".txt"
|
".txt"
|
||||||
};
|
];
|
||||||
|
|
||||||
AlbumStackingPrefixes = new[]
|
AlbumStackingPrefixes =
|
||||||
{
|
[
|
||||||
"cd",
|
"cd",
|
||||||
"digital media",
|
"digital media",
|
||||||
"disc",
|
"disc",
|
||||||
"disk",
|
"disk",
|
||||||
"vol",
|
"vol",
|
||||||
"volume",
|
"volume",
|
||||||
"part"
|
"part",
|
||||||
};
|
"act"
|
||||||
|
];
|
||||||
|
|
||||||
ArtistSubfolders = new[]
|
ArtistSubfolders =
|
||||||
{
|
[
|
||||||
"albums",
|
"albums",
|
||||||
"broadcasts",
|
"broadcasts",
|
||||||
"bootlegs",
|
"bootlegs",
|
||||||
@@ -207,10 +208,10 @@ namespace Emby.Naming.Common
|
|||||||
"soundtracks",
|
"soundtracks",
|
||||||
"spokenwords",
|
"spokenwords",
|
||||||
"streets"
|
"streets"
|
||||||
};
|
];
|
||||||
|
|
||||||
AudioFileExtensions = new[]
|
AudioFileExtensions =
|
||||||
{
|
[
|
||||||
".669",
|
".669",
|
||||||
".3gp",
|
".3gp",
|
||||||
".aa",
|
".aa",
|
||||||
@@ -240,6 +241,7 @@ namespace Emby.Naming.Common
|
|||||||
".dts",
|
".dts",
|
||||||
".dvf",
|
".dvf",
|
||||||
".eac3",
|
".eac3",
|
||||||
|
".ec3",
|
||||||
".far",
|
".far",
|
||||||
".flac",
|
".flac",
|
||||||
".gdm",
|
".gdm",
|
||||||
@@ -290,33 +292,33 @@ namespace Emby.Naming.Common
|
|||||||
".xm",
|
".xm",
|
||||||
".xsp",
|
".xsp",
|
||||||
".ymf"
|
".ymf"
|
||||||
};
|
];
|
||||||
|
|
||||||
MediaFlagDelimiters = new[]
|
MediaFlagDelimiters =
|
||||||
{
|
[
|
||||||
'.'
|
'.'
|
||||||
};
|
];
|
||||||
|
|
||||||
MediaForcedFlags = new[]
|
MediaForcedFlags =
|
||||||
{
|
[
|
||||||
"foreign",
|
"foreign",
|
||||||
"forced"
|
"forced"
|
||||||
};
|
];
|
||||||
|
|
||||||
MediaDefaultFlags = new[]
|
MediaDefaultFlags =
|
||||||
{
|
[
|
||||||
"default"
|
"default"
|
||||||
};
|
];
|
||||||
|
|
||||||
MediaHearingImpairedFlags = new[]
|
MediaHearingImpairedFlags =
|
||||||
{
|
[
|
||||||
"cc",
|
"cc",
|
||||||
"hi",
|
"hi",
|
||||||
"sdh"
|
"sdh"
|
||||||
};
|
];
|
||||||
|
|
||||||
EpisodeExpressions = new[]
|
EpisodeExpressions =
|
||||||
{
|
[
|
||||||
// *** Begin Kodi Standard Naming
|
// *** Begin Kodi Standard Naming
|
||||||
// <!-- foo.s01.e01, foo.s01_e01, S01E02 foo, S01 - E02 -->
|
// <!-- foo.s01.e01, foo.s01_e01, S01E02 foo, S01 - E02 -->
|
||||||
new EpisodeExpression(@".*(\\|\/)(?<seriesname>((?[][ ._-]*[Ee]([0-9]+))[^\\\/])*)?[Ss](?<seasonnumber>[0-9]+)[][ ._-]*[Ee](?<epnumber>[0-9]+)([^\\/]*)$")
|
new EpisodeExpression(@".*(\\|\/)(?<seriesname>((?[][ ._-]*[Ee]([0-9]+))[^\\\/])*)?[Ss](?<seasonnumber>[0-9]+)[][ ._-]*[Ee](?<epnumber>[0-9]+)([^\\/]*)$")
|
||||||
@@ -329,23 +331,23 @@ namespace Emby.Naming.Common
|
|||||||
new EpisodeExpression(@"[^\\/]*?()\.?[Ee]([0-9]+)\.([^\\/]*)$"),
|
new EpisodeExpression(@"[^\\/]*?()\.?[Ee]([0-9]+)\.([^\\/]*)$"),
|
||||||
new EpisodeExpression("(?<year>[0-9]{4})[._ -](?<month>[0-9]{2})[._ -](?<day>[0-9]{2})", true)
|
new EpisodeExpression("(?<year>[0-9]{4})[._ -](?<month>[0-9]{2})[._ -](?<day>[0-9]{2})", true)
|
||||||
{
|
{
|
||||||
DateTimeFormats = new[]
|
DateTimeFormats =
|
||||||
{
|
[
|
||||||
"yyyy.MM.dd",
|
"yyyy.MM.dd",
|
||||||
"yyyy-MM-dd",
|
"yyyy-MM-dd",
|
||||||
"yyyy_MM_dd",
|
"yyyy_MM_dd",
|
||||||
"yyyy MM dd"
|
"yyyy MM dd"
|
||||||
}
|
]
|
||||||
},
|
},
|
||||||
new EpisodeExpression("(?<day>[0-9]{2})[._ -](?<month>[0-9]{2})[._ -](?<year>[0-9]{4})", true)
|
new EpisodeExpression("(?<day>[0-9]{2})[._ -](?<month>[0-9]{2})[._ -](?<year>[0-9]{4})", true)
|
||||||
{
|
{
|
||||||
DateTimeFormats = new[]
|
DateTimeFormats =
|
||||||
{
|
[
|
||||||
"dd.MM.yyyy",
|
"dd.MM.yyyy",
|
||||||
"dd-MM-yyyy",
|
"dd-MM-yyyy",
|
||||||
"dd_MM_yyyy",
|
"dd_MM_yyyy",
|
||||||
"dd MM yyyy"
|
"dd MM yyyy"
|
||||||
}
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
// This isn't a Kodi naming rule, but the expression below causes false episode numbers for
|
// This isn't a Kodi naming rule, but the expression below causes false episode numbers for
|
||||||
@@ -477,10 +479,10 @@ namespace Emby.Naming.Common
|
|||||||
{
|
{
|
||||||
IsNamed = true
|
IsNamed = true
|
||||||
},
|
},
|
||||||
};
|
];
|
||||||
|
|
||||||
VideoExtraRules = new[]
|
VideoExtraRules =
|
||||||
{
|
[
|
||||||
new ExtraRule(
|
new ExtraRule(
|
||||||
ExtraType.Trailer,
|
ExtraType.Trailer,
|
||||||
ExtraRuleType.DirectoryName,
|
ExtraRuleType.DirectoryName,
|
||||||
@@ -571,6 +573,18 @@ namespace Emby.Naming.Common
|
|||||||
"trailer",
|
"trailer",
|
||||||
MediaType.Video),
|
MediaType.Video),
|
||||||
|
|
||||||
|
new ExtraRule(
|
||||||
|
ExtraType.Sample,
|
||||||
|
ExtraRuleType.Filename,
|
||||||
|
"sample",
|
||||||
|
MediaType.Video),
|
||||||
|
|
||||||
|
new ExtraRule(
|
||||||
|
ExtraType.ThemeSong,
|
||||||
|
ExtraRuleType.Filename,
|
||||||
|
"theme",
|
||||||
|
MediaType.Audio),
|
||||||
|
|
||||||
new ExtraRule(
|
new ExtraRule(
|
||||||
ExtraType.Trailer,
|
ExtraType.Trailer,
|
||||||
ExtraRuleType.Suffix,
|
ExtraRuleType.Suffix,
|
||||||
@@ -592,13 +606,7 @@ namespace Emby.Naming.Common
|
|||||||
new ExtraRule(
|
new ExtraRule(
|
||||||
ExtraType.Trailer,
|
ExtraType.Trailer,
|
||||||
ExtraRuleType.Suffix,
|
ExtraRuleType.Suffix,
|
||||||
" trailer",
|
"- trailer",
|
||||||
MediaType.Video),
|
|
||||||
|
|
||||||
new ExtraRule(
|
|
||||||
ExtraType.Sample,
|
|
||||||
ExtraRuleType.Filename,
|
|
||||||
"sample",
|
|
||||||
MediaType.Video),
|
MediaType.Video),
|
||||||
|
|
||||||
new ExtraRule(
|
new ExtraRule(
|
||||||
@@ -622,15 +630,9 @@ namespace Emby.Naming.Common
|
|||||||
new ExtraRule(
|
new ExtraRule(
|
||||||
ExtraType.Sample,
|
ExtraType.Sample,
|
||||||
ExtraRuleType.Suffix,
|
ExtraRuleType.Suffix,
|
||||||
" sample",
|
"- sample",
|
||||||
MediaType.Video),
|
MediaType.Video),
|
||||||
|
|
||||||
new ExtraRule(
|
|
||||||
ExtraType.ThemeSong,
|
|
||||||
ExtraRuleType.Filename,
|
|
||||||
"theme",
|
|
||||||
MediaType.Audio),
|
|
||||||
|
|
||||||
new ExtraRule(
|
new ExtraRule(
|
||||||
ExtraType.Scene,
|
ExtraType.Scene,
|
||||||
ExtraRuleType.Suffix,
|
ExtraRuleType.Suffix,
|
||||||
@@ -690,14 +692,14 @@ namespace Emby.Naming.Common
|
|||||||
ExtraRuleType.Suffix,
|
ExtraRuleType.Suffix,
|
||||||
"-other",
|
"-other",
|
||||||
MediaType.Video)
|
MediaType.Video)
|
||||||
};
|
];
|
||||||
|
|
||||||
AllExtrasTypesFolderNames = VideoExtraRules
|
AllExtrasTypesFolderNames = VideoExtraRules
|
||||||
.Where(i => i.RuleType == ExtraRuleType.DirectoryName)
|
.Where(i => i.RuleType == ExtraRuleType.DirectoryName)
|
||||||
.ToDictionary(i => i.Token, i => i.ExtraType, StringComparer.OrdinalIgnoreCase);
|
.ToDictionary(i => i.Token, i => i.ExtraType, StringComparer.OrdinalIgnoreCase);
|
||||||
|
|
||||||
Format3DRules = new[]
|
Format3DRules =
|
||||||
{
|
[
|
||||||
// Kodi rules:
|
// Kodi rules:
|
||||||
new Format3DRule(
|
new Format3DRule(
|
||||||
precedingToken: "3d",
|
precedingToken: "3d",
|
||||||
@@ -724,10 +726,10 @@ namespace Emby.Naming.Common
|
|||||||
new Format3DRule("tab"),
|
new Format3DRule("tab"),
|
||||||
new Format3DRule("sbs3d"),
|
new Format3DRule("sbs3d"),
|
||||||
new Format3DRule("mvc")
|
new Format3DRule("mvc")
|
||||||
};
|
];
|
||||||
|
|
||||||
AudioBookPartsExpressions = new[]
|
AudioBookPartsExpressions =
|
||||||
{
|
[
|
||||||
// Detect specified chapters, like CH 01
|
// Detect specified chapters, like CH 01
|
||||||
@"ch(?:apter)?[\s_-]?(?<chapter>[0-9]+)",
|
@"ch(?:apter)?[\s_-]?(?<chapter>[0-9]+)",
|
||||||
// Detect specified parts, like Part 02
|
// Detect specified parts, like Part 02
|
||||||
@@ -740,14 +742,14 @@ namespace Emby.Naming.Common
|
|||||||
"(?<chapter>[0-9]+)_(?<part>[0-9]+)",
|
"(?<chapter>[0-9]+)_(?<part>[0-9]+)",
|
||||||
// Some audiobooks are ripped from cd's, and will be named by disk number.
|
// Some audiobooks are ripped from cd's, and will be named by disk number.
|
||||||
@"dis(?:c|k)[\s_-]?(?<chapter>[0-9]+)"
|
@"dis(?:c|k)[\s_-]?(?<chapter>[0-9]+)"
|
||||||
};
|
];
|
||||||
|
|
||||||
AudioBookNamesExpressions = new[]
|
AudioBookNamesExpressions =
|
||||||
{
|
[
|
||||||
// Detect year usually in brackets after name Batman (2020)
|
// Detect year usually in brackets after name Batman (2020)
|
||||||
@"^(?<name>.+?)\s*\(\s*(?<year>[0-9]{4})\s*\)\s*$",
|
@"^(?<name>.+?)\s*\(\s*(?<year>[0-9]{4})\s*\)\s*$",
|
||||||
@"^\s*(?<name>[^ ].*?)\s*$"
|
@"^\s*(?<name>[^ ].*?)\s*$"
|
||||||
};
|
];
|
||||||
|
|
||||||
MultipleEpisodeExpressions = new[]
|
MultipleEpisodeExpressions = new[]
|
||||||
{
|
{
|
||||||
@@ -887,12 +889,12 @@ namespace Emby.Naming.Common
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets list of clean datetime regular expressions.
|
/// Gets list of clean datetime regular expressions.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Regex[] CleanDateTimeRegexes { get; private set; } = Array.Empty<Regex>();
|
public Regex[] CleanDateTimeRegexes { get; private set; } = [];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Gets list of clean string regular expressions.
|
/// Gets list of clean string regular expressions.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Regex[] CleanStringRegexes { get; private set; } = Array.Empty<Regex>();
|
public Regex[] CleanStringRegexes { get; private set; } = [];
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Compiles raw regex strings into regexes.
|
/// Compiles raw regex strings into regexes.
|
||||||
|
|||||||
@@ -36,7 +36,7 @@
|
|||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<Authors>Jellyfin Contributors</Authors>
|
<Authors>Jellyfin Contributors</Authors>
|
||||||
<PackageId>Jellyfin.Naming</PackageId>
|
<PackageId>Jellyfin.Naming</PackageId>
|
||||||
<VersionPrefix>10.11.0</VersionPrefix>
|
<VersionPrefix>10.11.5</VersionPrefix>
|
||||||
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
<RepositoryUrl>https://github.com/jellyfin/jellyfin</RepositoryUrl>
|
||||||
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
<PackageLicenseExpression>GPL-3.0-only</PackageLicenseExpression>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|||||||
@@ -97,14 +97,18 @@ namespace Emby.Naming.ExternalFiles
|
|||||||
|
|
||||||
if (culture is not null && pathInfo.Language is null)
|
if (culture is not null && pathInfo.Language is null)
|
||||||
{
|
{
|
||||||
pathInfo.Language = culture.ThreeLetterISOLanguageName;
|
pathInfo.Language = culture.Name.Contains('-', StringComparison.OrdinalIgnoreCase)
|
||||||
|
? culture.Name
|
||||||
|
: culture.ThreeLetterISOLanguageName;
|
||||||
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
|
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
else if (culture is not null && pathInfo.Language == "hin")
|
else if (culture is not null && pathInfo.Language == "hin")
|
||||||
{
|
{
|
||||||
// Hindi language code "hi" collides with a hearing impaired flag - use as Hindi only if no other language is set
|
// Hindi language code "hi" collides with a hearing impaired flag - use as Hindi only if no other language is set
|
||||||
pathInfo.IsHearingImpaired = true;
|
pathInfo.IsHearingImpaired = true;
|
||||||
pathInfo.Language = culture.ThreeLetterISOLanguageName;
|
pathInfo.Language = culture.Name.Contains('-', StringComparison.OrdinalIgnoreCase)
|
||||||
|
? culture.Name
|
||||||
|
: culture.ThreeLetterISOLanguageName;
|
||||||
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
|
extraString = extraString.Replace(currentSlice, string.Empty, StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
else if (_namingOptions.MediaHearingImpairedFlags.Any(s => currentSliceWithoutSeparator.Equals(s, StringComparison.OrdinalIgnoreCase)))
|
else if (_namingOptions.MediaHearingImpairedFlags.Any(s => currentSliceWithoutSeparator.Equals(s, StringComparison.OrdinalIgnoreCase)))
|
||||||
|
|||||||
@@ -10,12 +10,17 @@ namespace Emby.Naming.TV
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public static partial class SeasonPathParser
|
public static partial class SeasonPathParser
|
||||||
{
|
{
|
||||||
[GeneratedRegex(@"^\s*((?<seasonnumber>(?>\d+))(?:st|nd|rd|th|\.)*(?!\s*[Ee]\d+))\s*(?:[[시즌]*|[シーズン]*|[sS](?:eason|æson|aison|taffel|eries|tagione|äsong|eizoen|easong|ezon|ezona|ezóna|ezonul)*|[tT](?:emporada)*|[kK](?:ausi)*|[Сс](?:езон)*)\s*(?<rightpart>.*)$")]
|
private static readonly Regex CleanNameRegex = new(@"[ ._\-\[\]]", RegexOptions.Compiled);
|
||||||
|
|
||||||
|
[GeneratedRegex(@"^\s*((?<seasonnumber>(?>\d+))(?:st|nd|rd|th|\.)*(?!\s*[Ee]\d+))\s*(?:[[시즌]*|[シーズン]*|[sS](?:eason|æson|aison|taffel|eries|tagione|äsong|eizoen|easong|ezon|ezona|ezóna|ezonul)*|[tT](?:emporada)*|[kK](?:ausi)*|[Сс](?:езон)*)\s*(?<rightpart>.*)$", RegexOptions.IgnoreCase)]
|
||||||
private static partial Regex ProcessPre();
|
private static partial Regex ProcessPre();
|
||||||
|
|
||||||
[GeneratedRegex(@"^\s*(?:[[시즌]*|[シーズン]*|[sS](?:eason|æson|aison|taffel|eries|tagione|äsong|eizoen|easong|ezon|ezona|ezóna|ezonul)*|[tT](?:emporada)*|[kK](?:ausi)*|[Сс](?:езон)*)\s*(?<seasonnumber>(?>\d+)(?!\s*[Ee]\d+))(?<rightpart>.*)$")]
|
[GeneratedRegex(@"^\s*(?:[[시즌]*|[シーズン]*|[sS](?:eason|æson|aison|taffel|eries|tagione|äsong|eizoen|easong|ezon|ezona|ezóna|ezonul)*|[tT](?:emporada)*|[kK](?:ausi)*|[Сс](?:езон)*)\s*(?<seasonnumber>\d+?)(?=\d{3,4}p|[^\d]|$)(?!\s*[Ee]\d)(?<rightpart>.*)$", RegexOptions.IgnoreCase)]
|
||||||
private static partial Regex ProcessPost();
|
private static partial Regex ProcessPost();
|
||||||
|
|
||||||
|
[GeneratedRegex(@"[sS](\d{1,4})(?!\d|[eE]\d)(?=\.|_|-|\[|\]|\s|$)", RegexOptions.None)]
|
||||||
|
private static partial Regex SeasonPrefix();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Attempts to parse season number from path.
|
/// Attempts to parse season number from path.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -56,45 +61,35 @@ namespace Emby.Naming.TV
|
|||||||
bool supportSpecialAliases,
|
bool supportSpecialAliases,
|
||||||
bool supportNumericSeasonFolders)
|
bool supportNumericSeasonFolders)
|
||||||
{
|
{
|
||||||
string filename = Path.GetFileName(path);
|
var fileName = Path.GetFileName(path);
|
||||||
filename = Regex.Replace(filename, "[ ._-]", string.Empty);
|
|
||||||
|
var seasonPrefixMatch = SeasonPrefix().Match(fileName);
|
||||||
|
if (seasonPrefixMatch.Success &&
|
||||||
|
int.TryParse(seasonPrefixMatch.Groups[1].Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val))
|
||||||
|
{
|
||||||
|
return (val, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
string filename = CleanNameRegex.Replace(fileName, string.Empty);
|
||||||
|
|
||||||
if (parentFolderName is not null)
|
if (parentFolderName is not null)
|
||||||
{
|
{
|
||||||
parentFolderName = Regex.Replace(parentFolderName, "[ ._-]", string.Empty);
|
var cleanParent = CleanNameRegex.Replace(parentFolderName, string.Empty);
|
||||||
filename = filename.Replace(parentFolderName, string.Empty, StringComparison.OrdinalIgnoreCase);
|
filename = filename.Replace(cleanParent, string.Empty, StringComparison.OrdinalIgnoreCase);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (supportSpecialAliases)
|
if (supportSpecialAliases &&
|
||||||
{
|
(filename.Equals("specials", StringComparison.OrdinalIgnoreCase) ||
|
||||||
if (string.Equals(filename, "specials", StringComparison.OrdinalIgnoreCase))
|
filename.Equals("extras", StringComparison.OrdinalIgnoreCase)))
|
||||||
{
|
{
|
||||||
return (0, true);
|
return (0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.Equals(filename, "extras", StringComparison.OrdinalIgnoreCase))
|
if (supportNumericSeasonFolders &&
|
||||||
{
|
int.TryParse(filename, NumberStyles.Integer, CultureInfo.InvariantCulture, out val))
|
||||||
return (0, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (supportNumericSeasonFolders)
|
|
||||||
{
|
|
||||||
if (int.TryParse(filename, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val))
|
|
||||||
{
|
{
|
||||||
return (val, true);
|
return (val, true);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if (filename.StartsWith('s'))
|
|
||||||
{
|
|
||||||
var testFilename = filename.AsSpan()[1..];
|
|
||||||
|
|
||||||
if (int.TryParse(testFilename, NumberStyles.Integer, CultureInfo.InvariantCulture, out var val))
|
|
||||||
{
|
|
||||||
return (val, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var preMatch = ProcessPre().Match(filename);
|
var preMatch = ProcessPre().Match(filename);
|
||||||
if (preMatch.Success)
|
if (preMatch.Success)
|
||||||
@@ -113,9 +108,11 @@ namespace Emby.Naming.TV
|
|||||||
var numberString = match.Groups["seasonnumber"];
|
var numberString = match.Groups["seasonnumber"];
|
||||||
if (numberString.Success)
|
if (numberString.Success)
|
||||||
{
|
{
|
||||||
var seasonNumber = int.Parse(numberString.Value, CultureInfo.InvariantCulture);
|
if (int.TryParse(numberString.Value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var seasonNumber))
|
||||||
|
{
|
||||||
return (seasonNumber, true);
|
return (seasonNumber, true);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return (null, false);
|
return (null, false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,68 +22,46 @@ namespace Emby.Naming.Video
|
|||||||
/// <returns>Returns <see cref="ExtraResult"/> object.</returns>
|
/// <returns>Returns <see cref="ExtraResult"/> object.</returns>
|
||||||
public static ExtraResult GetExtraInfo(string path, NamingOptions namingOptions, string? libraryRoot = "")
|
public static ExtraResult GetExtraInfo(string path, NamingOptions namingOptions, string? libraryRoot = "")
|
||||||
{
|
{
|
||||||
var result = new ExtraResult();
|
ExtraResult result = new ExtraResult();
|
||||||
|
|
||||||
for (var i = 0; i < namingOptions.VideoExtraRules.Length; i++)
|
bool isAudioFile = AudioFileParser.IsAudioFile(path, namingOptions);
|
||||||
|
bool isVideoFile = VideoResolver.IsVideoFile(path, namingOptions);
|
||||||
|
|
||||||
|
ReadOnlySpan<char> pathSpan = path.AsSpan();
|
||||||
|
ReadOnlySpan<char> fileName = Path.GetFileName(pathSpan);
|
||||||
|
ReadOnlySpan<char> fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathSpan);
|
||||||
|
// Trim the digits from the end of the filename so we can recognize things like -trailer2
|
||||||
|
ReadOnlySpan<char> trimmedFileNameWithoutExtension = fileNameWithoutExtension.TrimEnd(_digits);
|
||||||
|
ReadOnlySpan<char> directoryName = Path.GetFileName(Path.GetDirectoryName(pathSpan));
|
||||||
|
string fullDirectory = Path.GetDirectoryName(pathSpan).ToString();
|
||||||
|
|
||||||
|
foreach (ExtraRule rule in namingOptions.VideoExtraRules)
|
||||||
{
|
{
|
||||||
var rule = namingOptions.VideoExtraRules[i];
|
if ((rule.MediaType == MediaType.Audio && !isAudioFile)
|
||||||
if ((rule.MediaType == MediaType.Audio && !AudioFileParser.IsAudioFile(path, namingOptions))
|
|| (rule.MediaType == MediaType.Video && !isVideoFile))
|
||||||
|| (rule.MediaType == MediaType.Video && !VideoResolver.IsVideoFile(path, namingOptions)))
|
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var pathSpan = path.AsSpan();
|
bool isMatch = rule.RuleType switch
|
||||||
if (rule.RuleType == ExtraRuleType.Filename)
|
|
||||||
{
|
{
|
||||||
var filename = Path.GetFileNameWithoutExtension(pathSpan);
|
ExtraRuleType.Filename => fileNameWithoutExtension.Equals(rule.Token, StringComparison.OrdinalIgnoreCase),
|
||||||
|
ExtraRuleType.Suffix => trimmedFileNameWithoutExtension.EndsWith(rule.Token, StringComparison.OrdinalIgnoreCase),
|
||||||
|
ExtraRuleType.Regex => Regex.IsMatch(fileName, rule.Token, RegexOptions.IgnoreCase | RegexOptions.Compiled),
|
||||||
|
ExtraRuleType.DirectoryName => directoryName.Equals(rule.Token, StringComparison.OrdinalIgnoreCase)
|
||||||
|
&& !string.Equals(fullDirectory, libraryRoot, StringComparison.OrdinalIgnoreCase),
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
|
|
||||||
if (filename.Equals(rule.Token, StringComparison.OrdinalIgnoreCase))
|
if (!isMatch)
|
||||||
{
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
result.ExtraType = rule.ExtraType;
|
result.ExtraType = rule.ExtraType;
|
||||||
result.Rule = rule;
|
result.Rule = rule;
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (rule.RuleType == ExtraRuleType.Suffix)
|
|
||||||
{
|
|
||||||
// Trim the digits from the end of the filename so we can recognize things like -trailer2
|
|
||||||
var filename = Path.GetFileNameWithoutExtension(pathSpan).TrimEnd(_digits);
|
|
||||||
|
|
||||||
if (filename.EndsWith(rule.Token, StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
result.ExtraType = rule.ExtraType;
|
|
||||||
result.Rule = rule;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (rule.RuleType == ExtraRuleType.Regex)
|
|
||||||
{
|
|
||||||
var filename = Path.GetFileName(path.AsSpan());
|
|
||||||
|
|
||||||
var isMatch = Regex.IsMatch(filename, rule.Token, RegexOptions.IgnoreCase | RegexOptions.Compiled);
|
|
||||||
|
|
||||||
if (isMatch)
|
|
||||||
{
|
|
||||||
result.ExtraType = rule.ExtraType;
|
|
||||||
result.Rule = rule;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (rule.RuleType == ExtraRuleType.DirectoryName)
|
|
||||||
{
|
|
||||||
var directoryName = Path.GetFileName(Path.GetDirectoryName(pathSpan));
|
|
||||||
string fullDirectory = Path.GetDirectoryName(pathSpan).ToString();
|
|
||||||
if (directoryName.Equals(rule.Token, StringComparison.OrdinalIgnoreCase)
|
|
||||||
&& !string.Equals(fullDirectory, libraryRoot, StringComparison.OrdinalIgnoreCase))
|
|
||||||
{
|
|
||||||
result.ExtraType = rule.ExtraType;
|
|
||||||
result.Rule = rule;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result.ExtraType is not null)
|
|
||||||
{
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ namespace Emby.Naming.Video
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class StackMetadata
|
private sealed class StackMetadata
|
||||||
{
|
{
|
||||||
public StackMetadata(bool isDirectory, bool isNumerical, string partType)
|
public StackMetadata(bool isDirectory, bool isNumerical, string partType)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ public class PhotoProvider : ICustomMetadataProvider<Photo>, IForcedProvider, IH
|
|||||||
if (item.IsFileProtocol)
|
if (item.IsFileProtocol)
|
||||||
{
|
{
|
||||||
var file = directoryService.GetFile(item.Path);
|
var file = directoryService.GetFile(item.Path);
|
||||||
return file is not null && file.LastWriteTimeUtc != item.DateModified;
|
return file is not null && item.HasChanged(file.LastWriteTimeUtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
@@ -108,7 +108,7 @@ public class PhotoProvider : ICustomMetadataProvider<Photo>, IForcedProvider, IH
|
|||||||
var dateTaken = image.ImageTag.DateTime;
|
var dateTaken = image.ImageTag.DateTime;
|
||||||
if (dateTaken.HasValue)
|
if (dateTaken.HasValue)
|
||||||
{
|
{
|
||||||
item.DateCreated = dateTaken.Value;
|
item.DateCreated = dateTaken.Value.ToUniversalTime();
|
||||||
item.PremiereDate = dateTaken.Value;
|
item.PremiereDate = dateTaken.Value;
|
||||||
item.ProductionYear = dateTaken.Value.Year;
|
item.ProductionYear = dateTaken.Value.Year;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,10 +107,20 @@ namespace Emby.Server.Implementations.AppBase
|
|||||||
|
|
||||||
private void CheckOrCreateMarker(string path, string markerName, bool recursive = false)
|
private void CheckOrCreateMarker(string path, string markerName, bool recursive = false)
|
||||||
{
|
{
|
||||||
var otherMarkers = GetMarkers(path, recursive).FirstOrDefault(e => Path.GetFileName(e) != markerName);
|
string? otherMarkers = null;
|
||||||
if (otherMarkers != null)
|
try
|
||||||
{
|
{
|
||||||
throw new InvalidOperationException($"Exepected to find only {markerName} but found marker for {otherMarkers}.");
|
otherMarkers = GetMarkers(path, recursive).FirstOrDefault(e => !Path.GetFileName(e.AsSpan()).Equals(markerName, StringComparison.OrdinalIgnoreCase));
|
||||||
|
}
|
||||||
|
catch
|
||||||
|
{
|
||||||
|
// Error while checking for marker files, assume none exist and keep going
|
||||||
|
// TODO: add some logging
|
||||||
|
}
|
||||||
|
|
||||||
|
if (otherMarkers is not null)
|
||||||
|
{
|
||||||
|
throw new InvalidOperationException($"Expected to find only {markerName} but found marker for {otherMarkers}.");
|
||||||
}
|
}
|
||||||
|
|
||||||
var markerPath = Path.Combine(path, markerName);
|
var markerPath = Path.Combine(path, markerName);
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
@@ -224,7 +223,7 @@ public class ChapterManager : IChapterManager
|
|||||||
|
|
||||||
if (saveChapters && changesMade)
|
if (saveChapters && changesMade)
|
||||||
{
|
{
|
||||||
_chapterRepository.SaveChapters(video.Id, chapters);
|
SaveChapters(video, chapters);
|
||||||
}
|
}
|
||||||
|
|
||||||
DeleteDeadImages(currentImages, chapters);
|
DeleteDeadImages(currentImages, chapters);
|
||||||
@@ -235,7 +234,9 @@ public class ChapterManager : IChapterManager
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void SaveChapters(Video video, IReadOnlyList<ChapterInfo> chapters)
|
public void SaveChapters(Video video, IReadOnlyList<ChapterInfo> chapters)
|
||||||
{
|
{
|
||||||
_chapterRepository.SaveChapters(video.Id, chapters);
|
// Remove any chapters that are outside of the runtime of the video
|
||||||
|
var validChapters = chapters.Where(c => c.StartPositionTicks < video.RunTimeTicks).ToList();
|
||||||
|
_chapterRepository.SaveChapters(video.Id, validChapters);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -251,23 +252,9 @@ public class ChapterManager : IChapterManager
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void DeleteChapterImages(Video video)
|
public async Task DeleteChapterDataAsync(Guid itemId, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
var path = _pathManager.GetChapterImageFolderPath(video);
|
await _chapterRepository.DeleteChaptersAsync(itemId, cancellationToken).ConfigureAwait(false);
|
||||||
try
|
|
||||||
{
|
|
||||||
if (Directory.Exists(path))
|
|
||||||
{
|
|
||||||
_logger.LogInformation("Removing chapter images for {Name} [{Id}]", video.Name, video.Id);
|
|
||||||
Directory.Delete(path, true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
_logger.LogWarning("Failed to remove chapter image folder for {Item}: {Exception}", video.Id, ex);
|
|
||||||
}
|
|
||||||
|
|
||||||
_chapterRepository.DeleteChapters(video.Id);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private IReadOnlyList<string> GetSavedChapterImages(Video video, IDirectoryService directoryService)
|
private IReadOnlyList<string> GetSavedChapterImages(Video video, IDirectoryService directoryService)
|
||||||
|
|||||||
@@ -104,6 +104,8 @@ namespace Emby.Server.Implementations.Collections
|
|||||||
|
|
||||||
await _libraryManager.AddVirtualFolder(name, CollectionTypeOptions.boxsets, libraryOptions, true).ConfigureAwait(false);
|
await _libraryManager.AddVirtualFolder(name, CollectionTypeOptions.boxsets, libraryOptions, true).ConfigureAwait(false);
|
||||||
|
|
||||||
|
_libraryManager.RootFolder.Children = null;
|
||||||
|
|
||||||
return FindFolders(path).First();
|
return FindFolders(path).First();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -50,6 +50,8 @@ public class CleanDatabaseScheduledTask : ILibraryPostScanTask
|
|||||||
|
|
||||||
_logger.LogDebug("Cleaning {Number} items with dead parents", numItems);
|
_logger.LogDebug("Cleaning {Number} items with dead parents", numItems);
|
||||||
|
|
||||||
|
IProgress<double> subProgress = new Progress<double>((val) => progress.Report(val / 2));
|
||||||
|
|
||||||
foreach (var itemId in itemIds)
|
foreach (var itemId in itemIds)
|
||||||
{
|
{
|
||||||
cancellationToken.ThrowIfCancellationRequested();
|
cancellationToken.ThrowIfCancellationRequested();
|
||||||
@@ -95,9 +97,10 @@ public class CleanDatabaseScheduledTask : ILibraryPostScanTask
|
|||||||
numComplete++;
|
numComplete++;
|
||||||
double percent = numComplete;
|
double percent = numComplete;
|
||||||
percent /= numItems;
|
percent /= numItems;
|
||||||
progress.Report(percent * 100);
|
subProgress.Report(percent * 100);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
subProgress = new Progress<double>((val) => progress.Report((val / 2) + 50));
|
||||||
var context = await _dbProvider.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
|
var context = await _dbProvider.CreateDbContextAsync(cancellationToken).ConfigureAwait(false);
|
||||||
await using (context.ConfigureAwait(false))
|
await using (context.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
@@ -105,7 +108,9 @@ public class CleanDatabaseScheduledTask : ILibraryPostScanTask
|
|||||||
await using (transaction.ConfigureAwait(false))
|
await using (transaction.ConfigureAwait(false))
|
||||||
{
|
{
|
||||||
await context.ItemValues.Where(e => e.BaseItemsMap!.Count == 0).ExecuteDeleteAsync(cancellationToken).ConfigureAwait(false);
|
await context.ItemValues.Where(e => e.BaseItemsMap!.Count == 0).ExecuteDeleteAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
subProgress.Report(50);
|
||||||
await transaction.CommitAsync(cancellationToken).ConfigureAwait(false);
|
await transaction.CommitAsync(cancellationToken).ConfigureAwait(false);
|
||||||
|
subProgress.Report(100);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma warning disable CS1591
|
#pragma warning disable CS1591
|
||||||
|
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Frozen;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
@@ -37,6 +38,77 @@ namespace Emby.Server.Implementations.Dto
|
|||||||
{
|
{
|
||||||
public class DtoService : IDtoService
|
public class DtoService : IDtoService
|
||||||
{
|
{
|
||||||
|
private static readonly FrozenDictionary<BaseItemKind, BaseItemKind[]> _relatedItemKinds = new Dictionary<BaseItemKind, BaseItemKind[]>
|
||||||
|
{
|
||||||
|
{
|
||||||
|
BaseItemKind.Genre, [
|
||||||
|
BaseItemKind.Audio,
|
||||||
|
BaseItemKind.Episode,
|
||||||
|
BaseItemKind.Movie,
|
||||||
|
BaseItemKind.LiveTvProgram,
|
||||||
|
BaseItemKind.MusicAlbum,
|
||||||
|
BaseItemKind.MusicArtist,
|
||||||
|
BaseItemKind.MusicVideo,
|
||||||
|
BaseItemKind.Series,
|
||||||
|
BaseItemKind.Trailer
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BaseItemKind.MusicArtist, [
|
||||||
|
BaseItemKind.Audio,
|
||||||
|
BaseItemKind.MusicAlbum,
|
||||||
|
BaseItemKind.MusicVideo
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BaseItemKind.MusicGenre, [
|
||||||
|
BaseItemKind.Audio,
|
||||||
|
BaseItemKind.MusicAlbum,
|
||||||
|
BaseItemKind.MusicArtist,
|
||||||
|
BaseItemKind.MusicVideo
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BaseItemKind.Person, [
|
||||||
|
BaseItemKind.Audio,
|
||||||
|
BaseItemKind.Episode,
|
||||||
|
BaseItemKind.Movie,
|
||||||
|
BaseItemKind.LiveTvProgram,
|
||||||
|
BaseItemKind.MusicAlbum,
|
||||||
|
BaseItemKind.MusicArtist,
|
||||||
|
BaseItemKind.MusicVideo,
|
||||||
|
BaseItemKind.Series,
|
||||||
|
BaseItemKind.Trailer
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BaseItemKind.Studio, [
|
||||||
|
BaseItemKind.Audio,
|
||||||
|
BaseItemKind.Episode,
|
||||||
|
BaseItemKind.Movie,
|
||||||
|
BaseItemKind.LiveTvProgram,
|
||||||
|
BaseItemKind.MusicAlbum,
|
||||||
|
BaseItemKind.MusicArtist,
|
||||||
|
BaseItemKind.MusicVideo,
|
||||||
|
BaseItemKind.Series,
|
||||||
|
BaseItemKind.Trailer
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
BaseItemKind.Year, [
|
||||||
|
BaseItemKind.Audio,
|
||||||
|
BaseItemKind.Episode,
|
||||||
|
BaseItemKind.Movie,
|
||||||
|
BaseItemKind.LiveTvProgram,
|
||||||
|
BaseItemKind.MusicAlbum,
|
||||||
|
BaseItemKind.MusicArtist,
|
||||||
|
BaseItemKind.MusicVideo,
|
||||||
|
BaseItemKind.Series,
|
||||||
|
BaseItemKind.Trailer
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}.ToFrozenDictionary();
|
||||||
|
|
||||||
private readonly ILogger<DtoService> _logger;
|
private readonly ILogger<DtoService> _logger;
|
||||||
private readonly ILibraryManager _libraryManager;
|
private readonly ILibraryManager _libraryManager;
|
||||||
private readonly IUserDataManager _userDataRepository;
|
private readonly IUserDataManager _userDataRepository;
|
||||||
@@ -102,21 +174,9 @@ namespace Emby.Server.Implementations.Dto
|
|||||||
(programTuples ??= []).Add((item, dto));
|
(programTuples ??= []).Add((item, dto));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item is IItemByName byName)
|
|
||||||
{
|
|
||||||
if (options.ContainsField(ItemFields.ItemCounts))
|
if (options.ContainsField(ItemFields.ItemCounts))
|
||||||
{
|
{
|
||||||
var libraryItems = byName.GetTaggedItems(new InternalItemsQuery(user)
|
SetItemByNameInfo(dto, user);
|
||||||
{
|
|
||||||
Recursive = true,
|
|
||||||
DtoOptions = new DtoOptions(false)
|
|
||||||
{
|
|
||||||
EnableImages = false
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
SetItemByNameInfo(item, dto, libraryItems);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
returnItems[index] = dto;
|
returnItems[index] = dto;
|
||||||
@@ -147,34 +207,14 @@ namespace Emby.Server.Implementations.Dto
|
|||||||
LivetvManager.AddInfoToProgramDto(new[] { (item, dto) }, options.Fields, user).GetAwaiter().GetResult();
|
LivetvManager.AddInfoToProgramDto(new[] { (item, dto) }, options.Fields, user).GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item is IItemByName itemByName
|
if (options.ContainsField(ItemFields.ItemCounts))
|
||||||
&& options.ContainsField(ItemFields.ItemCounts))
|
|
||||||
{
|
{
|
||||||
SetItemByNameInfo(
|
SetItemByNameInfo(dto, user);
|
||||||
item,
|
|
||||||
dto,
|
|
||||||
GetTaggedItems(
|
|
||||||
itemByName,
|
|
||||||
user,
|
|
||||||
new DtoOptions(false)
|
|
||||||
{
|
|
||||||
EnableImages = false
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return dto;
|
return dto;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IReadOnlyList<BaseItem> GetTaggedItems(IItemByName byName, User? user, DtoOptions options)
|
|
||||||
{
|
|
||||||
return byName.GetTaggedItems(
|
|
||||||
new InternalItemsQuery(user)
|
|
||||||
{
|
|
||||||
Recursive = true,
|
|
||||||
DtoOptions = options
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User? user = null, BaseItem? owner = null)
|
private BaseItemDto GetBaseItemDtoInternal(BaseItem item, DtoOptions options, User? user = null, BaseItem? owner = null)
|
||||||
{
|
{
|
||||||
var dto = new BaseItemDto
|
var dto = new BaseItemDto
|
||||||
@@ -315,11 +355,15 @@ namespace Emby.Server.Implementations.Dto
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
/// TODO refactor this to use the new SetItemByNameInfo.
|
||||||
|
/// Some callers already have the counts extracted so no reason to retrieve them again.
|
||||||
public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options, List<BaseItem>? taggedItems, User? user = null)
|
public BaseItemDto GetItemByNameDto(BaseItem item, DtoOptions options, List<BaseItem>? taggedItems, User? user = null)
|
||||||
{
|
{
|
||||||
var dto = GetBaseItemDtoInternal(item, options, user);
|
var dto = GetBaseItemDtoInternal(item, options, user);
|
||||||
|
|
||||||
if (taggedItems is not null && options.ContainsField(ItemFields.ItemCounts))
|
if (options.ContainsField(ItemFields.ItemCounts)
|
||||||
|
&& taggedItems is not null
|
||||||
|
&& taggedItems.Count != 0)
|
||||||
{
|
{
|
||||||
SetItemByNameInfo(item, dto, taggedItems);
|
SetItemByNameInfo(item, dto, taggedItems);
|
||||||
}
|
}
|
||||||
@@ -327,6 +371,57 @@ namespace Emby.Server.Implementations.Dto
|
|||||||
return dto;
|
return dto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void SetItemByNameInfo(BaseItemDto dto, User? user)
|
||||||
|
{
|
||||||
|
if (!_relatedItemKinds.TryGetValue(dto.Type, out var relatedItemKinds))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var query = new InternalItemsQuery(user)
|
||||||
|
{
|
||||||
|
Recursive = true,
|
||||||
|
DtoOptions = new DtoOptions(false) { EnableImages = false },
|
||||||
|
IncludeItemTypes = relatedItemKinds
|
||||||
|
};
|
||||||
|
|
||||||
|
switch (dto.Type)
|
||||||
|
{
|
||||||
|
case BaseItemKind.Genre:
|
||||||
|
case BaseItemKind.MusicGenre:
|
||||||
|
query.GenreIds = [dto.Id];
|
||||||
|
break;
|
||||||
|
case BaseItemKind.MusicArtist:
|
||||||
|
query.ArtistIds = [dto.Id];
|
||||||
|
break;
|
||||||
|
case BaseItemKind.Person:
|
||||||
|
query.PersonIds = [dto.Id];
|
||||||
|
break;
|
||||||
|
case BaseItemKind.Studio:
|
||||||
|
query.StudioIds = [dto.Id];
|
||||||
|
break;
|
||||||
|
case BaseItemKind.Year
|
||||||
|
when int.TryParse(dto.Name, NumberStyles.Integer, CultureInfo.InvariantCulture, out var year):
|
||||||
|
query.Years = [year];
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var counts = _libraryManager.GetItemCounts(query);
|
||||||
|
|
||||||
|
dto.AlbumCount = counts.AlbumCount;
|
||||||
|
dto.ArtistCount = counts.ArtistCount;
|
||||||
|
dto.EpisodeCount = counts.EpisodeCount;
|
||||||
|
dto.MovieCount = counts.MovieCount;
|
||||||
|
dto.MusicVideoCount = counts.MusicVideoCount;
|
||||||
|
dto.ProgramCount = counts.ProgramCount;
|
||||||
|
dto.SeriesCount = counts.SeriesCount;
|
||||||
|
dto.SongCount = counts.SongCount;
|
||||||
|
dto.TrailerCount = counts.TrailerCount;
|
||||||
|
dto.ChildCount = counts.TotalItemCount();
|
||||||
|
}
|
||||||
|
|
||||||
private static void SetItemByNameInfo(BaseItem item, BaseItemDto dto, IReadOnlyList<BaseItem> taggedItems)
|
private static void SetItemByNameInfo(BaseItem item, BaseItemDto dto, IReadOnlyList<BaseItem> taggedItems)
|
||||||
{
|
{
|
||||||
if (item is MusicArtist)
|
if (item is MusicArtist)
|
||||||
@@ -956,30 +1051,15 @@ namespace Emby.Server.Implementations.Dto
|
|||||||
|
|
||||||
// Include artists that are not in the database yet, e.g., just added via metadata editor
|
// Include artists that are not in the database yet, e.g., just added via metadata editor
|
||||||
// var foundArtists = artistItems.Items.Select(i => i.Item1.Name).ToList();
|
// var foundArtists = artistItems.Items.Select(i => i.Item1.Name).ToList();
|
||||||
dto.ArtistItems = hasArtist.Artists
|
dto.ArtistItems = _libraryManager.GetArtists([.. hasArtist.Artists.Where(e => !string.IsNullOrWhiteSpace(e))])
|
||||||
// .Except(foundArtists, new DistinctNameComparer())
|
.Where(e => e.Value.Length > 0)
|
||||||
.Select(i =>
|
.Select(i =>
|
||||||
{
|
|
||||||
// This should not be necessary but we're seeing some cases of it
|
|
||||||
if (string.IsNullOrEmpty(i))
|
|
||||||
{
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
var artist = _libraryManager.GetArtist(i, new DtoOptions(false)
|
|
||||||
{
|
|
||||||
EnableImages = false
|
|
||||||
});
|
|
||||||
if (artist is not null)
|
|
||||||
{
|
{
|
||||||
return new NameGuidPair
|
return new NameGuidPair
|
||||||
{
|
{
|
||||||
Name = artist.Name,
|
Name = i.Key,
|
||||||
Id = artist.Id
|
Id = i.Value.First().Id
|
||||||
};
|
};
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}).Where(i => i is not null).ToArray();
|
}).Where(i => i is not null).ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1065,7 +1145,12 @@ namespace Emby.Server.Implementations.Dto
|
|||||||
|
|
||||||
if (options.ContainsField(ItemFields.Trickplay))
|
if (options.ContainsField(ItemFields.Trickplay))
|
||||||
{
|
{
|
||||||
dto.Trickplay = _trickplayManager.GetTrickplayManifest(item).GetAwaiter().GetResult();
|
var trickplay = _trickplayManager.GetTrickplayManifest(item).GetAwaiter().GetResult();
|
||||||
|
dto.Trickplay = trickplay.ToDictionary(
|
||||||
|
mediaStream => mediaStream.Key,
|
||||||
|
mediaStream => mediaStream.Value.ToDictionary(
|
||||||
|
width => width.Key,
|
||||||
|
width => new TrickplayInfoDto(width.Value)));
|
||||||
}
|
}
|
||||||
|
|
||||||
dto.ExtraType = video.ExtraType;
|
dto.ExtraType = video.ExtraType;
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ namespace Emby.Server.Implementations.HttpServer
|
|||||||
RemoteEndPoint = remoteEndPoint;
|
RemoteEndPoint = remoteEndPoint;
|
||||||
|
|
||||||
_jsonOptions = JsonDefaults.Options;
|
_jsonOptions = JsonDefaults.Options;
|
||||||
LastActivityDate = DateTime.Now;
|
LastActivityDate = DateTime.UtcNow;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ using System.Linq;
|
|||||||
using System.Security;
|
using System.Security;
|
||||||
using Jellyfin.Extensions;
|
using Jellyfin.Extensions;
|
||||||
using MediaBrowser.Common.Configuration;
|
using MediaBrowser.Common.Configuration;
|
||||||
|
using MediaBrowser.Controller.IO;
|
||||||
using MediaBrowser.Model.IO;
|
using MediaBrowser.Model.IO;
|
||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
|
||||||
@@ -152,6 +153,10 @@ namespace Emby.Server.Implementations.IO
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public void MoveDirectory(string source, string destination)
|
public void MoveDirectory(string source, string destination)
|
||||||
{
|
{
|
||||||
|
// Make sure parent directory of target exists
|
||||||
|
var parent = Directory.GetParent(destination);
|
||||||
|
parent?.Create();
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
Directory.Move(source, destination);
|
Directory.Move(source, destination);
|
||||||
@@ -248,48 +253,41 @@ namespace Emby.Server.Implementations.IO
|
|||||||
{
|
{
|
||||||
result.IsDirectory = info is DirectoryInfo || (info.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
|
result.IsDirectory = info is DirectoryInfo || (info.Attributes & FileAttributes.Directory) == FileAttributes.Directory;
|
||||||
|
|
||||||
// if (!result.IsDirectory)
|
|
||||||
// {
|
|
||||||
// result.IsHidden = (info.Attributes & FileAttributes.Hidden) == FileAttributes.Hidden;
|
|
||||||
// }
|
|
||||||
|
|
||||||
if (info is FileInfo fileInfo)
|
if (info is FileInfo fileInfo)
|
||||||
{
|
{
|
||||||
result.Length = fileInfo.Length;
|
result.CreationTimeUtc = GetCreationTimeUtc(info);
|
||||||
|
result.LastWriteTimeUtc = GetLastWriteTimeUtc(info);
|
||||||
// Issue #2354 get the size of files behind symbolic links. Also Enum.HasFlag is bad as it boxes!
|
if (fileInfo.LinkTarget is not null)
|
||||||
if ((fileInfo.Attributes & FileAttributes.ReparsePoint) == FileAttributes.ReparsePoint)
|
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
using (var fileHandle = File.OpenHandle(fileInfo.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
|
var targetFileInfo = FileSystemHelper.ResolveLinkTarget(fileInfo, returnFinalTarget: true);
|
||||||
|
if (targetFileInfo is not null)
|
||||||
{
|
{
|
||||||
result.Length = RandomAccess.GetLength(fileHandle);
|
result.Exists = targetFileInfo.Exists;
|
||||||
|
if (result.Exists)
|
||||||
|
{
|
||||||
|
result.Length = targetFileInfo.Length;
|
||||||
|
result.CreationTimeUtc = GetCreationTimeUtc(targetFileInfo);
|
||||||
|
result.LastWriteTimeUtc = GetLastWriteTimeUtc(targetFileInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (FileNotFoundException ex)
|
else
|
||||||
{
|
{
|
||||||
// Dangling symlinks cannot be detected before opening the file unfortunately...
|
|
||||||
_logger.LogError(ex, "Reading the file size of the symlink at {Path} failed. Marking the file as not existing.", fileInfo.FullName);
|
|
||||||
result.Exists = false;
|
result.Exists = false;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
catch (UnauthorizedAccessException ex)
|
catch (UnauthorizedAccessException ex)
|
||||||
{
|
{
|
||||||
_logger.LogError(ex, "Reading the file at {Path} failed due to a permissions exception.", fileInfo.FullName);
|
_logger.LogError(ex, "Reading the file at {Path} failed due to a permissions exception.", fileInfo.FullName);
|
||||||
}
|
}
|
||||||
catch (IOException ex)
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
// IOException generally means the file is not accessible due to filesystem issues
|
result.Length = fileInfo.Length;
|
||||||
// Catch this exception and mark the file as not exist to ignore it
|
|
||||||
_logger.LogError(ex, "Reading the file at {Path} failed due to an IO Exception. Marking the file as not existing", fileInfo.FullName);
|
|
||||||
result.Exists = false;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result.CreationTimeUtc = GetCreationTimeUtc(info);
|
|
||||||
result.LastWriteTimeUtc = GetLastWriteTimeUtc(info);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
result.IsDirectory = info is DirectoryInfo;
|
result.IsDirectory = info is DirectoryInfo;
|
||||||
@@ -499,8 +497,17 @@ namespace Emby.Server.Implementations.IO
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public virtual bool AreEqual(string path1, string path2)
|
public virtual bool AreEqual(string path1, string path2)
|
||||||
{
|
{
|
||||||
return Path.TrimEndingDirectorySeparator(path1).Equals(
|
if (string.IsNullOrWhiteSpace(path1) || string.IsNullOrWhiteSpace(path2))
|
||||||
Path.TrimEndingDirectorySeparator(path2),
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var normalized1 = Path.TrimEndingDirectorySeparator(path1);
|
||||||
|
var normalized2 = Path.TrimEndingDirectorySeparator(path2);
|
||||||
|
|
||||||
|
return string.Equals(
|
||||||
|
normalized1,
|
||||||
|
normalized2,
|
||||||
_isEnvironmentCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
|
_isEnvironmentCaseInsensitive ? StringComparison.OrdinalIgnoreCase : StringComparison.Ordinal);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -43,13 +43,11 @@ namespace Emby.Server.Implementations.Images
|
|||||||
protected IImageProcessor ImageProcessor { get; set; }
|
protected IImageProcessor ImageProcessor { get; set; }
|
||||||
|
|
||||||
protected virtual IReadOnlyCollection<ImageType> SupportedImages { get; }
|
protected virtual IReadOnlyCollection<ImageType> SupportedImages { get; }
|
||||||
= new ImageType[] { ImageType.Primary };
|
= [ImageType.Primary];
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public string Name => "Dynamic Image Provider";
|
public string Name => "Dynamic Image Provider";
|
||||||
|
|
||||||
protected virtual int MaxImageAgeDays => 7;
|
|
||||||
|
|
||||||
public int Order => 0;
|
public int Order => 0;
|
||||||
|
|
||||||
protected virtual bool Supports(BaseItem item) => true;
|
protected virtual bool Supports(BaseItem item) => true;
|
||||||
@@ -292,8 +290,14 @@ namespace Emby.Server.Implementations.Images
|
|||||||
|
|
||||||
protected virtual bool HasChangedByDate(BaseItem item, ItemImageInfo image)
|
protected virtual bool HasChangedByDate(BaseItem item, ItemImageInfo image)
|
||||||
{
|
{
|
||||||
var age = DateTime.UtcNow - image.DateModified;
|
var path = image.Path;
|
||||||
return age.TotalDays > MaxImageAgeDays;
|
if (!string.IsNullOrEmpty(path))
|
||||||
|
{
|
||||||
|
var modificationDate = FileSystem.GetLastWriteTimeUtc(path);
|
||||||
|
return image.DateModified != modificationDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected string CreateSingleImage(IEnumerable<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType)
|
protected string CreateSingleImage(IEnumerable<BaseItem> itemsWithImages, string outputPathWithoutExtension, ImageType imageType)
|
||||||
|
|||||||
@@ -37,46 +37,33 @@ namespace Emby.Server.Implementations.Library
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't ignore top level folders
|
|
||||||
if (fileInfo.IsDirectory && parent is AggregateFolder)
|
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (IgnorePatterns.ShouldIgnore(fileInfo.FullName))
|
if (IgnorePatterns.ShouldIgnore(fileInfo.FullName))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var filename = fileInfo.Name;
|
// Don't ignore top level folders
|
||||||
|
if (fileInfo.IsDirectory
|
||||||
|
&& (parent is AggregateFolder || (parent?.IsTopParent ?? false)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parent is null)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (fileInfo.IsDirectory)
|
if (fileInfo.IsDirectory)
|
||||||
{
|
|
||||||
if (parent is not null)
|
|
||||||
{
|
{
|
||||||
// Ignore extras for unsupported types
|
// Ignore extras for unsupported types
|
||||||
if (_namingOptions.AllExtrasTypesFolderNames.ContainsKey(filename)
|
return _namingOptions.AllExtrasTypesFolderNames.ContainsKey(fileInfo.Name)
|
||||||
&& parent is not AggregateFolder
|
&& parent is not UserRootFolder;
|
||||||
&& parent is not UserRootFolder)
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (parent is not null)
|
|
||||||
{
|
|
||||||
// Don't resolve theme songs
|
|
||||||
if (Path.GetFileNameWithoutExtension(filename.AsSpan()).Equals(BaseItem.ThemeSongFileName, StringComparison.Ordinal)
|
|
||||||
&& AudioFileParser.IsAudioFile(filename, _namingOptions))
|
|
||||||
{
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
// Don't resolve theme songs
|
||||||
|
return Path.GetFileNameWithoutExtension(fileInfo.Name.AsSpan()).Equals(BaseItem.ThemeSongFileName, StringComparison.Ordinal)
|
||||||
|
&& AudioFileParser.IsAudioFile(fileInfo.Name, _namingOptions);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Text.RegularExpressions;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
|
using MediaBrowser.Controller.IO;
|
||||||
using MediaBrowser.Controller.Resolvers;
|
using MediaBrowser.Controller.Resolvers;
|
||||||
using MediaBrowser.Model.IO;
|
using MediaBrowser.Model.IO;
|
||||||
|
|
||||||
@@ -11,28 +13,24 @@ namespace Emby.Server.Implementations.Library;
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public class DotIgnoreIgnoreRule : IResolverIgnoreRule
|
public class DotIgnoreIgnoreRule : IResolverIgnoreRule
|
||||||
{
|
{
|
||||||
|
private static readonly bool IsWindows = OperatingSystem.IsWindows();
|
||||||
|
|
||||||
private static FileInfo? FindIgnoreFile(DirectoryInfo directory)
|
private static FileInfo? FindIgnoreFile(DirectoryInfo directory)
|
||||||
{
|
{
|
||||||
var ignoreFile = new FileInfo(Path.Join(directory.FullName, ".ignore"));
|
for (var current = directory; current is not null; current = current.Parent)
|
||||||
if (ignoreFile.Exists)
|
|
||||||
{
|
{
|
||||||
return ignoreFile;
|
var ignorePath = Path.Join(current.FullName, ".ignore");
|
||||||
|
if (File.Exists(ignorePath))
|
||||||
|
{
|
||||||
|
return new FileInfo(ignorePath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var parentDir = directory.Parent;
|
|
||||||
if (parentDir is null)
|
|
||||||
{
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return FindIgnoreFile(parentDir);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public bool ShouldIgnore(FileSystemMetadata fileInfo, BaseItem? parent)
|
public bool ShouldIgnore(FileSystemMetadata fileInfo, BaseItem? parent) => IsIgnored(fileInfo, parent);
|
||||||
{
|
|
||||||
return IsIgnored(fileInfo, parent);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Checks whether or not the file is ignored.
|
/// Checks whether or not the file is ignored.
|
||||||
@@ -42,36 +40,101 @@ public class DotIgnoreIgnoreRule : IResolverIgnoreRule
|
|||||||
/// <returns>True if the file should be ignored.</returns>
|
/// <returns>True if the file should be ignored.</returns>
|
||||||
public static bool IsIgnored(FileSystemMetadata fileInfo, BaseItem? parent)
|
public static bool IsIgnored(FileSystemMetadata fileInfo, BaseItem? parent)
|
||||||
{
|
{
|
||||||
var parentDirPath = Path.GetDirectoryName(fileInfo.FullName);
|
var searchDirectory = fileInfo.IsDirectory
|
||||||
if (string.IsNullOrEmpty(parentDirPath))
|
? new DirectoryInfo(fileInfo.FullName)
|
||||||
|
: new DirectoryInfo(Path.GetDirectoryName(fileInfo.FullName) ?? string.Empty);
|
||||||
|
|
||||||
|
if (string.IsNullOrEmpty(searchDirectory.FullName))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
var folder = new DirectoryInfo(parentDirPath);
|
var ignoreFile = FindIgnoreFile(searchDirectory);
|
||||||
var ignoreFile = FindIgnoreFile(folder);
|
|
||||||
if (ignoreFile is null)
|
if (ignoreFile is null)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
string ignoreFileString;
|
// Fast path in case the ignore files isn't a symlink and is empty
|
||||||
using (var reader = ignoreFile.OpenText())
|
if (ignoreFile.LinkTarget is null && ignoreFile.Length == 0)
|
||||||
{
|
|
||||||
ignoreFileString = reader.ReadToEnd();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (string.IsNullOrEmpty(ignoreFileString))
|
|
||||||
{
|
{
|
||||||
// Ignore directory if we just have the file
|
// Ignore directory if we just have the file
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// If file has content, base ignoring off the content .gitignore-style rules
|
var content = GetFileContent(ignoreFile);
|
||||||
var ignoreRules = ignoreFileString.Split('\n', StringSplitOptions.RemoveEmptyEntries);
|
return string.IsNullOrWhiteSpace(content)
|
||||||
var ignore = new Ignore.Ignore();
|
|| CheckIgnoreRules(fileInfo.FullName, content, fileInfo.IsDirectory);
|
||||||
ignore.Add(ignoreRules);
|
}
|
||||||
|
|
||||||
return ignore.IsIgnored(fileInfo.FullName);
|
private static bool CheckIgnoreRules(string path, string ignoreFileContent, bool isDirectory)
|
||||||
|
{
|
||||||
|
// If file has content, base ignoring off the content .gitignore-style rules
|
||||||
|
var rules = ignoreFileContent.Split('\n', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries);
|
||||||
|
return CheckIgnoreRules(path, rules, isDirectory);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks whether a path should be ignored based on an array of ignore rules.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">The path to check.</param>
|
||||||
|
/// <param name="rules">The array of ignore rules.</param>
|
||||||
|
/// <param name="isDirectory">Whether the path is a directory.</param>
|
||||||
|
/// <returns>True if the path should be ignored.</returns>
|
||||||
|
internal static bool CheckIgnoreRules(string path, string[] rules, bool isDirectory)
|
||||||
|
=> CheckIgnoreRules(path, rules, isDirectory, IsWindows);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Checks whether a path should be ignored based on an array of ignore rules.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="path">The path to check.</param>
|
||||||
|
/// <param name="rules">The array of ignore rules.</param>
|
||||||
|
/// <param name="isDirectory">Whether the path is a directory.</param>
|
||||||
|
/// <param name="normalizePath">Whether to normalize backslashes to forward slashes (for Windows paths).</param>
|
||||||
|
/// <returns>True if the path should be ignored.</returns>
|
||||||
|
internal static bool CheckIgnoreRules(string path, string[] rules, bool isDirectory, bool normalizePath)
|
||||||
|
{
|
||||||
|
var ignore = new Ignore.Ignore();
|
||||||
|
|
||||||
|
// Add each rule individually to catch and skip invalid patterns
|
||||||
|
var validRulesAdded = 0;
|
||||||
|
foreach (var rule in rules)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ignore.Add(rule);
|
||||||
|
validRulesAdded++;
|
||||||
|
}
|
||||||
|
catch (RegexParseException)
|
||||||
|
{
|
||||||
|
// Ignore invalid patterns
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If no valid rules were added, fall back to ignoring everything (like an empty .ignore file)
|
||||||
|
if (validRulesAdded == 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Mitigate the problem of the Ignore library not handling Windows paths correctly.
|
||||||
|
// See https://github.com/jellyfin/jellyfin/issues/15484
|
||||||
|
var pathToCheck = normalizePath ? path.NormalizePath('/') : path;
|
||||||
|
|
||||||
|
// Add trailing slash for directories to match "folder/"
|
||||||
|
if (isDirectory)
|
||||||
|
{
|
||||||
|
pathToCheck = string.Concat(pathToCheck.AsSpan().TrimEnd('/'), "/");
|
||||||
|
}
|
||||||
|
|
||||||
|
return ignore.IsIgnored(pathToCheck);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static string GetFileContent(FileInfo ignoreFile)
|
||||||
|
{
|
||||||
|
ignoreFile = FileSystemHelper.ResolveLinkTarget(ignoreFile, returnFinalTarget: true) ?? ignoreFile;
|
||||||
|
return ignoreFile.Exists
|
||||||
|
? File.ReadAllText(ignoreFile.FullName)
|
||||||
|
: string.Empty;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using System.IO;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using MediaBrowser.Controller.Chapters;
|
||||||
using MediaBrowser.Controller.Entities;
|
using MediaBrowser.Controller.Entities;
|
||||||
using MediaBrowser.Controller.IO;
|
using MediaBrowser.Controller.IO;
|
||||||
using MediaBrowser.Controller.MediaSegments;
|
using MediaBrowser.Controller.MediaSegments;
|
||||||
@@ -20,6 +21,7 @@ public class ExternalDataManager : IExternalDataManager
|
|||||||
private readonly IMediaSegmentManager _mediaSegmentManager;
|
private readonly IMediaSegmentManager _mediaSegmentManager;
|
||||||
private readonly IPathManager _pathManager;
|
private readonly IPathManager _pathManager;
|
||||||
private readonly ITrickplayManager _trickplayManager;
|
private readonly ITrickplayManager _trickplayManager;
|
||||||
|
private readonly IChapterManager _chapterManager;
|
||||||
private readonly ILogger<ExternalDataManager> _logger;
|
private readonly ILogger<ExternalDataManager> _logger;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -29,18 +31,21 @@ public class ExternalDataManager : IExternalDataManager
|
|||||||
/// <param name="mediaSegmentManager">The media segment manager.</param>
|
/// <param name="mediaSegmentManager">The media segment manager.</param>
|
||||||
/// <param name="pathManager">The path manager.</param>
|
/// <param name="pathManager">The path manager.</param>
|
||||||
/// <param name="trickplayManager">The trickplay manager.</param>
|
/// <param name="trickplayManager">The trickplay manager.</param>
|
||||||
|
/// <param name="chapterManager">The chapter manager.</param>
|
||||||
/// <param name="logger">The logger.</param>
|
/// <param name="logger">The logger.</param>
|
||||||
public ExternalDataManager(
|
public ExternalDataManager(
|
||||||
IKeyframeManager keyframeManager,
|
IKeyframeManager keyframeManager,
|
||||||
IMediaSegmentManager mediaSegmentManager,
|
IMediaSegmentManager mediaSegmentManager,
|
||||||
IPathManager pathManager,
|
IPathManager pathManager,
|
||||||
ITrickplayManager trickplayManager,
|
ITrickplayManager trickplayManager,
|
||||||
|
IChapterManager chapterManager,
|
||||||
ILogger<ExternalDataManager> logger)
|
ILogger<ExternalDataManager> logger)
|
||||||
{
|
{
|
||||||
_keyframeManager = keyframeManager;
|
_keyframeManager = keyframeManager;
|
||||||
_mediaSegmentManager = mediaSegmentManager;
|
_mediaSegmentManager = mediaSegmentManager;
|
||||||
_pathManager = pathManager;
|
_pathManager = pathManager;
|
||||||
_trickplayManager = trickplayManager;
|
_trickplayManager = trickplayManager;
|
||||||
|
_chapterManager = chapterManager;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -67,5 +72,6 @@ public class ExternalDataManager : IExternalDataManager
|
|||||||
await _keyframeManager.DeleteKeyframeDataAsync(itemId, cancellationToken).ConfigureAwait(false);
|
await _keyframeManager.DeleteKeyframeDataAsync(itemId, cancellationToken).ConfigureAwait(false);
|
||||||
await _mediaSegmentManager.DeleteSegmentsAsync(itemId, cancellationToken).ConfigureAwait(false);
|
await _mediaSegmentManager.DeleteSegmentsAsync(itemId, cancellationToken).ConfigureAwait(false);
|
||||||
await _trickplayManager.DeleteTrickplayDataAsync(itemId, cancellationToken).ConfigureAwait(false);
|
await _trickplayManager.DeleteTrickplayDataAsync(itemId, cancellationToken).ConfigureAwait(false);
|
||||||
|
await _chapterManager.DeleteChapterDataAsync(itemId, cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,8 @@ namespace Emby.Server.Implementations.Library
|
|||||||
"**/.wd_tv",
|
"**/.wd_tv",
|
||||||
"**/lost+found/**",
|
"**/lost+found/**",
|
||||||
"**/lost+found",
|
"**/lost+found",
|
||||||
|
"**/subs/**",
|
||||||
|
"**/subs",
|
||||||
|
|
||||||
// Trickplay files
|
// Trickplay files
|
||||||
"**/*.trickplay",
|
"**/*.trickplay",
|
||||||
|
|||||||
@@ -327,6 +327,45 @@ namespace Emby.Server.Implementations.Library
|
|||||||
DeleteItem(item, options, parent, notifyParentItem);
|
DeleteItem(item, options, parent, notifyParentItem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void DeleteItemsUnsafeFast(IEnumerable<BaseItem> items)
|
||||||
|
{
|
||||||
|
var pathMaps = items.Select(e => (Item: e, InternalPath: GetInternalMetadataPaths(e), DeletePaths: e.GetDeletePaths())).ToArray();
|
||||||
|
|
||||||
|
foreach (var (item, internalPaths, pathsToDelete) in pathMaps)
|
||||||
|
{
|
||||||
|
foreach (var metadataPath in internalPaths)
|
||||||
|
{
|
||||||
|
if (!Directory.Exists(metadataPath))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogDebug(
|
||||||
|
"Deleting metadata path, Type: {Type}, Name: {Name}, Path: {Path}, Id: {Id}",
|
||||||
|
item.GetType().Name,
|
||||||
|
item.Name ?? "Unknown name",
|
||||||
|
metadataPath,
|
||||||
|
item.Id);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Directory.Delete(metadataPath, true);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Error deleting {MetadataPath}", metadataPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var fileSystemInfo in pathsToDelete)
|
||||||
|
{
|
||||||
|
DeleteItemPath(item, false, fileSystemInfo);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_itemRepository.DeleteItem([.. pathMaps.Select(f => f.Item.Id)]);
|
||||||
|
}
|
||||||
|
|
||||||
public void DeleteItem(BaseItem item, DeleteOptions options, BaseItem parent, bool notifyParentItem)
|
public void DeleteItem(BaseItem item, DeleteOptions options, BaseItem parent, bool notifyParentItem)
|
||||||
{
|
{
|
||||||
ArgumentNullException.ThrowIfNull(item);
|
ArgumentNullException.ThrowIfNull(item);
|
||||||
@@ -402,6 +441,32 @@ namespace Emby.Server.Implementations.Library
|
|||||||
var isRequiredForDelete = true;
|
var isRequiredForDelete = true;
|
||||||
|
|
||||||
foreach (var fileSystemInfo in item.GetDeletePaths())
|
foreach (var fileSystemInfo in item.GetDeletePaths())
|
||||||
|
{
|
||||||
|
DeleteItemPath(item, isRequiredForDelete, fileSystemInfo);
|
||||||
|
|
||||||
|
isRequiredForDelete = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
item.SetParent(null);
|
||||||
|
|
||||||
|
_itemRepository.DeleteItem([item.Id, .. children.Select(f => f.Id)]);
|
||||||
|
_cache.TryRemove(item.Id, out _);
|
||||||
|
foreach (var child in children)
|
||||||
|
{
|
||||||
|
_cache.TryRemove(child.Id, out _);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parent is Folder folder)
|
||||||
|
{
|
||||||
|
folder.Children = null;
|
||||||
|
folder.UserData = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReportItemRemoved(item, parent);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void DeleteItemPath(BaseItem item, bool isRequiredForDelete, FileSystemMetadata fileSystemInfo)
|
||||||
{
|
{
|
||||||
if (Directory.Exists(fileSystemInfo.FullName) || File.Exists(fileSystemInfo.FullName))
|
if (Directory.Exists(fileSystemInfo.FullName) || File.Exists(fileSystemInfo.FullName))
|
||||||
{
|
{
|
||||||
@@ -456,22 +521,6 @@ namespace Emby.Server.Implementations.Library
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
isRequiredForDelete = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
item.SetParent(null);
|
|
||||||
|
|
||||||
_itemRepository.DeleteItem(item.Id);
|
|
||||||
_cache.TryRemove(item.Id, out _);
|
|
||||||
foreach (var child in children)
|
|
||||||
{
|
|
||||||
_itemRepository.DeleteItem(child.Id);
|
|
||||||
_cache.TryRemove(child.Id, out _);
|
|
||||||
}
|
|
||||||
|
|
||||||
ReportItemRemoved(item, parent);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private bool IsInternalItem(BaseItem item)
|
private bool IsInternalItem(BaseItem item)
|
||||||
@@ -485,7 +534,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
{
|
{
|
||||||
Genre => _configurationManager.ApplicationPaths.GenrePath,
|
Genre => _configurationManager.ApplicationPaths.GenrePath,
|
||||||
MusicArtist => _configurationManager.ApplicationPaths.ArtistsPath,
|
MusicArtist => _configurationManager.ApplicationPaths.ArtistsPath,
|
||||||
MusicGenre => _configurationManager.ApplicationPaths.GenrePath,
|
MusicGenre => _configurationManager.ApplicationPaths.MusicGenrePath,
|
||||||
Person => _configurationManager.ApplicationPaths.PeoplePath,
|
Person => _configurationManager.ApplicationPaths.PeoplePath,
|
||||||
Studio => _configurationManager.ApplicationPaths.StudioPath,
|
Studio => _configurationManager.ApplicationPaths.StudioPath,
|
||||||
Year => _configurationManager.ApplicationPaths.YearPath,
|
Year => _configurationManager.ApplicationPaths.YearPath,
|
||||||
@@ -826,6 +875,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
|
|
||||||
if (!folder.ParentId.Equals(rootFolder.Id))
|
if (!folder.ParentId.Equals(rootFolder.Id))
|
||||||
{
|
{
|
||||||
|
rootFolder.UpdateToRepositoryAsync(ItemUpdateType.MetadataImport, CancellationToken.None).GetAwaiter().GetResult();
|
||||||
folder.ParentId = rootFolder.Id;
|
folder.ParentId = rootFolder.Id;
|
||||||
folder.UpdateToRepositoryAsync(ItemUpdateType.MetadataImport, CancellationToken.None).GetAwaiter().GetResult();
|
folder.UpdateToRepositoryAsync(ItemUpdateType.MetadataImport, CancellationToken.None).GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
@@ -989,6 +1039,11 @@ namespace Emby.Server.Implementations.Library
|
|||||||
return GetArtist(name, new DtoOptions(true));
|
return GetArtist(name, new DtoOptions(true));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IReadOnlyDictionary<string, MusicArtist[]> GetArtists(IReadOnlyList<string> names)
|
||||||
|
{
|
||||||
|
return _itemRepository.FindArtists(names);
|
||||||
|
}
|
||||||
|
|
||||||
public MusicArtist GetArtist(string name, DtoOptions options)
|
public MusicArtist GetArtist(string name, DtoOptions options)
|
||||||
{
|
{
|
||||||
return CreateItemByName<MusicArtist>(MusicArtist.GetPath, name, options);
|
return CreateItemByName<MusicArtist>(MusicArtist.GetPath, name, options);
|
||||||
@@ -1003,6 +1058,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
{
|
{
|
||||||
IncludeItemTypes = [BaseItemKind.MusicArtist],
|
IncludeItemTypes = [BaseItemKind.MusicArtist],
|
||||||
Name = name,
|
Name = name,
|
||||||
|
UseRawName = true,
|
||||||
DtoOptions = options
|
DtoOptions = options
|
||||||
}).Cast<MusicArtist>()
|
}).Cast<MusicArtist>()
|
||||||
.OrderBy(i => i.IsAccessedByName ? 1 : 0)
|
.OrderBy(i => i.IsAccessedByName ? 1 : 0)
|
||||||
@@ -1090,6 +1146,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
|
|
||||||
public async Task ValidateTopLibraryFolders(CancellationToken cancellationToken, bool removeRoot = false)
|
public async Task ValidateTopLibraryFolders(CancellationToken cancellationToken, bool removeRoot = false)
|
||||||
{
|
{
|
||||||
|
RootFolder.Children = null;
|
||||||
await RootFolder.RefreshMetadata(cancellationToken).ConfigureAwait(false);
|
await RootFolder.RefreshMetadata(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
// Start by just validating the children of the root, but go no further
|
// Start by just validating the children of the root, but go no further
|
||||||
@@ -1100,9 +1157,12 @@ namespace Emby.Server.Implementations.Library
|
|||||||
allowRemoveRoot: removeRoot,
|
allowRemoveRoot: removeRoot,
|
||||||
cancellationToken: cancellationToken).ConfigureAwait(false);
|
cancellationToken: cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
await GetUserRootFolder().RefreshMetadata(cancellationToken).ConfigureAwait(false);
|
var rootFolder = GetUserRootFolder();
|
||||||
|
rootFolder.Children = null;
|
||||||
|
|
||||||
await GetUserRootFolder().ValidateChildren(
|
await rootFolder.RefreshMetadata(cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
|
await rootFolder.ValidateChildren(
|
||||||
new Progress<double>(),
|
new Progress<double>(),
|
||||||
new MetadataRefreshOptions(new DirectoryService(_fileSystem)),
|
new MetadataRefreshOptions(new DirectoryService(_fileSystem)),
|
||||||
recursive: false,
|
recursive: false,
|
||||||
@@ -1110,18 +1170,24 @@ namespace Emby.Server.Implementations.Library
|
|||||||
cancellationToken: cancellationToken).ConfigureAwait(false);
|
cancellationToken: cancellationToken).ConfigureAwait(false);
|
||||||
|
|
||||||
// Quickly scan CollectionFolders for changes
|
// Quickly scan CollectionFolders for changes
|
||||||
foreach (var child in GetUserRootFolder().Children.OfType<Folder>())
|
var toDelete = new List<Guid>();
|
||||||
|
foreach (var child in rootFolder.Children!.OfType<Folder>())
|
||||||
{
|
{
|
||||||
// If the user has somehow deleted the collection directory, remove the metadata from the database.
|
// If the user has somehow deleted the collection directory, remove the metadata from the database.
|
||||||
if (child is CollectionFolder collectionFolder && !Directory.Exists(collectionFolder.Path))
|
if (child is CollectionFolder collectionFolder && !Directory.Exists(collectionFolder.Path))
|
||||||
{
|
{
|
||||||
_itemRepository.DeleteItem(collectionFolder.Id);
|
toDelete.Add(collectionFolder.Id);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
await child.RefreshMetadata(cancellationToken).ConfigureAwait(false);
|
await child.RefreshMetadata(cancellationToken).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (toDelete.Count > 0)
|
||||||
|
{
|
||||||
|
_itemRepository.DeleteItem(toDelete.ToArray());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task PerformLibraryValidation(IProgress<double> progress, CancellationToken cancellationToken)
|
private async Task PerformLibraryValidation(IProgress<double> progress, CancellationToken cancellationToken)
|
||||||
@@ -1389,6 +1455,25 @@ namespace Emby.Server.Implementations.Library
|
|||||||
return _itemRepository.GetCount(query);
|
return _itemRepository.GetCount(query);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ItemCounts GetItemCounts(InternalItemsQuery query)
|
||||||
|
{
|
||||||
|
if (query.Recursive && !query.ParentId.IsEmpty())
|
||||||
|
{
|
||||||
|
var parent = GetItemById(query.ParentId);
|
||||||
|
if (parent is not null)
|
||||||
|
{
|
||||||
|
SetTopParentIdsOrAncestors(query, [parent]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (query.User is not null)
|
||||||
|
{
|
||||||
|
AddUserToQuery(query, query.User);
|
||||||
|
}
|
||||||
|
|
||||||
|
return _itemRepository.GetItemCounts(query);
|
||||||
|
}
|
||||||
|
|
||||||
public IReadOnlyList<BaseItem> GetItemList(InternalItemsQuery query, List<BaseItem> parents)
|
public IReadOnlyList<BaseItem> GetItemList(InternalItemsQuery query, List<BaseItem> parents)
|
||||||
{
|
{
|
||||||
SetTopParentIdsOrAncestors(query, parents);
|
SetTopParentIdsOrAncestors(query, parents);
|
||||||
@@ -1915,6 +2000,12 @@ namespace Emby.Server.Implementations.Library
|
|||||||
RegisterItem(item);
|
RegisterItem(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (parent is Folder folder)
|
||||||
|
{
|
||||||
|
folder.Children = null;
|
||||||
|
folder.UserData = null;
|
||||||
|
}
|
||||||
|
|
||||||
if (ItemAdded is not null)
|
if (ItemAdded is not null)
|
||||||
{
|
{
|
||||||
foreach (var item in items)
|
foreach (var item in items)
|
||||||
@@ -1954,7 +2045,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
return _fileSystem.GetLastWriteTimeUtc(image.Path) != image.DateModified;
|
return image.DateModified.Subtract(_fileSystem.GetLastWriteTimeUtc(image.Path)).Duration().TotalSeconds > 1;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -2008,6 +2099,12 @@ namespace Emby.Server.Implementations.Library
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!File.Exists(image.Path))
|
||||||
|
{
|
||||||
|
_logger.LogWarning("Image not found at {ImagePath}", image.Path);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
ImageDimensions size;
|
ImageDimensions size;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -2025,7 +2122,8 @@ namespace Emby.Server.Implementations.Library
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
image.BlurHash = _imageProcessor.GetImageBlurHash(image.Path, size);
|
var blurhash = _imageProcessor.GetImageBlurHash(image.Path, size);
|
||||||
|
image.BlurHash = blurhash;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -2035,7 +2133,8 @@ namespace Emby.Server.Implementations.Library
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
image.DateModified = _fileSystem.GetLastWriteTimeUtc(image.Path);
|
var modifiedDate = _fileSystem.GetLastWriteTimeUtc(image.Path);
|
||||||
|
image.DateModified = modifiedDate;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
@@ -2043,18 +2142,31 @@ namespace Emby.Server.Implementations.Library
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
item.ValidateImages();
|
||||||
|
|
||||||
_itemRepository.SaveImages(item);
|
_itemRepository.SaveImages(item);
|
||||||
|
|
||||||
RegisterItem(item);
|
RegisterItem(item);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task UpdateItemsAsync(IReadOnlyList<BaseItem> items, BaseItem parent, ItemUpdateType updateReason, CancellationToken cancellationToken)
|
public async Task UpdateItemsAsync(IReadOnlyList<BaseItem> items, BaseItem parent, ItemUpdateType updateReason, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
_itemRepository.SaveItems(items, cancellationToken);
|
|
||||||
|
|
||||||
foreach (var item in items)
|
foreach (var item in items)
|
||||||
{
|
{
|
||||||
|
item.DateLastSaved = DateTime.UtcNow;
|
||||||
await RunMetadataSavers(item, updateReason).ConfigureAwait(false);
|
await RunMetadataSavers(item, updateReason).ConfigureAwait(false);
|
||||||
|
|
||||||
|
// Modify again, so saved value is after write time of externally saved metadata
|
||||||
|
item.DateLastSaved = DateTime.UtcNow;
|
||||||
|
}
|
||||||
|
|
||||||
|
_itemRepository.SaveItems(items, cancellationToken);
|
||||||
|
|
||||||
|
if (parent is Folder folder)
|
||||||
|
{
|
||||||
|
folder.Children = null;
|
||||||
|
folder.UserData = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ItemUpdated is not null)
|
if (ItemUpdated is not null)
|
||||||
@@ -2097,8 +2209,6 @@ namespace Emby.Server.Implementations.Library
|
|||||||
await ProviderManager.SaveMetadataAsync(item, updateReason).ConfigureAwait(false);
|
await ProviderManager.SaveMetadataAsync(item, updateReason).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
item.DateLastSaved = DateTime.UtcNow;
|
|
||||||
|
|
||||||
await UpdateImagesAsync(item, updateReason >= ItemUpdateType.ImageUpdate).ConfigureAwait(false);
|
await UpdateImagesAsync(item, updateReason >= ItemUpdateType.ImageUpdate).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2384,12 +2494,13 @@ namespace Emby.Server.Implementations.Library
|
|||||||
isNew = true;
|
isNew = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var refresh = isNew || DateTime.UtcNow - item.DateLastRefreshed >= _viewRefreshInterval;
|
var lastRefreshedUtc = item.DateLastRefreshed;
|
||||||
|
var refresh = isNew || DateTime.UtcNow - lastRefreshedUtc >= _viewRefreshInterval;
|
||||||
|
|
||||||
if (!refresh && !item.DisplayParentId.IsEmpty())
|
if (!refresh && !item.DisplayParentId.IsEmpty())
|
||||||
{
|
{
|
||||||
var displayParent = GetItemById(item.DisplayParentId);
|
var displayParent = GetItemById(item.DisplayParentId);
|
||||||
refresh = displayParent is not null && displayParent.DateLastSaved > item.DateLastRefreshed;
|
refresh = displayParent is not null && displayParent.DateLastSaved > lastRefreshedUtc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (refresh)
|
if (refresh)
|
||||||
@@ -2447,12 +2558,13 @@ namespace Emby.Server.Implementations.Library
|
|||||||
isNew = true;
|
isNew = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
var refresh = isNew || DateTime.UtcNow - item.DateLastRefreshed >= _viewRefreshInterval;
|
var lastRefreshedUtc = item.DateLastRefreshed;
|
||||||
|
var refresh = isNew || DateTime.UtcNow - lastRefreshedUtc >= _viewRefreshInterval;
|
||||||
|
|
||||||
if (!refresh && !item.DisplayParentId.IsEmpty())
|
if (!refresh && !item.DisplayParentId.IsEmpty())
|
||||||
{
|
{
|
||||||
var displayParent = GetItemById(item.DisplayParentId);
|
var displayParent = GetItemById(item.DisplayParentId);
|
||||||
refresh = displayParent is not null && displayParent.DateLastSaved > item.DateLastRefreshed;
|
refresh = displayParent is not null && displayParent.DateLastSaved > lastRefreshedUtc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (refresh)
|
if (refresh)
|
||||||
@@ -2522,12 +2634,13 @@ namespace Emby.Server.Implementations.Library
|
|||||||
item.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, CancellationToken.None).GetAwaiter().GetResult();
|
item.UpdateToRepositoryAsync(ItemUpdateType.MetadataEdit, CancellationToken.None).GetAwaiter().GetResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
var refresh = isNew || DateTime.UtcNow - item.DateLastRefreshed >= _viewRefreshInterval;
|
var lastRefreshedUtc = item.DateLastRefreshed;
|
||||||
|
var refresh = isNew || DateTime.UtcNow - lastRefreshedUtc >= _viewRefreshInterval;
|
||||||
|
|
||||||
if (!refresh && !item.DisplayParentId.IsEmpty())
|
if (!refresh && !item.DisplayParentId.IsEmpty())
|
||||||
{
|
{
|
||||||
var displayParent = GetItemById(item.DisplayParentId);
|
var displayParent = GetItemById(item.DisplayParentId);
|
||||||
refresh = displayParent is not null && displayParent.DateLastSaved > item.DateLastRefreshed;
|
refresh = displayParent is not null && displayParent.DateLastSaved > lastRefreshedUtc;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (refresh)
|
if (refresh)
|
||||||
@@ -2958,11 +3071,11 @@ namespace Emby.Server.Implementations.Library
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
|
||||||
if (refreshLibrary)
|
|
||||||
{
|
{
|
||||||
await ValidateTopLibraryFolders(CancellationToken.None).ConfigureAwait(false);
|
await ValidateTopLibraryFolders(CancellationToken.None).ConfigureAwait(false);
|
||||||
|
|
||||||
|
if (refreshLibrary)
|
||||||
|
{
|
||||||
StartScanInBackground();
|
StartScanInBackground();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -2991,13 +3104,12 @@ namespace Emby.Server.Implementations.Library
|
|||||||
{
|
{
|
||||||
var path = Person.GetPath(person.Name);
|
var path = Person.GetPath(person.Name);
|
||||||
var info = Directory.CreateDirectory(path);
|
var info = Directory.CreateDirectory(path);
|
||||||
var lastWriteTime = info.LastWriteTimeUtc;
|
|
||||||
personEntity = new Person()
|
personEntity = new Person()
|
||||||
{
|
{
|
||||||
Name = person.Name,
|
Name = person.Name,
|
||||||
Id = GetItemByNameId<Person>(path),
|
Id = GetItemByNameId<Person>(path),
|
||||||
DateCreated = info.CreationTimeUtc,
|
DateCreated = info.CreationTimeUtc,
|
||||||
DateModified = lastWriteTime,
|
DateModified = info.LastWriteTimeUtc,
|
||||||
Path = path
|
Path = path
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -3043,6 +3155,8 @@ namespace Emby.Server.Implementations.Library
|
|||||||
}
|
}
|
||||||
|
|
||||||
await RunMetadataSavers(personEntity, itemUpdateType).ConfigureAwait(false);
|
await RunMetadataSavers(personEntity, itemUpdateType).ConfigureAwait(false);
|
||||||
|
personEntity.DateLastSaved = DateTime.UtcNow;
|
||||||
|
|
||||||
CreateItems([personEntity], null, CancellationToken.None);
|
CreateItems([personEntity], null, CancellationToken.None);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -226,6 +226,11 @@ namespace Emby.Server.Implementations.Library
|
|||||||
/// <inheritdoc />>
|
/// <inheritdoc />>
|
||||||
public MediaProtocol GetPathProtocol(string path)
|
public MediaProtocol GetPathProtocol(string path)
|
||||||
{
|
{
|
||||||
|
if (string.IsNullOrEmpty(path))
|
||||||
|
{
|
||||||
|
return MediaProtocol.File;
|
||||||
|
}
|
||||||
|
|
||||||
if (path.StartsWith("Rtsp", StringComparison.OrdinalIgnoreCase))
|
if (path.StartsWith("Rtsp", StringComparison.OrdinalIgnoreCase))
|
||||||
{
|
{
|
||||||
return MediaProtocol.Rtsp;
|
return MediaProtocol.Rtsp;
|
||||||
@@ -379,7 +384,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
var culture = _localizationManager.FindLanguageInfo(language);
|
var culture = _localizationManager.FindLanguageInfo(language);
|
||||||
if (culture is not null)
|
if (culture is not null)
|
||||||
{
|
{
|
||||||
return culture.ThreeLetterISOLanguageNames;
|
return culture.Name.Contains('-', StringComparison.OrdinalIgnoreCase) ? [culture.Name] : culture.ThreeLetterISOLanguageNames;
|
||||||
}
|
}
|
||||||
|
|
||||||
return [language];
|
return [language];
|
||||||
@@ -657,7 +662,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
_logger.LogDebug(ex, "_jsonSerializer.DeserializeFromFile threw an exception.");
|
_logger.LogDebug(ex, "Error parsing cached media info.");
|
||||||
}
|
}
|
||||||
finally
|
finally
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ namespace Emby.Server.Implementations.Library
|
|||||||
|
|
||||||
public IReadOnlyList<BaseItem> GetInstantMixFromSong(Audio item, User? user, DtoOptions dtoOptions)
|
public IReadOnlyList<BaseItem> GetInstantMixFromSong(Audio item, User? user, DtoOptions dtoOptions)
|
||||||
{
|
{
|
||||||
return GetInstantMixFromGenres(item.Genres, user, dtoOptions);
|
var instantMixItems = GetInstantMixFromGenres(item.Genres, user, dtoOptions);
|
||||||
|
|
||||||
|
return [item, .. instantMixItems.Where(i => !i.Id.Equals(item.Id))];
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -45,11 +47,14 @@ namespace Emby.Server.Implementations.Library
|
|||||||
public IReadOnlyList<BaseItem> GetInstantMixFromFolder(Folder item, User? user, DtoOptions dtoOptions)
|
public IReadOnlyList<BaseItem> GetInstantMixFromFolder(Folder item, User? user, DtoOptions dtoOptions)
|
||||||
{
|
{
|
||||||
var genres = item
|
var genres = item
|
||||||
.GetRecursiveChildren(user, new InternalItemsQuery(user)
|
.GetRecursiveChildren(
|
||||||
|
user,
|
||||||
|
new InternalItemsQuery(user)
|
||||||
{
|
{
|
||||||
IncludeItemTypes = [BaseItemKind.Audio],
|
IncludeItemTypes = [BaseItemKind.Audio],
|
||||||
DtoOptions = dtoOptions
|
DtoOptions = dtoOptions
|
||||||
})
|
},
|
||||||
|
out _)
|
||||||
.Cast<Audio>()
|
.Cast<Audio>()
|
||||||
.SelectMany(i => i.Genres)
|
.SelectMany(i => i.Genres)
|
||||||
.Concat(item.Genres)
|
.Concat(item.Genres)
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
if (fileCreationDate is not null)
|
if (fileCreationDate is not null)
|
||||||
{
|
{
|
||||||
var dateCreated = fileCreationDate;
|
var dateCreated = fileCreationDate;
|
||||||
if (dateCreated.Equals(DateTime.MinValue))
|
if (dateCreated == DateTime.MinValue)
|
||||||
{
|
{
|
||||||
dateCreated = DateTime.UtcNow;
|
dateCreated = DateTime.UtcNow;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -369,13 +369,16 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
|
|||||||
// We need to only look at the name of this actual item (not parents)
|
// We need to only look at the name of this actual item (not parents)
|
||||||
var justName = item.IsInMixedFolder ? Path.GetFileName(item.Path.AsSpan()) : Path.GetFileName(item.ContainingFolderPath.AsSpan());
|
var justName = item.IsInMixedFolder ? Path.GetFileName(item.Path.AsSpan()) : Path.GetFileName(item.ContainingFolderPath.AsSpan());
|
||||||
|
|
||||||
if (!justName.IsEmpty)
|
|
||||||
{
|
|
||||||
// Check for TMDb id
|
|
||||||
var tmdbid = justName.GetAttributeValue("tmdbid");
|
var tmdbid = justName.GetAttributeValue("tmdbid");
|
||||||
item.TrySetProviderId(MetadataProvider.Tmdb, tmdbid);
|
|
||||||
|
// If not in a mixed folder and ID not found in folder path, check filename
|
||||||
|
if (string.IsNullOrEmpty(tmdbid) && !item.IsInMixedFolder)
|
||||||
|
{
|
||||||
|
tmdbid = Path.GetFileName(item.Path.AsSpan()).GetAttributeValue("tmdbid");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
item.TrySetProviderId(MetadataProvider.Tmdb, tmdbid);
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(item.Path))
|
if (!string.IsNullOrEmpty(item.Path))
|
||||||
{
|
{
|
||||||
// Check for IMDb id - we use full media path, as we can assume that this will match in any use case (whether id in parent dir or in file name)
|
// Check for IMDb id - we use full media path, as we can assume that this will match in any use case (whether id in parent dir or in file name)
|
||||||
@@ -405,6 +408,11 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
|
|||||||
|
|
||||||
if (child.IsDirectory)
|
if (child.IsDirectory)
|
||||||
{
|
{
|
||||||
|
if (NamingOptions.AllExtrasTypesFolderNames.ContainsKey(filename))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (IsDvdDirectory(child.FullName, filename, directoryService))
|
if (IsDvdDirectory(child.FullName, filename, directoryService))
|
||||||
{
|
{
|
||||||
var movie = new T
|
var movie = new T
|
||||||
|
|||||||
@@ -80,6 +80,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
var userId = user.InternalId;
|
var userId = user.InternalId;
|
||||||
var cacheKey = GetCacheKey(userId, item.Id);
|
var cacheKey = GetCacheKey(userId, item.Id);
|
||||||
_cache.AddOrUpdate(cacheKey, userData);
|
_cache.AddOrUpdate(cacheKey, userData);
|
||||||
|
item.UserData = dbContext.UserData.Where(e => e.ItemId == item.Id).AsNoTracking().ToArray(); // rehydrate the cached userdata
|
||||||
|
|
||||||
UserDataSaved?.Invoke(this, new UserDataSaveEventArgs
|
UserDataSaved?.Invoke(this, new UserDataSaveEventArgs
|
||||||
{
|
{
|
||||||
@@ -159,7 +160,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private UserItemData Map(UserData dto)
|
private static UserItemData Map(UserData dto)
|
||||||
{
|
{
|
||||||
return new UserItemData()
|
return new UserItemData()
|
||||||
{
|
{
|
||||||
@@ -237,7 +238,10 @@ namespace Emby.Server.Implementations.Library
|
|||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public UserItemData? GetUserData(User user, BaseItem item)
|
public UserItemData? GetUserData(User user, BaseItem item)
|
||||||
{
|
{
|
||||||
return GetUserData(user, item.Id, item.GetUserDataKeys());
|
return item.UserData?.Where(e => e.UserId.Equals(user.Id)).Select(Map).FirstOrDefault() ?? new UserItemData()
|
||||||
|
{
|
||||||
|
Key = item.GetUserDataKeys()[0],
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
@@ -304,7 +308,7 @@ namespace Emby.Server.Implementations.Library
|
|||||||
// ignore progress during the beginning
|
// ignore progress during the beginning
|
||||||
positionTicks = 0;
|
positionTicks = 0;
|
||||||
}
|
}
|
||||||
else if (pctIn > _config.Configuration.MaxResumePct || positionTicks >= runtimeTicks)
|
else if (pctIn > _config.Configuration.MaxResumePct || positionTicks >= (runtimeTicks - TimeSpan.TicksPerSecond))
|
||||||
{
|
{
|
||||||
// mark as completed close to the end
|
// mark as completed close to the end
|
||||||
positionTicks = 0;
|
positionTicks = 0;
|
||||||
|
|||||||
@@ -374,13 +374,22 @@ namespace Emby.Server.Implementations.Library
|
|||||||
|
|
||||||
if (request.GroupItems)
|
if (request.GroupItems)
|
||||||
{
|
{
|
||||||
if (parents.OfType<ICollectionFolder>().All(i => i.CollectionType == CollectionType.tvshows))
|
var collectionType = parents
|
||||||
|
.Select(parent => parent switch
|
||||||
|
{
|
||||||
|
ICollectionFolder collectionFolder => collectionFolder.CollectionType,
|
||||||
|
UserView userView => userView.CollectionType,
|
||||||
|
_ => null
|
||||||
|
})
|
||||||
|
.FirstOrDefault(type => type is not null);
|
||||||
|
|
||||||
|
if (collectionType == CollectionType.tvshows)
|
||||||
{
|
{
|
||||||
query.Limit = limit;
|
query.Limit = limit;
|
||||||
return _libraryManager.GetLatestItemList(query, parents, CollectionType.tvshows);
|
return _libraryManager.GetLatestItemList(query, parents, CollectionType.tvshows);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (parents.OfType<ICollectionFolder>().All(i => i.CollectionType == CollectionType.music))
|
if (collectionType == CollectionType.music)
|
||||||
{
|
{
|
||||||
query.Limit = limit;
|
query.Limit = limit;
|
||||||
return _libraryManager.GetLatestItemList(query, parents, CollectionType.music);
|
return _libraryManager.GetLatestItemList(query, parents, CollectionType.music);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Globalization;
|
using System.Linq;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Jellyfin.Data.Enums;
|
using Jellyfin.Data.Enums;
|
||||||
@@ -55,6 +55,8 @@ public class PeopleValidator
|
|||||||
|
|
||||||
var numPeople = people.Count;
|
var numPeople = people.Count;
|
||||||
|
|
||||||
|
IProgress<double> subProgress = new Progress<double>((val) => progress.Report(val / 2));
|
||||||
|
|
||||||
_logger.LogDebug("Will refresh {Amount} people", numPeople);
|
_logger.LogDebug("Will refresh {Amount} people", numPeople);
|
||||||
|
|
||||||
foreach (var person in people)
|
foreach (var person in people)
|
||||||
@@ -92,7 +94,7 @@ public class PeopleValidator
|
|||||||
double percent = numComplete;
|
double percent = numComplete;
|
||||||
percent /= numPeople;
|
percent /= numPeople;
|
||||||
|
|
||||||
progress.Report(100 * percent);
|
subProgress.Report(100 * percent);
|
||||||
}
|
}
|
||||||
|
|
||||||
var deadEntities = _libraryManager.GetItemList(new InternalItemsQuery
|
var deadEntities = _libraryManager.GetItemList(new InternalItemsQuery
|
||||||
@@ -102,17 +104,13 @@ public class PeopleValidator
|
|||||||
IsLocked = false
|
IsLocked = false
|
||||||
});
|
});
|
||||||
|
|
||||||
foreach (var item in deadEntities)
|
subProgress = new Progress<double>((val) => progress.Report((val / 2) + 50));
|
||||||
{
|
|
||||||
_logger.LogInformation("Deleting dead {ItemType} {ItemId} {ItemName}", item.GetType().Name, item.Id.ToString("N", CultureInfo.InvariantCulture), item.Name);
|
|
||||||
|
|
||||||
_libraryManager.DeleteItem(
|
var i = 0;
|
||||||
item,
|
foreach (var item in deadEntities.Chunk(500))
|
||||||
new DeleteOptions
|
|
||||||
{
|
{
|
||||||
DeleteFileLocation = false
|
_libraryManager.DeleteItemsUnsafeFast(item);
|
||||||
},
|
subProgress.Report(100f / deadEntities.Count * (i++ * 100));
|
||||||
false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
progress.Report(100);
|
progress.Report(100);
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskExtractMediaSegments": "فحص مقاطع الوسائط",
|
"TaskExtractMediaSegments": "فحص مقاطع الوسائط",
|
||||||
"TaskExtractMediaSegmentsDescription": "يستخرج مقاطع وسائط من إضافات MediaSegment المُفعّلة.",
|
"TaskExtractMediaSegmentsDescription": "يستخرج مقاطع وسائط من إضافات MediaSegment المُفعّلة.",
|
||||||
"TaskMoveTrickplayImages": "تغيير مكان صور المعاينة السريعة",
|
"TaskMoveTrickplayImages": "تغيير مكان صور المعاينة السريعة",
|
||||||
"TaskMoveTrickplayImagesDescription": "تُنقل ملفات التشغيل السريع الحالية بناءً على إعدادات المكتبة."
|
"TaskMoveTrickplayImagesDescription": "تُنقل ملفات التشغيل السريع الحالية بناءً على إعدادات المكتبة.",
|
||||||
|
"CleanupUserDataTask": "مهمة تنظيف بيانات المستخدم",
|
||||||
|
"CleanupUserDataTaskDescription": "مسح جميع بيانات المستخدم (حالة المشاهدة، والحالة المفضلة وما إلى ذلك) من الوسائط التي لم تعد موجودة لمدة 90 يومًا على الأقل."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
{
|
{
|
||||||
"Sync": "Сінхранізаваць",
|
"Sync": "Сінхранізаваць",
|
||||||
"Playlists": "Спісы прайгравання",
|
"Playlists": "Плэй-лісты",
|
||||||
"Latest": "Апошні",
|
"Latest": "Апошняе",
|
||||||
"LabelIpAddressValue": "IP-адрас: {0}",
|
"LabelIpAddressValue": "IP-адрас: {0}",
|
||||||
"ItemAddedWithName": "{0} быў дададзены ў бібліятэку",
|
"ItemAddedWithName": "{0} даданы ў бібліятэку",
|
||||||
"MessageApplicationUpdated": "Сервер Jellyfin абноўлены",
|
"MessageApplicationUpdated": "Сервер Jellyfin абноўлены",
|
||||||
"NotificationOptionApplicationUpdateInstalled": "Абнаўленне прыкладання ўсталявана",
|
"NotificationOptionApplicationUpdateInstalled": "Абнаўленне праграмы ўсталявана",
|
||||||
"PluginInstalledWithName": "{0} быў усталяваны",
|
"PluginInstalledWithName": "{0} быў усталяваны",
|
||||||
"UserCreatedWithName": "Карыстальнік {0} быў створаны",
|
"UserCreatedWithName": "Карыстальнік {0} быў створаны",
|
||||||
"Albums": "Альбомы",
|
"Albums": "Альбомы",
|
||||||
"Application": "Прыкладанне",
|
"Application": "Праграма",
|
||||||
"AuthenticationSucceededWithUserName": "{0} паспяхова аўтэнтыфікаваны",
|
"AuthenticationSucceededWithUserName": "{0} паспяхова аўтарызаваны",
|
||||||
"Channels": "Каналы",
|
"Channels": "Каналы",
|
||||||
"ChapterNameValue": "Раздзел {0}",
|
"ChapterNameValue": "Раздзел {0}",
|
||||||
"Collections": "Калекцыі",
|
"Collections": "Калекцыі",
|
||||||
@@ -29,18 +29,18 @@
|
|||||||
"HeaderAlbumArtists": "Выканаўцы альбома",
|
"HeaderAlbumArtists": "Выканаўцы альбома",
|
||||||
"LabelRunningTimeValue": "Працягласць: {0}",
|
"LabelRunningTimeValue": "Працягласць: {0}",
|
||||||
"HomeVideos": "Хатнія відэа",
|
"HomeVideos": "Хатнія відэа",
|
||||||
"ItemRemovedWithName": "{0} быў выдалены з бібліятэкі",
|
"ItemRemovedWithName": "{0} выдалены з бібліятэкі",
|
||||||
"MessageApplicationUpdatedTo": "Сервер Jellyfin абноўлены да {0}",
|
"MessageApplicationUpdatedTo": "Сервер Jellyfin абноўлены да версіі {0}",
|
||||||
"Movies": "Фільмы",
|
"Movies": "Фільмы",
|
||||||
"Music": "Музыка",
|
"Music": "Музыка",
|
||||||
"MusicVideos": "Музычныя кліпы",
|
"MusicVideos": "Музычныя кліпы",
|
||||||
"NameInstallFailed": "Устаноўка {0} не атрымалася",
|
"NameInstallFailed": "Усталяванне {0} не атрымалася",
|
||||||
"NameSeasonNumber": "Сезон {0}",
|
"NameSeasonNumber": "Сезон {0}",
|
||||||
"NotificationOptionApplicationUpdateAvailable": "Даступна абнаўленне прыкладання",
|
"NotificationOptionApplicationUpdateAvailable": "Даступна абнаўленне праграмы",
|
||||||
"NotificationOptionPluginInstalled": "Плагін усталяваны",
|
"NotificationOptionPluginInstalled": "Плагін усталяваны",
|
||||||
"NotificationOptionPluginUpdateInstalled": "Абнаўленне плагіна усталявана",
|
"NotificationOptionPluginUpdateInstalled": "Абнаўленне плагіна ўсталявана",
|
||||||
"NotificationOptionServerRestartRequired": "Патрабуецца перазапуск сервера",
|
"NotificationOptionServerRestartRequired": "Патрабуецца перазапуск сервера",
|
||||||
"Photos": "Фатаграфіі",
|
"Photos": "Фотаздымкі",
|
||||||
"Plugin": "Плагін",
|
"Plugin": "Плагін",
|
||||||
"PluginUninstalledWithName": "{0} быў выдалены",
|
"PluginUninstalledWithName": "{0} быў выдалены",
|
||||||
"PluginUpdatedWithName": "{0} быў абноўлены",
|
"PluginUpdatedWithName": "{0} быў абноўлены",
|
||||||
@@ -54,16 +54,16 @@
|
|||||||
"Artists": "Выканаўцы",
|
"Artists": "Выканаўцы",
|
||||||
"UserOfflineFromDevice": "{0} адлучыўся ад {1}",
|
"UserOfflineFromDevice": "{0} адлучыўся ад {1}",
|
||||||
"UserPolicyUpdatedWithName": "Палітыка карыстальніка абноўлена для {0}",
|
"UserPolicyUpdatedWithName": "Палітыка карыстальніка абноўлена для {0}",
|
||||||
"TaskCleanActivityLogDescription": "Выдаляе старэйшыя за зададзены ўзрост запісы ў журнале актыўнасці.",
|
"TaskCleanActivityLogDescription": "Выдаляе запісы старэйшыя за зададзены ўзрост ў журнале актыўнасці.",
|
||||||
"TaskRefreshChapterImagesDescription": "Стварае мініяцюры для відэа, якія маюць раздзелы.",
|
"TaskRefreshChapterImagesDescription": "Стварае мініяцюры для відэа, якія маюць раздзелы.",
|
||||||
"TaskCleanLogsDescription": "Выдаляе файлы журналу, якім больш за {0} дзён.",
|
"TaskCleanLogsDescription": "Выдаляе файлы журналу, якім больш за {0} дзён.",
|
||||||
"TaskUpdatePluginsDescription": "Спампоўвае і ўсталёўвае абнаўленні для плагінаў, якія настроены на аўтаматычнае абнаўленне.",
|
"TaskUpdatePluginsDescription": "Спампоўвае і ўсталёўвае абнаўленні для плагінаў, якія сканфігураваныя на аўтаматычнае абнаўленне.",
|
||||||
"TaskRefreshChannelsDescription": "Абнаўляе інфармацыю аб інтэрнэт-канале.",
|
"TaskRefreshChannelsDescription": "Абнаўляе інфармацыю аб інтэрнэт-канале.",
|
||||||
"TaskDownloadMissingSubtitlesDescription": "Шукае ў інтэрнэце адсутныя субтытры на аснове канфігурацыі метададзеных.",
|
"TaskDownloadMissingSubtitlesDescription": "Шукае ў інтэрнэце адсутныя субцітры на аснове канфігурацыі метададзеных.",
|
||||||
"TaskOptimizeDatabaseDescription": "Ушчыльняе базу дадзеных і скарачае вольную прастору. Выкананне гэтай задачы пасля сканавання бібліятэкі або ўнясення іншых змяненняў, якія прадугледжваюць мадыфікацыю базы дадзеных, можа палепшыць прадукцыйнасць.",
|
"TaskOptimizeDatabaseDescription": "Ушчыльняе базу дадзеных і скарачае вольную прастору. Выкананне гэтай задачы пасля сканавання бібліятэкі або ўнясення іншых зменаў, якія прадугледжваюць мадыфікацыю базы дадзеных, можа палепшыць выдайнасць.",
|
||||||
"TaskKeyframeExtractor": "Экстрактар ключавых кадраў",
|
"TaskKeyframeExtractor": "Экстрактар ключавых кадраў",
|
||||||
"TasksApplicationCategory": "Прыкладанне",
|
"TasksApplicationCategory": "Праграма",
|
||||||
"AppDeviceValues": "Прыкладанне: {0}, Прылада: {1}",
|
"AppDeviceValues": "Праграма: {0}, Прылада: {1}",
|
||||||
"Books": "Кнігі",
|
"Books": "Кнігі",
|
||||||
"CameraImageUploadedFrom": "Новая выява камеры была загружана з {0}",
|
"CameraImageUploadedFrom": "Новая выява камеры была загружана з {0}",
|
||||||
"DeviceOfflineWithName": "{0} адлучыўся",
|
"DeviceOfflineWithName": "{0} адлучыўся",
|
||||||
@@ -74,7 +74,7 @@
|
|||||||
"HeaderFavoriteArtists": "Абраныя выканаўцы",
|
"HeaderFavoriteArtists": "Абраныя выканаўцы",
|
||||||
"HearingImpaired": "Са слабым слыхам",
|
"HearingImpaired": "Са слабым слыхам",
|
||||||
"Inherit": "Атрымаць у спадчыну",
|
"Inherit": "Атрымаць у спадчыну",
|
||||||
"MessageNamedServerConfigurationUpdatedWithValue": "Канфігурацыя сервера {0} абноўлена",
|
"MessageNamedServerConfigurationUpdatedWithValue": "Канфігурацыя сервера (секцыя {0}) абноўлена",
|
||||||
"MessageServerConfigurationUpdated": "Канфігурацыя сервера абноўлена",
|
"MessageServerConfigurationUpdated": "Канфігурацыя сервера абноўлена",
|
||||||
"MixedContent": "Змешаны змест",
|
"MixedContent": "Змешаны змест",
|
||||||
"NameSeasonUnknown": "Невядомы сезон",
|
"NameSeasonUnknown": "Невядомы сезон",
|
||||||
@@ -92,48 +92,50 @@
|
|||||||
"NotificationOptionVideoPlaybackStopped": "Прайграванне відэа спынена",
|
"NotificationOptionVideoPlaybackStopped": "Прайграванне відэа спынена",
|
||||||
"ScheduledTaskFailedWithName": "{0} не атрымалася",
|
"ScheduledTaskFailedWithName": "{0} не атрымалася",
|
||||||
"ScheduledTaskStartedWithName": "{0} пачалося",
|
"ScheduledTaskStartedWithName": "{0} пачалося",
|
||||||
"ServerNameNeedsToBeRestarted": "{0} трэба перазапусціць",
|
"ServerNameNeedsToBeRestarted": "{0} патрабуе перазапуску",
|
||||||
"Shows": "Шоу",
|
"Shows": "Шоу",
|
||||||
"StartupEmbyServerIsLoading": "Jellyfin Server загружаецца. Калі ласка, паўтарыце спробу крыху пазней.",
|
"StartupEmbyServerIsLoading": "Jellyfin Server загружаецца. Калі ласка, паўтарыце спробу крыху пазней.",
|
||||||
"SubtitleDownloadFailureFromForItem": "Не атрымалася спампаваць субтытры з {0} для {1}",
|
"SubtitleDownloadFailureFromForItem": "Не атрымалася спампаваць субтытры з {0} для {1}",
|
||||||
"TvShows": "ТБ-шоу",
|
"TvShows": "Тэлепраграма",
|
||||||
"Undefined": "Нявызначана",
|
"Undefined": "Нявызначана",
|
||||||
"UserLockedOutWithName": "Карыстальнік {0} быў заблакіраваны",
|
"UserLockedOutWithName": "Карыстальнік {0} быў заблакіраваны",
|
||||||
"UserOnlineFromDevice": "{0} падключаны з {1}",
|
"UserOnlineFromDevice": "{0} падключаны з {1}",
|
||||||
"UserPasswordChangedWithName": "Пароль быў зменены для карыстальніка {0}",
|
"UserPasswordChangedWithName": "Пароль быў зменены для карыстальніка {0}",
|
||||||
"UserStartedPlayingItemWithValues": "{0} грае {1} на {2}",
|
"UserStartedPlayingItemWithValues": "{0} прайграваецца {1} на {2}",
|
||||||
"UserStoppedPlayingItemWithValues": "{0} скончыў прайграванне {1} на {2}",
|
"UserStoppedPlayingItemWithValues": "{0} скончыў прайграванне {1} на {2}",
|
||||||
"ValueHasBeenAddedToLibrary": "{0} быў дададзены ў вашу медыятэку",
|
"ValueHasBeenAddedToLibrary": "{0} быў дададзены ў вашу медыятэку",
|
||||||
"ValueSpecialEpisodeName": "Спецэпізод - {0}",
|
"ValueSpecialEpisodeName": "Спецэпізод - {0}",
|
||||||
"VersionNumber": "Версія {0}",
|
"VersionNumber": "Версія {0}",
|
||||||
"TasksMaintenanceCategory": "Абслугоўванне",
|
"TasksMaintenanceCategory": "Абслугоўванне",
|
||||||
"TasksLibraryCategory": "Медыятэка",
|
"TasksLibraryCategory": "Бібліятэка",
|
||||||
"TasksChannelsCategory": "Інтэрнэт-каналы",
|
"TasksChannelsCategory": "Інтэрнэт-каналы",
|
||||||
"TaskCleanActivityLog": "Ачысціць журнал актыўнасці",
|
"TaskCleanActivityLog": "Ачысціць журнал актыўнасці",
|
||||||
"TaskCleanCache": "Ачысціць кэш",
|
"TaskCleanCache": "Ачысціць кэш",
|
||||||
"TaskCleanCacheDescription": "Выдаляе файлы кэша, якія больш не патрэбныя сістэме.",
|
"TaskCleanCacheDescription": "Выдаляе файлы кэша, якія больш не патрэбныя сістэме.",
|
||||||
"TaskRefreshChapterImages": "Выняць выявы раздзелаў",
|
"TaskRefreshChapterImages": "Вынуць выявы раздзелаў",
|
||||||
"TaskRefreshLibrary": "Сканіраваць медыятэку",
|
"TaskRefreshLibrary": "Сканаваць бібліятэку",
|
||||||
"TaskRefreshLibraryDescription": "Сканіруе вашу медыятэку на наяўнасць новых файлаў і абнаўляе метададзеныя.",
|
"TaskRefreshLibraryDescription": "Скануе вашу медыятэку на наяўнасць новых файлаў і абнаўляе метададзеныя.",
|
||||||
"TaskCleanLogs": "Ачысціць часопіс",
|
"TaskCleanLogs": "Ачысціць журнал",
|
||||||
"TaskRefreshPeople": "Абнавіць людзей",
|
"TaskRefreshPeople": "Абнавіць выканаўцаў",
|
||||||
"TaskRefreshPeopleDescription": "Абнаўленне метаданых для акцёраў і рэжысёраў у вашай медыятэцы.",
|
"TaskRefreshPeopleDescription": "Абнаўленне метаданых для акцёраў і рэжысёраў у вашай медыятэцы.",
|
||||||
"TaskUpdatePlugins": "Абнавіць плагіны",
|
"TaskUpdatePlugins": "Абнавіць плагіны",
|
||||||
"TaskCleanTranscode": "Ачысціць каталог перакадзіравання",
|
"TaskCleanTranscode": "Ачысціць каталог перакадзіравання",
|
||||||
"TaskCleanTranscodeDescription": "Выдаляе перакадзіраваныя файлы, старэйшыя за адзін дзень.",
|
"TaskCleanTranscodeDescription": "Выдаляе перакадзіраваныя файлы, старэйшыя за адзін дзень.",
|
||||||
"TaskRefreshChannels": "Абнавіць каналы",
|
"TaskRefreshChannels": "Абнавіць каналы",
|
||||||
"TaskDownloadMissingSubtitles": "Спампаваць адсутныя субтытры",
|
"TaskDownloadMissingSubtitles": "Спампаваць адсутныя субцітры",
|
||||||
"TaskKeyframeExtractorDescription": "Выдае ключавыя кадры з відэафайлаў для стварэння больш дакладных спісаў прайгравання HLS. Гэта задача можа працаваць у працягу доўгага часу.",
|
"TaskKeyframeExtractorDescription": "Выдае ключавыя кадры з відэафайлаў для стварэння больш дакладных плэй-лістоў HLS. Гэта задача можа працягнуцца шмат часу.",
|
||||||
"TaskRefreshTrickplayImages": "Стварыце выявы Trickplay",
|
"TaskRefreshTrickplayImages": "Стварыць выявы Trickplay",
|
||||||
"TaskRefreshTrickplayImagesDescription": "Стварае прагляд відэаролікаў для Trickplay у падключаных бібліятэках.",
|
"TaskRefreshTrickplayImagesDescription": "Стварае перадпрагляды відэаролікаў для Trickplay у падключаных бібліятэках.",
|
||||||
"TaskCleanCollectionsAndPlaylists": "Ачысціце калекцыі і спісы прайгравання",
|
"TaskCleanCollectionsAndPlaylists": "Ачысціце калекцыі і плэй-лісты",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "Выдаляе элементы з калекцый і спісаў прайгравання, якія больш не існуюць.",
|
"TaskCleanCollectionsAndPlaylistsDescription": "Выдаляе элементы з калекцый і плэй-лістоў, якія больш не існуюць.",
|
||||||
"TaskAudioNormalizationDescription": "Сканіруе файлы на прадмет нармалізацыі гуку.",
|
"TaskAudioNormalizationDescription": "Скануе файлы на прадмет нармалізацыі гуку.",
|
||||||
"TaskAudioNormalization": "Нармалізацыя гуку",
|
"TaskAudioNormalization": "Нармалізацыя гуку",
|
||||||
"TaskExtractMediaSegmentsDescription": "Выдае або атрымлівае медыясегменты з убудоў з падтрымкай MediaSegment.",
|
"TaskExtractMediaSegmentsDescription": "Выдае або атрымлівае медыясегменты з убудоў з падтрымкай MediaSegment.",
|
||||||
"TaskMoveTrickplayImagesDescription": "Перамяшчае існуючыя файлы trickplay у адпаведнасці з наладамі бібліятэкі.",
|
"TaskMoveTrickplayImagesDescription": "Перамяшчае існуючыя файлы trickplay у адпаведнасці з наладамі бібліятэкі.",
|
||||||
"TaskDownloadMissingLyrics": "Спампаваць зніклыя тэксты песень",
|
"TaskDownloadMissingLyrics": "Спампаваць адсутныя тэксты песняў",
|
||||||
"TaskDownloadMissingLyricsDescription": "Спампоўвае тэксты для песень",
|
"TaskDownloadMissingLyricsDescription": "Спампоўвае тэксты для песняў",
|
||||||
"TaskExtractMediaSegments": "Сканіраванне медыя-сегмента",
|
"TaskExtractMediaSegments": "Сканіраванне медыя-сегмента",
|
||||||
"TaskMoveTrickplayImages": "Перанесці месцазнаходжанне выявы Trickplay"
|
"TaskMoveTrickplayImages": "Перанесці месцазнаходжанне выявы Trickplay",
|
||||||
|
"CleanupUserDataTask": "Задача па ачыстцы дадзеных карыстальніка",
|
||||||
|
"CleanupUserDataTaskDescription": "Ачысьціць усе дадзеныя карыстальніка (стан прагляду, абранае і г.д.) для медыяфайлаў, што адсутнічаюць больш за 90 дзён."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskExtractMediaSegmentsDescription": "Изважда медиини сегменти от MediaSegment плъгини.",
|
"TaskExtractMediaSegmentsDescription": "Изважда медиини сегменти от MediaSegment плъгини.",
|
||||||
"TaskMoveTrickplayImages": "Мигриране на Локацията за Trickplay изображения",
|
"TaskMoveTrickplayImages": "Мигриране на Локацията за Trickplay изображения",
|
||||||
"TaskMoveTrickplayImagesDescription": "Премества съществуващите trickplay изображения спрямо настройките на библиотеката.",
|
"TaskMoveTrickplayImagesDescription": "Премества съществуващите trickplay изображения спрямо настройките на библиотеката.",
|
||||||
"TaskExtractMediaSegments": "Сканиране за сегменти"
|
"TaskExtractMediaSegments": "Сканиране за сегменти",
|
||||||
|
"CleanupUserDataTask": "Задача за почистване на потребителски данни",
|
||||||
|
"CleanupUserDataTaskDescription": "Почиства всички потребителски данни (статус на гледане, любими и т.н.) от медия, която вече не е налична от поне 90 дни."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,29 +6,29 @@
|
|||||||
"Channels": "চ্যানেলসমূহ",
|
"Channels": "চ্যানেলসমূহ",
|
||||||
"CameraImageUploadedFrom": "{0} থেকে একটি নতুন ক্যামেরার চিত্র আপলোড করা হয়েছে",
|
"CameraImageUploadedFrom": "{0} থেকে একটি নতুন ক্যামেরার চিত্র আপলোড করা হয়েছে",
|
||||||
"Books": "পুস্তকসমূহ",
|
"Books": "পুস্তকসমূহ",
|
||||||
"AuthenticationSucceededWithUserName": "{0} অনুমোদন সফল",
|
"AuthenticationSucceededWithUserName": "{0} সফলভাবে অথেন্টিকেট করেছেন",
|
||||||
"Artists": "শিল্পীগণ",
|
"Artists": "শিল্পীগণ",
|
||||||
"Application": "অ্যাপ্লিকেশন",
|
"Application": "অ্যাপ্লিকেশন",
|
||||||
"Albums": "অ্যালবামসমূহ",
|
"Albums": "অ্যালবামসমূহ",
|
||||||
"HeaderFavoriteEpisodes": "প্রিব পর্বগুলো",
|
"HeaderFavoriteEpisodes": "প্রিয় পর্বগুলো",
|
||||||
"HeaderFavoriteArtists": "প্রিয় শিল্পীরা",
|
"HeaderFavoriteArtists": "প্রিয় শিল্পীরা",
|
||||||
"HeaderFavoriteAlbums": "প্রিয় এলবামগুলো",
|
"HeaderFavoriteAlbums": "প্রিয় এলবামগুলো",
|
||||||
"HeaderContinueWatching": "দেখতে থাকুন",
|
"HeaderContinueWatching": "দেখতে থাকুন",
|
||||||
"HeaderAlbumArtists": "অ্যালবাম শিল্পীবৃন্দ",
|
"HeaderAlbumArtists": "অ্যালবাম শিল্পীবৃন্দ",
|
||||||
"Genres": "শৈলীধারাসমূহ",
|
"Genres": "ধরণ",
|
||||||
"Folders": "ফোল্ডারসমূহ",
|
"Folders": "ফোল্ডারসমূহ",
|
||||||
"Favorites": "পছন্দসমূহ",
|
"Favorites": "পছন্দসমূহ",
|
||||||
"FailedLoginAttemptWithUserName": "{0} লগিন করতে ব্যর্থ হয়েছে",
|
"FailedLoginAttemptWithUserName": "{0} লগিন করতে ব্যর্থ হয়েছে",
|
||||||
"AppDeviceValues": "অ্যাপ: {0}, ডিভাইস: {0}",
|
"AppDeviceValues": "অ্যাপ: {0}, ডিভাইস: {1}",
|
||||||
"VersionNumber": "সংস্করণ {0}",
|
"VersionNumber": "সংস্করণ {0}",
|
||||||
"ValueSpecialEpisodeName": "বিশেষ পর্ব - {0}",
|
"ValueSpecialEpisodeName": "বিশেষ পর্ব - {0}",
|
||||||
"ValueHasBeenAddedToLibrary": "আপনার লাইব্রেরিতে {0} যোগ করা হয়েছে",
|
"ValueHasBeenAddedToLibrary": "আপনার লাইব্রেরিতে {0} যোগ করা হয়েছে",
|
||||||
"UserStoppedPlayingItemWithValues": "{2}তে {1} বাজানো শেষ করেছেন {0}",
|
"UserStoppedPlayingItemWithValues": "{2}তে {1} প্লে শেষ করেছেন {0}",
|
||||||
"UserStartedPlayingItemWithValues": "{2}তে {1} বাজাচ্ছেন {0}",
|
"UserStartedPlayingItemWithValues": "{2}তে {1} প্লে করেছেন {0}",
|
||||||
"UserPolicyUpdatedWithName": "{0} এর জন্য ব্যবহার নীতি আপডেট করা হয়েছে",
|
"UserPolicyUpdatedWithName": "{0} এর জন্য ব্যবহার নীতি আপডেট করা হয়েছে",
|
||||||
"UserPasswordChangedWithName": "ব্যবহারকারী {0} এর পাসওয়ার্ড পরিবর্তিত হয়েছে",
|
"UserPasswordChangedWithName": "ব্যবহারকারী {0} এর পাসওয়ার্ড পরিবর্তিত হয়েছে",
|
||||||
"UserOnlineFromDevice": "{0}, {1} থেকে অনলাইন",
|
"UserOnlineFromDevice": "{0}, {1} থেকে অনলাইন আছে",
|
||||||
"UserOfflineFromDevice": "{0} {1} থেকে বিযুক্ত হয়ে গেছে",
|
"UserOfflineFromDevice": "{0} {1} থেকে বিচ্ছিন্ন হয়ে গেছে",
|
||||||
"UserLockedOutWithName": "ব্যবহারকারী {0} ঢুকতে পারছে না",
|
"UserLockedOutWithName": "ব্যবহারকারী {0} ঢুকতে পারছে না",
|
||||||
"UserDownloadingItemWithValues": "{0}, {1} ডাউনলোড করছে",
|
"UserDownloadingItemWithValues": "{0}, {1} ডাউনলোড করছে",
|
||||||
"UserDeletedWithName": "ব্যবহারকারী {0}কে বাদ দেয়া হয়েছে",
|
"UserDeletedWithName": "ব্যবহারকারী {0}কে বাদ দেয়া হয়েছে",
|
||||||
@@ -36,28 +36,28 @@
|
|||||||
"User": "ব্যবহারকারী",
|
"User": "ব্যবহারকারী",
|
||||||
"TvShows": "টিভি শোগুলো",
|
"TvShows": "টিভি শোগুলো",
|
||||||
"System": "সিস্টেম",
|
"System": "সিস্টেম",
|
||||||
"Sync": "সমলয় স্থাপন",
|
"Sync": "সমন্বয় করুন",
|
||||||
"SubtitleDownloadFailureFromForItem": "{2} থেকে {1} এর জন্য সাবটাইটেল ডাউনলোড ব্যর্থ",
|
"SubtitleDownloadFailureFromForItem": "{0} থেকে {1} এর জন্য সাবটাইটেল ডাউনলোড ব্যর্থ হয়েছে",
|
||||||
"StartupEmbyServerIsLoading": "জেলিফিন সার্ভার লোড হচ্ছে। দয়া করে একটু পরে আবার চেষ্টা করুন।",
|
"StartupEmbyServerIsLoading": "জেলিফিন সার্ভার লোড হচ্ছে। দয়া করে একটু পরে আবার চেষ্টা করুন।",
|
||||||
"Songs": "সঙ্গীতসমূহ",
|
"Songs": "সঙ্গীত সমূহ",
|
||||||
"Shows": "টিভি পর্ব",
|
"Shows": "শো সমূহ",
|
||||||
"ServerNameNeedsToBeRestarted": "{0} রিস্টার্ট করা প্রয়োজন",
|
"ServerNameNeedsToBeRestarted": "{0} রিস্টার্ট করা প্রয়োজন",
|
||||||
"ScheduledTaskStartedWithName": "{0} শুরু হয়েছে",
|
"ScheduledTaskStartedWithName": "{0} শুরু হয়েছে",
|
||||||
"ScheduledTaskFailedWithName": "{0} ব্যর্থ",
|
"ScheduledTaskFailedWithName": "{0} ব্যর্থ",
|
||||||
"ProviderValue": "প্রদানকারী: {0}",
|
"ProviderValue": "প্রদানকারী: {0}",
|
||||||
"PluginUpdatedWithName": "{0} আপডেট করা হয়েছে",
|
"PluginUpdatedWithName": "{0} আপডেট করা হয়েছে",
|
||||||
"PluginUninstalledWithName": "{0} বাদ দেয়া হয়েছে",
|
"PluginUninstalledWithName": "{0} আনইন্সটল হয়েছে",
|
||||||
"PluginInstalledWithName": "{0} ইন্সটল করা হয়েছে",
|
"PluginInstalledWithName": "{0} ইন্সটল হয়েছে",
|
||||||
"Plugin": "প্লাগিন",
|
"Plugin": "প্লাগিন",
|
||||||
"Playlists": "প্লে লিস্ট সমূহ",
|
"Playlists": "প্লে লিস্ট সমূহ",
|
||||||
"Photos": "চিত্রসমূহ",
|
"Photos": "ছবিসমূহ",
|
||||||
"NotificationOptionVideoPlaybackStopped": "ভিডিও চলা বন্ধ",
|
"NotificationOptionVideoPlaybackStopped": "ভিডিও প্লেব্যাক বন্ধ হয়েছে",
|
||||||
"NotificationOptionVideoPlayback": "ভিডিও চলা শুরু হয়েছে",
|
"NotificationOptionVideoPlayback": "ভিডিও প্লেব্যাক শুরু হয়েছে",
|
||||||
"NotificationOptionUserLockedOut": "ব্যবহারকারী ঢুকতে পারছে না",
|
"NotificationOptionUserLockedOut": "ব্যবহারকারী লক আউট হয়েছে",
|
||||||
"NotificationOptionTaskFailed": "পরিকল্পিত কাজটি ব্যর্থ",
|
"NotificationOptionTaskFailed": "পরিকল্পিত কাজটি ব্যর্থ",
|
||||||
"NotificationOptionServerRestartRequired": "সার্ভার রিস্টার্ট বাধ্যতামূলক",
|
"NotificationOptionServerRestartRequired": "সার্ভার রিস্টার্ট করা লাগবে",
|
||||||
"NotificationOptionPluginUpdateInstalled": "প্লাগিন আপডেট ইন্সটল করা হয়েছে",
|
"NotificationOptionPluginUpdateInstalled": "প্লাগিন আপডেট ইন্সটল হয়েছে",
|
||||||
"NotificationOptionPluginUninstalled": "প্লাগিন বাদ দেয়া হয়েছে",
|
"NotificationOptionPluginUninstalled": "প্লাগিন আনইনষ্টল হয়েছে",
|
||||||
"NotificationOptionPluginInstalled": "প্লাগিন ইন্সটল করা হয়েছে",
|
"NotificationOptionPluginInstalled": "প্লাগিন ইন্সটল করা হয়েছে",
|
||||||
"NotificationOptionPluginError": "প্লাগিন ব্যর্থ",
|
"NotificationOptionPluginError": "প্লাগিন ব্যর্থ",
|
||||||
"NotificationOptionNewLibraryContent": "নতুন কন্টেন্ট যোগ করা হয়েছে",
|
"NotificationOptionNewLibraryContent": "নতুন কন্টেন্ট যোগ করা হয়েছে",
|
||||||
@@ -76,8 +76,8 @@
|
|||||||
"Movies": "চলচ্চিত্রসমূহ",
|
"Movies": "চলচ্চিত্রসমূহ",
|
||||||
"MixedContent": "মিশ্র কন্টেন্ট",
|
"MixedContent": "মিশ্র কন্টেন্ট",
|
||||||
"MessageServerConfigurationUpdated": "সার্ভারের কনফিগারেশন আপডেট করা হয়েছে",
|
"MessageServerConfigurationUpdated": "সার্ভারের কনফিগারেশন আপডেট করা হয়েছে",
|
||||||
"HeaderRecordingGroups": "রেকর্ডিং দল",
|
"HeaderRecordingGroups": "রেকর্ডিং গ্রুপগুলো",
|
||||||
"MessageNamedServerConfigurationUpdatedWithValue": "সার্ভারের {0} কনফিগারেসনের অংশ আপডেট করা হয়েছে",
|
"MessageNamedServerConfigurationUpdatedWithValue": "সার্ভার কনফিগারেশন সেকশন {0} আপডেট করা হয়েছে",
|
||||||
"MessageApplicationUpdatedTo": "জেলিফিন সার্ভার {0} তে আপডেট করা হয়েছে",
|
"MessageApplicationUpdatedTo": "জেলিফিন সার্ভার {0} তে আপডেট করা হয়েছে",
|
||||||
"MessageApplicationUpdated": "জেলিফিন সার্ভার আপডেট করা হয়েছে",
|
"MessageApplicationUpdated": "জেলিফিন সার্ভার আপডেট করা হয়েছে",
|
||||||
"Latest": "সর্বশেষ",
|
"Latest": "সর্বশেষ",
|
||||||
@@ -85,51 +85,57 @@
|
|||||||
"LabelIpAddressValue": "আইপি এড্রেস: {0}",
|
"LabelIpAddressValue": "আইপি এড্রেস: {0}",
|
||||||
"ItemRemovedWithName": "{0} লাইব্রেরি থেকে বাদ দেয়া হয়েছে",
|
"ItemRemovedWithName": "{0} লাইব্রেরি থেকে বাদ দেয়া হয়েছে",
|
||||||
"ItemAddedWithName": "{0} লাইব্রেরিতে যোগ করা হয়েছে",
|
"ItemAddedWithName": "{0} লাইব্রেরিতে যোগ করা হয়েছে",
|
||||||
"Inherit": "থেকে পাওয়া",
|
"Inherit": "উত্তরাধিকারসূত্র থেকে গ্রহণ করুন",
|
||||||
"HomeVideos": "হোম ভিডিও",
|
"HomeVideos": "হোম ভিডিও",
|
||||||
"HeaderNextUp": "এরপরে আসছে",
|
"HeaderNextUp": "এরপরে আসছে",
|
||||||
"HeaderLiveTV": "লাইভ টিভি",
|
"HeaderLiveTV": "লাইভ টিভি",
|
||||||
"HeaderFavoriteSongs": "প্রিয় গানগুলো",
|
"HeaderFavoriteSongs": "প্রিয় গানগুলো",
|
||||||
"HeaderFavoriteShows": "প্রিয় শোগুলো",
|
"HeaderFavoriteShows": "প্রিয় শোগুলো",
|
||||||
"TasksLibraryCategory": "গ্রন্থাগার",
|
"TasksLibraryCategory": "লাইব্রেরি",
|
||||||
"TasksMaintenanceCategory": "রক্ষণাবেক্ষণ",
|
"TasksMaintenanceCategory": "রক্ষণাবেক্ষণ",
|
||||||
"TaskRefreshLibrary": "স্ক্যান মিডিয়া লাইব্রেরি",
|
"TaskRefreshLibrary": "স্ক্যান মিডিয়া লাইব্রেরি",
|
||||||
"TaskRefreshChapterImagesDescription": "অধ্যায়গুলিতে থাকা ভিডিওগুলির জন্য থাম্বনেইল তৈরি ।",
|
"TaskRefreshChapterImagesDescription": "যেসব ভিডিওতে চ্যাপ্টার রয়েছে, তাদের জন্য থাম্বনেইল তৈরি করবে।",
|
||||||
"TaskRefreshChapterImages": "অধ্যায়ের চিত্রগুলি বের করুন",
|
"TaskRefreshChapterImages": "চ্যাপ্টার ইমেজ বের করুন",
|
||||||
"TaskCleanCacheDescription": "সিস্টেমে আর প্রয়োজন নেই ক্যাশ, ফাইলগুলি মুছে ফেলুন।",
|
"TaskCleanCacheDescription": "সিস্টেমের অপ্রয়োজনীয় ক্যাশ ফাইলগুলো মুছে ফেলবে।",
|
||||||
"TaskCleanCache": "ক্লিন ক্যাশ ডিরেক্টরি",
|
"TaskCleanCache": "ক্লিন ক্যাশ ডিরেক্টরি",
|
||||||
"TasksChannelsCategory": "ইন্টারনেট চ্যানেল",
|
"TasksChannelsCategory": "ইন্টারনেট চ্যানেল",
|
||||||
"TasksApplicationCategory": "আবেদন",
|
"TasksApplicationCategory": "অ্যাপ্লিকেশন",
|
||||||
"TaskDownloadMissingSubtitlesDescription": "মেটাডেটা কনফিগারেশনের উপর ভিত্তি করে অনুপস্থিত সাবটাইটেলগুলির জন্য ইন্টারনেট অনুসন্ধান করে।",
|
"TaskDownloadMissingSubtitlesDescription": "মেটাডেটা কনফিগারেশনের উপর ভিত্তি করে অনুপস্থিত সাবটাইটেলগুলির জন্য ইন্টারনেট অনুসন্ধান করে।",
|
||||||
"TaskDownloadMissingSubtitles": "অনুপস্থিত সাবটাইটেলগুলি ডাউনলোড করুন",
|
"TaskDownloadMissingSubtitles": "অনুপস্থিত সাবটাইটেলগুলি ডাউনলোড করুন",
|
||||||
"TaskRefreshChannelsDescription": "ইন্টারনেট চ্যানেল তথ্য রিফ্রেশ করুন।",
|
"TaskRefreshChannelsDescription": "ইন্টারনেট চ্যানেল তথ্য রিফ্রেশ করুন।",
|
||||||
"TaskRefreshChannels": "চ্যানেল রিফ্রেশ করুন",
|
"TaskRefreshChannels": "চ্যানেল রিফ্রেশ করুন",
|
||||||
"TaskCleanTranscodeDescription": "এক দিনেরও বেশি পুরানো ট্রান্সকোড ফাইলগুলি মুছে ফেলুন।",
|
"TaskCleanTranscodeDescription": "এক দিনেরও বেশি পুরানো ট্রান্সকোড ফাইলগুলি মুছে ফেলবে।",
|
||||||
"TaskCleanTranscode": "ট্রান্সকোড ডিরেক্টরি ক্লিন করুন",
|
"TaskCleanTranscode": "ট্রান্সকোড ডিরেক্টরি ক্লিন করুন",
|
||||||
"TaskUpdatePluginsDescription": "স্বয়ংক্রিয়ভাবে আপডেট কনফিগার করা প্লাগইনগুলির জন্য আপডেট ডাউনলোড এবং ইনস্টল করুন।",
|
"TaskUpdatePluginsDescription": "স্বয়ংক্রিয়ভাবে আপডেট কনফিগার করা প্লাগইনগুলির জন্য আপডেট ডাউনলোড এবং ইনস্টল করুন।",
|
||||||
"TaskUpdatePlugins": "প্লাগইন আপডেট করুন",
|
"TaskUpdatePlugins": "আপডেট প্লাগইন",
|
||||||
"TaskRefreshPeopleDescription": "আপনার মিডিয়া লাইব্রেরিতে অভিনেতা এবং পরিচালকদের জন্য মেটাডাটা আপডেট করুন।",
|
"TaskRefreshPeopleDescription": "আপনার মিডিয়া লাইব্রেরিতে অভিনেতা এবং পরিচালকদের জন্য মেটাডাটা আপডেট করবে।",
|
||||||
"TaskRefreshPeople": "পিপল রিফ্রেশ করুন",
|
"TaskRefreshPeople": "ব্যক্তিদের তথ্য রিফ্রেশ",
|
||||||
"TaskCleanLogsDescription": "{0} দিনের বেশী পুরানো লগ ফাইলগুলি মুছে ফেলুন।",
|
"TaskCleanLogsDescription": "{0} দিনের বেশী পুরানো লগ ফাইলগুলি মুছে ফেলবে।",
|
||||||
"TaskCleanLogs": "লগ ডিরেক্টরি ক্লিন করুন",
|
"TaskCleanLogs": "ক্লিন লগ ডিরেক্টরি",
|
||||||
"TaskRefreshLibraryDescription": "নতুন ফাইলের জন্য মিডিয়া লাইব্রেরি স্ক্যান এবং মেটাডাটা রিফ্রেশ করুন।",
|
"TaskRefreshLibraryDescription": "নতুন ফাইলের জন্য মিডিয়া লাইব্রেরি স্ক্যান এবং মেটাডাটা রিফ্রেশ করবে।",
|
||||||
"Undefined": "অসঙ্গায়িত",
|
"Undefined": "অসঙ্গায়িত",
|
||||||
"Forced": "জোরকরে",
|
"Forced": "জোরকরে",
|
||||||
"TaskCleanActivityLogDescription": "নির্ধারিত সময়ের আগের কাজের হিসাব মুছে দিন খালি করুন.",
|
"TaskCleanActivityLogDescription": "নির্ধারিত সময়ের আগের অ্যাক্টিভিটি লগ মুছে দিবে।",
|
||||||
"TaskCleanActivityLog": "কাজের ফাইল খালি করুন",
|
"TaskCleanActivityLog": "অ্যাক্টিভিটি লগ মুছুন",
|
||||||
"Default": "ডিফল্ট",
|
"Default": "ডিফল্ট",
|
||||||
"HearingImpaired": "দুর্বল শ্রবণক্ষমতাধরদের জন্য",
|
"HearingImpaired": "শ্রবণ প্রতিবন্ধী",
|
||||||
"TaskOptimizeDatabaseDescription": "তথ্যভাণ্ডার সুবিন্যস্ত করে ও অব্যবহৃত জায়গা ছেড়ে দেয়। লাইব্রেরী স্ক্যান অথবা যেকোনো তথ্যভাণ্ডার পরিবর্তনের পর এই প্রক্রিয়া চালালে তথ্যভাণ্ডারের তথ্য প্রদান দ্রুততর হতে পারে।",
|
"TaskOptimizeDatabaseDescription": "তথ্যভাণ্ডার সুবিন্যস্ত করে ও অব্যবহৃত জায়গা ছেড়ে দেয়। লাইব্রেরী স্ক্যান অথবা যেকোনো তথ্যভাণ্ডার পরিবর্তনের পর এই প্রক্রিয়া চালালে তথ্যভাণ্ডারের তথ্য প্রদান দ্রুততর হতে পারে।",
|
||||||
"External": "বাহ্যিক",
|
"External": "বাহ্যিক",
|
||||||
"TaskOptimizeDatabase": "তথ্যভাণ্ডার সুবিন্যাস",
|
"TaskOptimizeDatabase": "তথ্যভাণ্ডার সুবিন্যাস",
|
||||||
"TaskKeyframeExtractor": "কি-ফ্রেম নিষ্কাশক",
|
"TaskKeyframeExtractor": "কি-ফ্রেম নিষ্কাশক",
|
||||||
"TaskKeyframeExtractorDescription": "ভিডিয়ো থেকে কি-ফ্রেম নিষ্কাশনের মাধ্যমে অধিকতর সঠিক HLS প্লে লিস্ট তৈরী করে। এই প্রক্রিয়া দীর্ঘ সময় ধরে চলতে পারে।",
|
"TaskKeyframeExtractorDescription": "ভিডিয়ো থেকে কি-ফ্রেম নিষ্কাশনের মাধ্যমে অধিকতর সঠিক HLS প্লে লিস্ট তৈরী করে। এই প্রক্রিয়া দীর্ঘ সময় ধরে চলতে পারে।",
|
||||||
"TaskRefreshTrickplayImages": "ট্রিকপ্লে ইমেজ তৈরি করুন",
|
"TaskRefreshTrickplayImages": "ট্রিকপ্লে ইমেজ তৈরি",
|
||||||
"TaskRefreshTrickplayImagesDescription": "সক্ষম লাইব্রেরিতে ভিডিওর জন্য ট্রিকপ্লে প্রিভিউ তৈরি করে।",
|
"TaskRefreshTrickplayImagesDescription": "সক্ষম লাইব্রেরিতে ভিডিওর জন্য ট্রিকপ্লে প্রিভিউ তৈরি করে।",
|
||||||
"TaskDownloadMissingLyricsDescription": "গানের লিরিক্স ডাউনলোড করে",
|
"TaskDownloadMissingLyricsDescription": "গানের জন্য লিরিকস ডাউনলোড করুন",
|
||||||
"TaskCleanCollectionsAndPlaylists": "সংগ্রহ এবং প্লেলিস্ট পরিষ্কার করুন",
|
"TaskCleanCollectionsAndPlaylists": "কালেকশন এবং প্লেলিস্ট পরিষ্কার করুন",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "সংগ্রহ এবং প্লেলিস্ট থেকে আইটেমগুলি সরিয়ে দেয় যা আর বিদ্যমান নেই।",
|
"TaskCleanCollectionsAndPlaylistsDescription": "কালেকশন এবং প্লেলিস্ট থেকে আইটেমগুলি সরিয়ে দেয় যা আর বিদ্যমান নেই।",
|
||||||
"TaskExtractMediaSegments": "মিডিয়া সেগমেন্ট স্ক্যান",
|
"TaskExtractMediaSegments": "মিডিয়া সেগমেন্ট স্ক্যান",
|
||||||
"TaskExtractMediaSegmentsDescription": "MediaSegment সক্ষম প্লাগইনগুলি থেকে মিডিয়া সেগমেন্টগুলি বের করে বা প্রাপ্ত করে।",
|
"TaskExtractMediaSegmentsDescription": "মিডিয়া সেগমেন্ট সক্ষম প্লাগইনগুলি থেকে মিডিয়া সেগমেন্ট বের করে বা অর্জন করে।",
|
||||||
"TaskDownloadMissingLyrics": "অনুপস্থিত গান ডাউনলোড করুন"
|
"TaskDownloadMissingLyrics": "অনুপস্থিত গান ডাউনলোড করুন",
|
||||||
|
"TaskMoveTrickplayImagesDescription": "লাইব্রেরির সেটিং অনুযায়ী বিদ্যমান ট্রিকপ্লে ফাইলগুলো সরিয়ে নেবে।",
|
||||||
|
"TaskAudioNormalizationDescription": "অডিও নর্মালাইজেশন তথ্যের জন্য ফাইল স্ক্যান করবে।",
|
||||||
|
"CleanupUserDataTaskDescription": "৯০ দিন বা তার বেশি সময় ধরে অনুপস্থিত মিডিয়া থেকে সকল ব্যবহারকারীর ডেটা (ওয়াচ স্টেট, ফেভারিট স্ট্যাটাস ইত্যাদি) মুছে ফেলবে।",
|
||||||
|
"TaskMoveTrickplayImages": "ট্রিকপ্লে ইমেজের অবস্থান পরিবর্তন",
|
||||||
|
"TaskAudioNormalization": "অডিও নর্মলাইজেশন",
|
||||||
|
"CleanupUserDataTask": "ইউজার ডেটা ক্লিনআপ কাজ"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
"NameInstallFailed": "{0} instal·lació fallida",
|
"NameInstallFailed": "{0} instal·lació fallida",
|
||||||
"NameSeasonNumber": "Temporada {0}",
|
"NameSeasonNumber": "Temporada {0}",
|
||||||
"NameSeasonUnknown": "Temporada desconeguda",
|
"NameSeasonUnknown": "Temporada desconeguda",
|
||||||
"NewVersionIsAvailable": "Una nova versió del servidor de Jellyfin està disponible per a descarregar.",
|
"NewVersionIsAvailable": "Hi ha disponible una versió nova del servidor de Jellyfin per a la descàrrega.",
|
||||||
"NotificationOptionApplicationUpdateAvailable": "Actualització de l'aplicatiu disponible",
|
"NotificationOptionApplicationUpdateAvailable": "Actualització de l'aplicatiu disponible",
|
||||||
"NotificationOptionApplicationUpdateInstalled": "Actualització de l'aplicatiu instal·lada",
|
"NotificationOptionApplicationUpdateInstalled": "Actualització de l'aplicatiu instal·lada",
|
||||||
"NotificationOptionAudioPlayback": "Reproducció d'àudio iniciada",
|
"NotificationOptionAudioPlayback": "Reproducció d'àudio iniciada",
|
||||||
@@ -64,7 +64,7 @@
|
|||||||
"Playlists": "Llistes de reproducció",
|
"Playlists": "Llistes de reproducció",
|
||||||
"Plugin": "Complement",
|
"Plugin": "Complement",
|
||||||
"PluginInstalledWithName": "{0} ha estat instal·lat",
|
"PluginInstalledWithName": "{0} ha estat instal·lat",
|
||||||
"PluginUninstalledWithName": "S'ha instalat {0}",
|
"PluginUninstalledWithName": "S'ha instal·lat {0}",
|
||||||
"PluginUpdatedWithName": "S'ha actualitzat {0}",
|
"PluginUpdatedWithName": "S'ha actualitzat {0}",
|
||||||
"ProviderValue": "Proveïdor: {0}",
|
"ProviderValue": "Proveïdor: {0}",
|
||||||
"ScheduledTaskFailedWithName": "{0} ha fallat",
|
"ScheduledTaskFailedWithName": "{0} ha fallat",
|
||||||
@@ -93,50 +93,50 @@
|
|||||||
"ValueSpecialEpisodeName": "Especial - {0}",
|
"ValueSpecialEpisodeName": "Especial - {0}",
|
||||||
"VersionNumber": "Versió {0}",
|
"VersionNumber": "Versió {0}",
|
||||||
"TaskDownloadMissingSubtitlesDescription": "Cerca a internet els subtítols que faltin a partir de la configuració de metadades.",
|
"TaskDownloadMissingSubtitlesDescription": "Cerca a internet els subtítols que faltin a partir de la configuració de metadades.",
|
||||||
"TaskDownloadMissingSubtitles": "Descarrega els subtítols que faltin",
|
"TaskDownloadMissingSubtitles": "Descàrrega dels subtítols que faltin",
|
||||||
"TaskRefreshChannelsDescription": "Actualitza la informació dels canals per internet.",
|
"TaskRefreshChannelsDescription": "Actualitza la informació dels canals per internet.",
|
||||||
"TaskRefreshChannels": "Actualitza els canals",
|
"TaskRefreshChannels": "Actualitza els canals",
|
||||||
"TaskCleanTranscodeDescription": "Elimina els arxius de transcodificacions que tinguin més d'un dia.",
|
"TaskCleanTranscodeDescription": "Elimina els fitxers de transcodificacions que tinguin més d'un dia.",
|
||||||
"TaskCleanTranscode": "Neteja les transcodificacions",
|
"TaskCleanTranscode": "Neteja de les transcodificacions",
|
||||||
"TaskUpdatePluginsDescription": "Descarrega i instal·la els complements que estiguin configurats per a actualitzar-se automàticament.",
|
"TaskUpdatePluginsDescription": "Descarrega i instal·la els complements que estiguin configurats per a actualitzar-se automàticament.",
|
||||||
"TaskUpdatePlugins": "Actualitza els complements",
|
"TaskUpdatePlugins": "Actualització dels complements",
|
||||||
"TaskRefreshPeopleDescription": "Actualitza les metadades dels actors i directors de la mediateca.",
|
"TaskRefreshPeopleDescription": "Actualització de les metadades dels actors i directors de la mediateca.",
|
||||||
"TaskRefreshPeople": "Actualitza les persones",
|
"TaskRefreshPeople": "Actualització de les persones",
|
||||||
"TaskCleanLogsDescription": "Esborra els registres que tinguin més de {0} dies.",
|
"TaskCleanLogsDescription": "Esborra els registres que tinguin més de {0} dies.",
|
||||||
"TaskCleanLogs": "Neteja els registres",
|
"TaskCleanLogs": "Neteja dels registres",
|
||||||
"TaskRefreshLibraryDescription": "Escaneja la mediateca, a la cerca de fitxers nous i refresca les metadades.",
|
"TaskRefreshLibraryDescription": "Escaneja les mediateques, a la cerca de fitxers nous i refresca les metadades.",
|
||||||
"TaskRefreshLibrary": "Escaneja la mediateca",
|
"TaskRefreshLibrary": "Escaneig de les mediateques",
|
||||||
"TaskRefreshChapterImagesDescription": "Crea les miniatures dels vídeos que tinguin capítols.",
|
"TaskRefreshChapterImagesDescription": "Creació de les miniatures dels vídeos que tinguin capítols.",
|
||||||
"TaskRefreshChapterImages": "Extreu les imatges dels capítols",
|
"TaskRefreshChapterImages": "Extracció de les imatges dels capítols",
|
||||||
"TaskCleanCacheDescription": "Elimina la memòria cau no necessària per al servidor.",
|
"TaskCleanCacheDescription": "Eliminació de la memòria cau no necessària per al servidor.",
|
||||||
"TaskCleanCache": "Elimina la memòria cau",
|
"TaskCleanCache": "Eliminació de la memòria cau",
|
||||||
"TasksChannelsCategory": "Canals per internet",
|
"TasksChannelsCategory": "Canals per internet",
|
||||||
"TasksApplicationCategory": "Aplicatiu",
|
"TasksApplicationCategory": "Aplicatiu",
|
||||||
"TasksLibraryCategory": "Mediateca",
|
"TasksLibraryCategory": "Mediateca",
|
||||||
"TasksMaintenanceCategory": "Manteniment",
|
"TasksMaintenanceCategory": "Manteniment",
|
||||||
"TaskCleanActivityLogDescription": "Eliminades les entrades del registre d'activitats més antigues que l'antiguitat configurada.",
|
"TaskCleanActivityLogDescription": "Eliminació de les entrades del registre d'activitats més antigues que l'antiguitat configurada.",
|
||||||
"TaskCleanActivityLog": "Buida el registre d'activitat",
|
"TaskCleanActivityLog": "Buidatge del registre d'activitat",
|
||||||
"Undefined": "Indefinit",
|
"Undefined": "Indefinit",
|
||||||
"Forced": "Forçat",
|
"Forced": "Forçat",
|
||||||
"Default": "Per defecte",
|
"Default": "Per defecte",
|
||||||
"TaskOptimizeDatabaseDescription": "Compacta la base de dades i trunca l'espai lliure. Executar aquesta tasca després d’escanejar la mediateca o fer d'altres canvis que impliquin modificacions a la base de dades pot millorar el rendiment.",
|
"TaskOptimizeDatabaseDescription": "Compacta la base de dades i trunca l'espai lliure. Executar aquesta tasca després d’escanejar la mediateca o fer d'altres canvis que impliquin modificacions a la base de dades pot millorar el rendiment.",
|
||||||
"TaskOptimizeDatabase": "Optimitza la base de dades",
|
"TaskOptimizeDatabase": "Optimització de la base de dades",
|
||||||
"TaskKeyframeExtractorDescription": "Extreu fotogrames clau dels fitxers de vídeo per crear llistes de reproducció HLS més precises. Aquesta tasca pot allargar-se molt en el temps.",
|
"TaskKeyframeExtractorDescription": "Extracció de fotogrames clau dels fitxers de vídeo per a crear llistes de reproducció HLS més precises. Aquesta tasca pot allargar-se molt en el temps.",
|
||||||
"TaskKeyframeExtractor": "Extractor de fotogrames clau",
|
"TaskKeyframeExtractor": "Extracció de fotogrames clau",
|
||||||
"External": "Extern",
|
"External": "Extern",
|
||||||
"HearingImpaired": "Discapacitat auditiva",
|
"HearingImpaired": "Discapacitat auditiva",
|
||||||
"TaskRefreshTrickplayImages": "Genera imatges de previsualització",
|
"TaskRefreshTrickplayImages": "Generació d'imatges de previsualització",
|
||||||
"TaskRefreshTrickplayImagesDescription": "Crea imatges de previsualització per vídeos en les mediateques habilitades.",
|
"TaskRefreshTrickplayImagesDescription": "Creació d'imatges de previsualització per a vídeos en les mediateques habilitades.",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "Esborra elements de col·leccions i llistes de reproducció que ja no existeixen.",
|
"TaskCleanCollectionsAndPlaylistsDescription": "Esborra elements de col·leccions i llistes de reproducció que ja no existeixen.",
|
||||||
"TaskCleanCollectionsAndPlaylists": "Neteja les col·leccions i llistes de reproducció",
|
"TaskCleanCollectionsAndPlaylists": "Neteja de les col·leccions i llistes de reproducció",
|
||||||
"TaskAudioNormalization": "Estabilització de l'àudio",
|
"TaskAudioNormalization": "Estabilització de l'àudio",
|
||||||
"TaskAudioNormalizationDescription": "Escaneja arxius per dades d'estabilització de l'àudio.",
|
"TaskAudioNormalizationDescription": "Escaneja els fitxer per a obtenir dades de normalització de l'àudio.",
|
||||||
"TaskDownloadMissingLyricsDescription": "Baixa les lletres de les cançons",
|
"TaskDownloadMissingLyricsDescription": "Descàrrega de les lletres de les cançons",
|
||||||
"TaskDownloadMissingLyrics": "Baixa les lletres que falten",
|
"TaskDownloadMissingLyrics": "Descàrrega de les lletres que faltin",
|
||||||
"TaskExtractMediaSegments": "Escaneig de segments multimèdia",
|
"TaskExtractMediaSegments": "Escaneig de segments multimèdia",
|
||||||
"TaskExtractMediaSegmentsDescription": "Extreu o obté segments multimèdia usant els connectors MediaSegment activats.",
|
"TaskExtractMediaSegmentsDescription": "Extreu o obté segments multimèdia usant els connectors MediaSegment activats.",
|
||||||
"TaskMoveTrickplayImages": "Migra la ubicació de la imatge de Trickplay",
|
"TaskMoveTrickplayImages": "Migració de la ubicació de la imatge de previsualització",
|
||||||
"TaskMoveTrickplayImagesDescription": "Mou els fitxers trickplay existents segons la configuració de la mediateca.",
|
"TaskMoveTrickplayImagesDescription": "Mou els fitxers existents d'imatges de previsualització segons la configuració de la mediateca.",
|
||||||
"CleanupUserDataTaskDescription": "Neteja totes les dades d'usuari (estat de la visualització, estat dels preferits, etc.) del contingut multimèdia que no ha estat present durant almenys 90 dies.",
|
"CleanupUserDataTaskDescription": "Neteja totes les dades d'usuari (estat de la visualització, estat dels preferits, etc.) del contingut multimèdia que no ha estat present durant almenys 90 dies.",
|
||||||
"CleanupUserDataTask": "Tasca de neteja de dades d'usuari"
|
"CleanupUserDataTask": "Tasca de neteja de dades d'usuari"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskExtractMediaSegments": "Scan for mediesegmenter",
|
"TaskExtractMediaSegments": "Scan for mediesegmenter",
|
||||||
"TaskMoveTrickplayImages": "Migrer billedelokationer for trickplay-billeder",
|
"TaskMoveTrickplayImages": "Migrer billedelokationer for trickplay-billeder",
|
||||||
"TaskMoveTrickplayImagesDescription": "Flyt eksisterende trickplay-billeder jævnfør biblioteksindstillinger.",
|
"TaskMoveTrickplayImagesDescription": "Flyt eksisterende trickplay-billeder jævnfør biblioteksindstillinger.",
|
||||||
"TaskExtractMediaSegmentsDescription": "Udtrækker eller henter mediesegmenter fra plugins som understøtter MediaSegment."
|
"TaskExtractMediaSegmentsDescription": "Udtrækker eller henter mediesegmenter fra plugins som understøtter MediaSegment.",
|
||||||
|
"CleanupUserDataTask": "Brugerdata oprydningsopgave",
|
||||||
|
"CleanupUserDataTaskDescription": "Rydder alle brugerdata (eks. visning- og favoritstatus) fra medier, der har været utilgængelige i mindst 90 dage."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,7 +90,7 @@
|
|||||||
"UserStartedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} auf {2} gestartet",
|
"UserStartedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} auf {2} gestartet",
|
||||||
"UserStoppedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} auf {2} beendet",
|
"UserStoppedPlayingItemWithValues": "{0} hat die Wiedergabe von {1} auf {2} beendet",
|
||||||
"ValueHasBeenAddedToLibrary": "{0} wurde deiner Bibliothek hinzugefügt",
|
"ValueHasBeenAddedToLibrary": "{0} wurde deiner Bibliothek hinzugefügt",
|
||||||
"ValueSpecialEpisodeName": "Extra - {0}",
|
"ValueSpecialEpisodeName": "Extra – {0}",
|
||||||
"VersionNumber": "Version {0}",
|
"VersionNumber": "Version {0}",
|
||||||
"TaskDownloadMissingSubtitlesDescription": "Sucht im Internet basierend auf den Metadaten-Einstellungen nach fehlenden Untertiteln.",
|
"TaskDownloadMissingSubtitlesDescription": "Sucht im Internet basierend auf den Metadaten-Einstellungen nach fehlenden Untertiteln.",
|
||||||
"TaskDownloadMissingSubtitles": "Fehlende Untertitel herunterladen",
|
"TaskDownloadMissingSubtitles": "Fehlende Untertitel herunterladen",
|
||||||
@@ -138,5 +138,5 @@
|
|||||||
"TaskMoveTrickplayImages": "Verzeichnis für Trickplay-Bilder migrieren",
|
"TaskMoveTrickplayImages": "Verzeichnis für Trickplay-Bilder migrieren",
|
||||||
"TaskMoveTrickplayImagesDescription": "Trickplay-Bilder werden entsprechend der Bibliothekseinstellungen verschoben.",
|
"TaskMoveTrickplayImagesDescription": "Trickplay-Bilder werden entsprechend der Bibliothekseinstellungen verschoben.",
|
||||||
"CleanupUserDataTask": "Aufgabe zur Bereinigung von Benutzerdaten",
|
"CleanupUserDataTask": "Aufgabe zur Bereinigung von Benutzerdaten",
|
||||||
"CleanupUserDataTaskDescription": "Löscht alle Benutzerdaten (Anschaustatus, Favoritenstatus, usw.) von Medien, die seit mindestens 90 Tagen nicht mehr vorhanden sind."
|
"CleanupUserDataTaskDescription": "Löscht alle Benutzerdaten (Abspielstatus, Favoritenstatus, usw.) von Medien, die seit mindestens 90 Tagen nicht mehr vorhanden sind."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskMoveTrickplayImagesDescription": "Μετακινεί τα υπάρχοντα αρχεία trickplay σύμφωνα με τις ρυθμίσεις της βιβλιοθήκης.",
|
"TaskMoveTrickplayImagesDescription": "Μετακινεί τα υπάρχοντα αρχεία trickplay σύμφωνα με τις ρυθμίσεις της βιβλιοθήκης.",
|
||||||
"TaskDownloadMissingLyricsDescription": "Κατεβάζει στίχους για τραγούδια",
|
"TaskDownloadMissingLyricsDescription": "Κατεβάζει στίχους για τραγούδια",
|
||||||
"TaskExtractMediaSegments": "Σάρωση τμημάτων πολυμέσων",
|
"TaskExtractMediaSegments": "Σάρωση τμημάτων πολυμέσων",
|
||||||
"TaskExtractMediaSegmentsDescription": "Εξάγει ή βρίσκει τμήματα πολυμέσων από επεκτάσεις που χρησιμοποιούν το MediaSegment."
|
"TaskExtractMediaSegmentsDescription": "Εξάγει ή βρίσκει τμήματα πολυμέσων από επεκτάσεις που χρησιμοποιούν το MediaSegment.",
|
||||||
|
"CleanupUserDataTaskDescription": "Καθαρίζει όλα τα δεδομένα χρήστη (κατάσταση παρακολούθησης, κατάσταση αγαπημένων κ.λπ.) από πολυμέσα που δεν υπάρχουν πλέον για τουλάχιστον 90 ημέρες.",
|
||||||
|
"CleanupUserDataTask": "Εργασία εκκαθάρισης δεδομένων χρήστη"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskExtractMediaSegments": "Media Segment Scan",
|
"TaskExtractMediaSegments": "Media Segment Scan",
|
||||||
"TaskExtractMediaSegmentsDescription": "Extracts or obtains media segments from MediaSegment enabled plugins.",
|
"TaskExtractMediaSegmentsDescription": "Extracts or obtains media segments from MediaSegment enabled plugins.",
|
||||||
"TaskMoveTrickplayImages": "Migrate Trickplay Image Location",
|
"TaskMoveTrickplayImages": "Migrate Trickplay Image Location",
|
||||||
"TaskMoveTrickplayImagesDescription": "Moves existing trickplay files according to the library settings."
|
"TaskMoveTrickplayImagesDescription": "Moves existing trickplay files according to the library settings.",
|
||||||
|
"CleanupUserDataTask": "User data cleanup task",
|
||||||
|
"CleanupUserDataTaskDescription": "Cleans all user data (Watch state, favourite status etc) from media that is no longer present for at least 90 days."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskExtractMediaSegments": "Escanear Segmentos de Media",
|
"TaskExtractMediaSegments": "Escanear Segmentos de Media",
|
||||||
"TaskExtractMediaSegmentsDescription": "Extrae u obtiene segmentos de medio de plugins habilitados para MediaSegment.",
|
"TaskExtractMediaSegmentsDescription": "Extrae u obtiene segmentos de medio de plugins habilitados para MediaSegment.",
|
||||||
"TaskMoveTrickplayImagesDescription": "Mueve archivos existentes de trickplay de acuerdo a la configuración de la biblioteca.",
|
"TaskMoveTrickplayImagesDescription": "Mueve archivos existentes de trickplay de acuerdo a la configuración de la biblioteca.",
|
||||||
"TaskMoveTrickplayImages": "Migrar Ubicación de Imagen de Trickplay"
|
"TaskMoveTrickplayImages": "Migrar Ubicación de Imagen de Trickplay",
|
||||||
|
"CleanupUserDataTaskDescription": "Limpia todos los datos del usuario (estado de visualización, estado de los favoritos, etc.) que no están presentes en la biblioteca por al menos 90 días.",
|
||||||
|
"CleanupUserDataTask": "Tarea de limpieza de datos de usuarios"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskExtractMediaSegments": "Escaneo de segmentos de medios",
|
"TaskExtractMediaSegments": "Escaneo de segmentos de medios",
|
||||||
"TaskExtractMediaSegmentsDescription": "Extrae u obtiene segmentos de medios de plugins habilitados para MediaSegment.",
|
"TaskExtractMediaSegmentsDescription": "Extrae u obtiene segmentos de medios de plugins habilitados para MediaSegment.",
|
||||||
"TaskMoveTrickplayImages": "Migrar la ubicación de la imagen de Trickplay",
|
"TaskMoveTrickplayImages": "Migrar la ubicación de la imagen de Trickplay",
|
||||||
"TaskMoveTrickplayImagesDescription": "Mueve archivos de trickplay existentes según la configuración de la biblioteca."
|
"TaskMoveTrickplayImagesDescription": "Mueve archivos de trickplay existentes según la configuración de la biblioteca.",
|
||||||
|
"CleanupUserDataTask": "Tarea de limpieza de los datos del usuario",
|
||||||
|
"CleanupUserDataTaskDescription": "Limpia toda la información de usuario (Estado de última vez visto, favoritos, etc) del archivo media que no está presente por los últimos 90 días."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskMoveTrickplayImagesDescription": "Mueve archivos de trickplay existentes según la configuración de la biblioteca.",
|
"TaskMoveTrickplayImagesDescription": "Mueve archivos de trickplay existentes según la configuración de la biblioteca.",
|
||||||
"TaskExtractMediaSegments": "Escaneo de segmentos de medios",
|
"TaskExtractMediaSegments": "Escaneo de segmentos de medios",
|
||||||
"TaskExtractMediaSegmentsDescription": "Extrae u obtiene segmentos de medios de plugins habilitados para MediaSegment.",
|
"TaskExtractMediaSegmentsDescription": "Extrae u obtiene segmentos de medios de plugins habilitados para MediaSegment.",
|
||||||
"TaskMoveTrickplayImages": "Migrar la ubicación de la imagen de Trickplay"
|
"TaskMoveTrickplayImages": "Migrar la ubicación de la imagen de Trickplay",
|
||||||
|
"CleanupUserDataTask": "Tarea de limpieza de datos del usuario",
|
||||||
|
"CleanupUserDataTaskDescription": "Limpia todos los datos del usuario (estado de visualización, favoritos, etc.) de los medios que ya no están disponibles desde hace al menos 90 días."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,5 +135,7 @@
|
|||||||
"TaskExtractMediaSegmentsDescription": "Extrae u obtiene segmentos de medios de complementos habilitados para MediaSegment.",
|
"TaskExtractMediaSegmentsDescription": "Extrae u obtiene segmentos de medios de complementos habilitados para MediaSegment.",
|
||||||
"TaskMoveTrickplayImagesDescription": "Mueve archivos de trickplay existentes según la configuración de la biblioteca.",
|
"TaskMoveTrickplayImagesDescription": "Mueve archivos de trickplay existentes según la configuración de la biblioteca.",
|
||||||
"TaskExtractMediaSegments": "Escaneo de segmentos de medios",
|
"TaskExtractMediaSegments": "Escaneo de segmentos de medios",
|
||||||
"TaskMoveTrickplayImages": "Migrar la ubicación de la imagen de Trickplay"
|
"TaskMoveTrickplayImages": "Migrar la ubicación de la imagen de Trickplay",
|
||||||
|
"CleanupUserDataTask": "Tarea de limpieza de datos de usuario",
|
||||||
|
"CleanupUserDataTaskDescription": "Limpia todos los datos de usuario (estado de visualización, favoritos, etc.) que no están presentes en la biblioteca por al menos 90 días."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,5 +125,11 @@
|
|||||||
"Undefined": "Sin definir",
|
"Undefined": "Sin definir",
|
||||||
"TaskCleanActivityLogDescription": "Elimina las entradas del registro de actividad anteriores al periodo configurado.",
|
"TaskCleanActivityLogDescription": "Elimina las entradas del registro de actividad anteriores al periodo configurado.",
|
||||||
"TaskCleanCacheDescription": "Elimina archivos caché que ya no son necesarios para el sistema.",
|
"TaskCleanCacheDescription": "Elimina archivos caché que ya no son necesarios para el sistema.",
|
||||||
"TaskCleanLogsDescription": "Elimina archivos de registro con más de {0} días de antigüedad."
|
"TaskCleanLogsDescription": "Elimina archivos de registro con más de {0} días de antigüedad.",
|
||||||
|
"NotificationOptionApplicationUpdateAvailable": "actualización disponible",
|
||||||
|
"TaskDownloadMissingLyrics": "Descargue letras desaparecidas",
|
||||||
|
"TaskDownloadMissingLyricsDescription": "Decarga letras para canciones",
|
||||||
|
"TaskMoveTrickplayImages": "Mover localización de foto vista previa",
|
||||||
|
"NotificationOptionApplicationUpdateInstalled": "Aplicación actualización disponible",
|
||||||
|
"CleanupUserDataTask": "Tarea de limpieza de los datos del usuario"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,14 +1,14 @@
|
|||||||
{
|
{
|
||||||
"TaskCleanActivityLogDescription": "Kustutab määratud ajast vanemad tegevuslogi kirjed.",
|
"TaskCleanActivityLogDescription": "Kustutab määratud ajast vanemad tegevuslogi kirjed.",
|
||||||
"UserDownloadingItemWithValues": "{0} laeb alla {1}",
|
"UserDownloadingItemWithValues": "{0} laadib alla {1}",
|
||||||
"HeaderRecordingGroups": "Salvestusrühmad",
|
"HeaderRecordingGroups": "Salvestusrühmad",
|
||||||
"TaskOptimizeDatabaseDescription": "Tihendab ja puhastab andmebaasi. Selle toimingu tegemine pärast meediakogu andmebaasiga seotud muudatuste skannimist võib jõudlust parandada.",
|
"TaskOptimizeDatabaseDescription": "Tihendab ja puhastab andmebaasi. Selle toimingu tegemine pärast meediakogu andmebaasiga seotud muudatuste skannimist võib jõudlust parandada.",
|
||||||
"TaskOptimizeDatabase": "Optimeeri andmebaasi",
|
"TaskOptimizeDatabase": "Optimeeri andmebaasi",
|
||||||
"TaskDownloadMissingSubtitlesDescription": "Otsib veebist puuduvaid subtiitreid vastavalt määratud metaandmete seadetele.",
|
"TaskDownloadMissingSubtitlesDescription": "Otsib veebist puuduvaid subtiitreid vastavalt määratud metaandmete seadetele.",
|
||||||
"TaskDownloadMissingSubtitles": "Laadi alla puuduvad subtiitrid",
|
"TaskDownloadMissingSubtitles": "Hangi puuduvad subtiitrid",
|
||||||
"TaskRefreshChannelsDescription": "Värskendab veebikanalite teavet.",
|
"TaskRefreshChannelsDescription": "Värskendab veebikanalite teavet.",
|
||||||
"TaskRefreshChannels": "Värskenda kanaleid",
|
"TaskRefreshChannels": "Värskenda kanaleid",
|
||||||
"TaskCleanTranscodeDescription": "Kustutab üle ühe päeva vanused transkodeerimisfailid.",
|
"TaskCleanTranscodeDescription": "Kustutab üle ühe päeva vanused transkoodimisfailid.",
|
||||||
"TaskCleanTranscode": "Puhasta transkoodimise kataloog",
|
"TaskCleanTranscode": "Puhasta transkoodimise kataloog",
|
||||||
"TaskUpdatePluginsDescription": "Laadib alla ja paigaldab nende pluginate uuendused, mis on seadistatud automaatselt uuenduma.",
|
"TaskUpdatePluginsDescription": "Laadib alla ja paigaldab nende pluginate uuendused, mis on seadistatud automaatselt uuenduma.",
|
||||||
"TaskUpdatePlugins": "Uuenda pluginaid",
|
"TaskUpdatePlugins": "Uuenda pluginaid",
|
||||||
@@ -41,10 +41,10 @@
|
|||||||
"StartupEmbyServerIsLoading": "Jellyfin server laadib. Proovi varsti uuesti.",
|
"StartupEmbyServerIsLoading": "Jellyfin server laadib. Proovi varsti uuesti.",
|
||||||
"User": "Kasutaja",
|
"User": "Kasutaja",
|
||||||
"Undefined": "Määratlemata",
|
"Undefined": "Määratlemata",
|
||||||
"TvShows": "Seriaalid",
|
"TvShows": "Sarjad",
|
||||||
"System": "Süsteem",
|
"System": "Süsteem",
|
||||||
"Sync": "Sünkrooni",
|
"Sync": "Sünkrooni",
|
||||||
"Songs": "Laulud",
|
"Songs": "Lood",
|
||||||
"Shows": "Sarjad",
|
"Shows": "Sarjad",
|
||||||
"ServerNameNeedsToBeRestarted": "{0} tuleb taaskäivitada",
|
"ServerNameNeedsToBeRestarted": "{0} tuleb taaskäivitada",
|
||||||
"ScheduledTaskFailedWithName": "{0} nurjus",
|
"ScheduledTaskFailedWithName": "{0} nurjus",
|
||||||
@@ -92,7 +92,7 @@
|
|||||||
"HeaderNextUp": "Järgmisena",
|
"HeaderNextUp": "Järgmisena",
|
||||||
"HeaderLiveTV": "Otse TV",
|
"HeaderLiveTV": "Otse TV",
|
||||||
"HeaderFavoriteSongs": "Lemmiklood",
|
"HeaderFavoriteSongs": "Lemmiklood",
|
||||||
"HeaderFavoriteShows": "Lemmikseriaalid",
|
"HeaderFavoriteShows": "Lemmiksarjad",
|
||||||
"HeaderFavoriteEpisodes": "Lemmikepisoodid",
|
"HeaderFavoriteEpisodes": "Lemmikepisoodid",
|
||||||
"HeaderFavoriteArtists": "Lemmikesitajad",
|
"HeaderFavoriteArtists": "Lemmikesitajad",
|
||||||
"HeaderFavoriteAlbums": "Lemmikalbumid",
|
"HeaderFavoriteAlbums": "Lemmikalbumid",
|
||||||
@@ -122,18 +122,20 @@
|
|||||||
"UserOnlineFromDevice": "{0} on ühendatud seadmest {1}",
|
"UserOnlineFromDevice": "{0} on ühendatud seadmest {1}",
|
||||||
"External": "Väline",
|
"External": "Väline",
|
||||||
"HearingImpaired": "Kuulmispuudega",
|
"HearingImpaired": "Kuulmispuudega",
|
||||||
"TaskKeyframeExtractorDescription": "Eraldab videofailidest võtmekaadreid, et luua täpsemaid HLS-i esitusloendeid. See ülesanne võib kesta pikka aega.",
|
"TaskKeyframeExtractorDescription": "Eraldab videofailidest võtmekaadrid, et luua täpsemaid HLS-i esitusloendeid. See võib kesta pikka aega.",
|
||||||
"TaskKeyframeExtractor": "Võtmekaadri ekstraktor",
|
"TaskKeyframeExtractor": "Eralda võtmekaadrid",
|
||||||
"TaskRefreshTrickplayImages": "Loo eelvaate pildid",
|
"TaskRefreshTrickplayImages": "Loo trickplay pildid",
|
||||||
"TaskRefreshTrickplayImagesDescription": "Loob eelvaated videotele, kus lubatud.",
|
"TaskRefreshTrickplayImagesDescription": "Loob trickplay eelvaated videotele lubatud meediakogudes.",
|
||||||
"TaskAudioNormalization": "Heli Normaliseerimine",
|
"TaskAudioNormalization": "Normaliseeri helitugevus",
|
||||||
"TaskAudioNormalizationDescription": "Skaneerib faile heli normaliseerimise andmete jaoks.",
|
"TaskAudioNormalizationDescription": "Otsib failidest helitugevuse normaliseerimise teavet.",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "Eemaldab kogumikest ja esitusloenditest asjad, mida enam ei eksisteeri.",
|
"TaskCleanCollectionsAndPlaylistsDescription": "Eemaldab kogumikest ja esitusloenditest üksused, mida enam ei eksisteeri.",
|
||||||
"TaskCleanCollectionsAndPlaylists": "Puhasta kogumikud ja esitusloendid",
|
"TaskCleanCollectionsAndPlaylists": "Puhasta kogumikud ja esitusloendid",
|
||||||
"TaskDownloadMissingLyrics": "Lae alla puuduolev lüürika",
|
"TaskDownloadMissingLyrics": "Hangi puuduvad laulusõnad",
|
||||||
"TaskDownloadMissingLyricsDescription": "Lae lauludele alla lüürika",
|
"TaskDownloadMissingLyricsDescription": "Laulusõnade allalaadimine",
|
||||||
"TaskMoveTrickplayImagesDescription": "Liigutab trickplay pildid meediakogu sätete kohaselt.",
|
"TaskMoveTrickplayImagesDescription": "Liigutab trickplay pildid meediakogu sätete kohaselt.",
|
||||||
"TaskExtractMediaSegments": "Meediasegmentide skaneerimine",
|
"TaskExtractMediaSegments": "Skaneeri meediasegmente",
|
||||||
"TaskExtractMediaSegmentsDescription": "Eraldab või võtab meediasegmendid MediaSegment'i lubavatest pluginatest.",
|
"TaskExtractMediaSegmentsDescription": "Eraldab või võtab meediasegmendid MediaSegment'i lubavatest pluginatest.",
|
||||||
"TaskMoveTrickplayImages": "Migreeri trickplay piltide asukoht"
|
"TaskMoveTrickplayImages": "Muuda trickplay piltide asukoht",
|
||||||
|
"CleanupUserDataTask": "Puhasta kasutajaandmed",
|
||||||
|
"CleanupUserDataTaskDescription": "Puhastab kõik kasutajaandmed (vaatamise olek, lemmikute olek jne) meediast, mis pole enam vähemalt 90 päeva saadaval olnud."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,5 +135,7 @@
|
|||||||
"TaskExtractMediaSegmentsDescription": "Media segmentuak atera edo lortzen ditu MediaSegment gaituta duten pluginetik.",
|
"TaskExtractMediaSegmentsDescription": "Media segmentuak atera edo lortzen ditu MediaSegment gaituta duten pluginetik.",
|
||||||
"TaskMoveTrickplayImages": "Aldatu Trickplay irudien kokalekua",
|
"TaskMoveTrickplayImages": "Aldatu Trickplay irudien kokalekua",
|
||||||
"TaskMoveTrickplayImagesDescription": "Lehendik dauden trickplay fitxategiak liburutegiaren ezarpenen arabera mugitzen dira.",
|
"TaskMoveTrickplayImagesDescription": "Lehendik dauden trickplay fitxategiak liburutegiaren ezarpenen arabera mugitzen dira.",
|
||||||
"TaskAudioNormalizationDescription": "Audio normalizazio datuak lortzeko fitxategiak eskaneatzen ditu."
|
"TaskAudioNormalizationDescription": "Audio normalizazio datuak lortzeko fitxategiak eskaneatzen ditu.",
|
||||||
|
"CleanupUserDataTaskDescription": "Gutxienez 90 egunez dagoeneko existitzen ez den multimediatik erabiltzaile-datu guztiak (ikusteko egoera, gogokoen egoera, etab.) garbitzen ditu.",
|
||||||
|
"CleanupUserDataTask": "Erabiltzaileen datuak garbitzeko zeregina"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -69,7 +69,7 @@
|
|||||||
"TvShows": "Sarjat",
|
"TvShows": "Sarjat",
|
||||||
"Sync": "Synkronointi",
|
"Sync": "Synkronointi",
|
||||||
"SubtitleDownloadFailureFromForItem": "Tekstityksen lataus lähteestä \"{0}\" kohteelle \"{1}\" epäonnistui",
|
"SubtitleDownloadFailureFromForItem": "Tekstityksen lataus lähteestä \"{0}\" kohteelle \"{1}\" epäonnistui",
|
||||||
"StartupEmbyServerIsLoading": "Jellyfin-palvelin latautuu. Yritä hetken kuluttua uudelleen.",
|
"StartupEmbyServerIsLoading": "Jellyfin-palvelin on latautumassa. Yritä hetken kuluttua uudelleen.",
|
||||||
"Songs": "Kappaleet",
|
"Songs": "Kappaleet",
|
||||||
"Shows": "Sarjat",
|
"Shows": "Sarjat",
|
||||||
"ServerNameNeedsToBeRestarted": "\"{0}\" on käynnistettävä uudelleen",
|
"ServerNameNeedsToBeRestarted": "\"{0}\" on käynnistettävä uudelleen",
|
||||||
@@ -79,7 +79,7 @@
|
|||||||
"NotificationOptionVideoPlayback": "Videon toisto aloitettu",
|
"NotificationOptionVideoPlayback": "Videon toisto aloitettu",
|
||||||
"NotificationOptionUserLockedOut": "Käyttäjä on lukittu",
|
"NotificationOptionUserLockedOut": "Käyttäjä on lukittu",
|
||||||
"NotificationOptionTaskFailed": "Ajoitettu tehtävä epäonnistui",
|
"NotificationOptionTaskFailed": "Ajoitettu tehtävä epäonnistui",
|
||||||
"NotificationOptionServerRestartRequired": "Tarvitaan palvelimen uudelleenkäynnistys",
|
"NotificationOptionServerRestartRequired": "Palvelimen uudelleenkäynnistys vaaditaan",
|
||||||
"NotificationOptionPluginUpdateInstalled": "Lisäosa päivitettiin",
|
"NotificationOptionPluginUpdateInstalled": "Lisäosa päivitettiin",
|
||||||
"NotificationOptionPluginUninstalled": "Lisäosa poistettiin",
|
"NotificationOptionPluginUninstalled": "Lisäosa poistettiin",
|
||||||
"NotificationOptionPluginInstalled": "Lisäosa asennettiin",
|
"NotificationOptionPluginInstalled": "Lisäosa asennettiin",
|
||||||
@@ -135,5 +135,7 @@
|
|||||||
"TaskDownloadMissingLyricsDescription": "Ladataan sanoituksia",
|
"TaskDownloadMissingLyricsDescription": "Ladataan sanoituksia",
|
||||||
"TaskExtractMediaSegmentsDescription": "Poimii tai hankkii mediasegmenttejä MediaSegment-yhteensopivista laajennuksista.",
|
"TaskExtractMediaSegmentsDescription": "Poimii tai hankkii mediasegmenttejä MediaSegment-yhteensopivista laajennuksista.",
|
||||||
"TaskMoveTrickplayImages": "Siirrä Trickplay-kuvien sijainti",
|
"TaskMoveTrickplayImages": "Siirrä Trickplay-kuvien sijainti",
|
||||||
"TaskMoveTrickplayImagesDescription": "Siirtää olemassa olevia trickplay-tiedostoja kirjaston asetusten mukaan."
|
"TaskMoveTrickplayImagesDescription": "Siirtää olemassa olevia trickplay-tiedostoja kirjaston asetusten mukaan.",
|
||||||
|
"CleanupUserDataTask": "Käyttäjätietojen puhdistustehtävä",
|
||||||
|
"CleanupUserDataTaskDescription": "Puhdistaa kaikki käyttäjätiedot (katselutila, suosikit ym.) medioista, joita ei ole ollut saatavilla yli 90 päivään."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,5 +135,7 @@
|
|||||||
"TaskUpdatePlugins": "Nuashonraigh Breiseáin",
|
"TaskUpdatePlugins": "Nuashonraigh Breiseáin",
|
||||||
"TaskCleanTranscodeDescription": "Scriostar comhaid traschódaithe níos mó ná lá amháin d'aois.",
|
"TaskCleanTranscodeDescription": "Scriostar comhaid traschódaithe níos mó ná lá amháin d'aois.",
|
||||||
"TaskCleanTranscode": "Eolaire Transcode Glan",
|
"TaskCleanTranscode": "Eolaire Transcode Glan",
|
||||||
"TaskDownloadMissingSubtitles": "Íosluchtaigh fotheidil ar iarraidh"
|
"TaskDownloadMissingSubtitles": "Íosluchtaigh fotheidil ar iarraidh",
|
||||||
|
"CleanupUserDataTask": "Tasc glantacháin sonraí úsáideora",
|
||||||
|
"CleanupUserDataTaskDescription": "Glanann sé gach sonraí úsáideora (stádas faire, stádas is fearr leat srl.) ó mheáin nach bhfuil i láthair a thuilleadh ar feadh 90 lá ar a laghad."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,74 +1,74 @@
|
|||||||
{
|
{
|
||||||
"Albums": "Álbumes",
|
"Albums": "Álbums",
|
||||||
"Collections": "Coleccións",
|
"Collections": "Coleccións",
|
||||||
"ChapterNameValue": "Capítulo {0}",
|
"ChapterNameValue": "Capítulo {0}",
|
||||||
"Channels": "Canles",
|
"Channels": "Canles",
|
||||||
"CameraImageUploadedFrom": "Cargouse unha nova imaxe da cámara desde {0}",
|
"CameraImageUploadedFrom": "Cargouse unha nova imaxe de cámara dende {0}",
|
||||||
"Books": "Libros",
|
"Books": "Libros",
|
||||||
"AuthenticationSucceededWithUserName": "{0} autenticouse correctamente",
|
"AuthenticationSucceededWithUserName": "{0} autenticouse correctamente",
|
||||||
"Artists": "Artistas",
|
"Artists": "Artistas",
|
||||||
"Application": "Aplicativo",
|
"Application": "Aplicación",
|
||||||
"NotificationOptionServerRestartRequired": "Necesario un reinicio do servidor",
|
"NotificationOptionServerRestartRequired": "Necesario o reinicio do servidor",
|
||||||
"NotificationOptionPluginUpdateInstalled": "Actualización do Plugin instalada",
|
"NotificationOptionPluginUpdateInstalled": "Actualización do plugin instalada",
|
||||||
"NotificationOptionPluginUninstalled": "Plugin desinstalado",
|
"NotificationOptionPluginUninstalled": "Plugin desinstalado",
|
||||||
"NotificationOptionPluginInstalled": "Plugin instalado",
|
"NotificationOptionPluginInstalled": "Plugin instalado",
|
||||||
"NotificationOptionPluginError": "Fallo do Plugin",
|
"NotificationOptionPluginError": "Fallo do plugin",
|
||||||
"NotificationOptionNewLibraryContent": "Novo contido engadido",
|
"NotificationOptionNewLibraryContent": "Novo contido engadido",
|
||||||
"NotificationOptionInstallationFailed": "Fallo na instalación",
|
"NotificationOptionInstallationFailed": "Fallo na instalación",
|
||||||
"NotificationOptionCameraImageUploaded": "Imaxe da cámara subida",
|
"NotificationOptionCameraImageUploaded": "Imaxe da cámara cargada",
|
||||||
"NotificationOptionAudioPlaybackStopped": "Reproducción de audio parada",
|
"NotificationOptionAudioPlaybackStopped": "Reproducción de audio detida",
|
||||||
"NotificationOptionAudioPlayback": "Reproducción de audio comezada",
|
"NotificationOptionAudioPlayback": "Reproducción de audio comezada",
|
||||||
"NotificationOptionApplicationUpdateInstalled": "Actualización da aplicación instalada",
|
"NotificationOptionApplicationUpdateInstalled": "Actualización da aplicación instalada",
|
||||||
"NotificationOptionApplicationUpdateAvailable": "Actualización da aplicación dispoñible",
|
"NotificationOptionApplicationUpdateAvailable": "Actualización da aplicación dispoñible",
|
||||||
"NewVersionIsAvailable": "Unha nova versión do Servidor Jellyfin está dispoñible para descarga.",
|
"NewVersionIsAvailable": "Nova versión do Servidor Jellyfin dispoñible para descargar.",
|
||||||
"NameSeasonUnknown": "Tempada descoñecida",
|
"NameSeasonUnknown": "Tempada descoñecida",
|
||||||
"NameSeasonNumber": "Tempada {0}",
|
"NameSeasonNumber": "Tempada {0}",
|
||||||
"NameInstallFailed": "{0} instalación fallida",
|
"NameInstallFailed": "{0} instalación fallida",
|
||||||
"MusicVideos": "Vídeos Musicais",
|
"MusicVideos": "Vídeos musicais",
|
||||||
"Music": "Música",
|
"Music": "Música",
|
||||||
"Movies": "Películas",
|
"Movies": "Películas",
|
||||||
"MixedContent": "Contido Mixto",
|
"MixedContent": "Contido mixto",
|
||||||
"MessageServerConfigurationUpdated": "A configuración do servidor foi actualizada",
|
"MessageServerConfigurationUpdated": "Actualizouse a configuración do servidor",
|
||||||
"MessageNamedServerConfigurationUpdatedWithValue": "A sección de configuración {0} do servidor foi actualizada",
|
"MessageNamedServerConfigurationUpdatedWithValue": "Actualizouse a sección de configuración {0} do servidor",
|
||||||
"MessageApplicationUpdatedTo": "O servidor Jellyfin foi actualizado a {0}",
|
"MessageApplicationUpdatedTo": "O servidor Jellyfin actualizouse a {0}",
|
||||||
"MessageApplicationUpdated": "O servidor Jellyfin foi actualizado",
|
"MessageApplicationUpdated": "O servidor Jellyfin actualizouse",
|
||||||
"Latest": "Último",
|
"Latest": "Último",
|
||||||
"LabelRunningTimeValue": "Tempo de execución: {0}",
|
"LabelRunningTimeValue": "Tempo en execución: {0}",
|
||||||
"LabelIpAddressValue": "Enderezo IP: {0}",
|
"LabelIpAddressValue": "Enderezo IP: {0}",
|
||||||
"ItemRemovedWithName": "{0} foi eliminado da biblioteca",
|
"ItemRemovedWithName": "{0} eliminouse da biblioteca",
|
||||||
"ItemAddedWithName": "{0} foi engadido a biblioteca",
|
"ItemAddedWithName": "{0} engadiuse á biblioteca",
|
||||||
"Inherit": "Herdar",
|
"Inherit": "Herdar",
|
||||||
"HomeVideos": "Videos caseiros",
|
"HomeVideos": "Videos caseiros",
|
||||||
"HeaderRecordingGroups": "Grupos de Grabación",
|
"HeaderRecordingGroups": "Grupos de grabación",
|
||||||
"HeaderNextUp": "De seguido",
|
"HeaderNextUp": "De seguido",
|
||||||
"HeaderLiveTV": "TV en directo",
|
"HeaderLiveTV": "TV en directo",
|
||||||
"HeaderFavoriteSongs": "Cancións Favoritas",
|
"HeaderFavoriteSongs": "Cancións favoritas",
|
||||||
"HeaderFavoriteShows": "Series de TV Favoritas",
|
"HeaderFavoriteShows": "Series de TV favoritas",
|
||||||
"HeaderFavoriteEpisodes": "Episodios Favoritos",
|
"HeaderFavoriteEpisodes": "Episodios favoritos",
|
||||||
"HeaderFavoriteArtists": "Artistas Favoritos",
|
"HeaderFavoriteArtists": "Artistas favoritos",
|
||||||
"HeaderFavoriteAlbums": "Álbunes Favoritos",
|
"HeaderFavoriteAlbums": "Álbums favoritos",
|
||||||
"HeaderContinueWatching": "Seguir vendo",
|
"HeaderContinueWatching": "Seguir vendo",
|
||||||
"HeaderAlbumArtists": "Artistas do Album",
|
"HeaderAlbumArtists": "Artistas do álbum",
|
||||||
"Genres": "Xéneros",
|
"Genres": "Xéneros",
|
||||||
"Forced": "Forzado",
|
"Forced": "Forzado",
|
||||||
"Folders": "Cartafoles",
|
"Folders": "Cartafoles",
|
||||||
"Favorites": "Favoritos",
|
"Favorites": "Favoritos",
|
||||||
"FailedLoginAttemptWithUserName": "Intento de incio de sesión fallido {0}",
|
"FailedLoginAttemptWithUserName": "Fallo de intento de inicio de sesión dende {0}",
|
||||||
"DeviceOnlineWithName": "{0} conectouse",
|
"DeviceOnlineWithName": "{0} conectouse",
|
||||||
"DeviceOfflineWithName": "{0} desconectouse",
|
"DeviceOfflineWithName": "{0} desconectouse",
|
||||||
"Default": "Por defecto",
|
"Default": "Por defecto",
|
||||||
"AppDeviceValues": "Aplicación: {0}, Dispositivo: {1}",
|
"AppDeviceValues": "Aplicación: {0}, Dispositivo: {1}",
|
||||||
"TaskCleanLogs": "Limpar Carpeta de Rexistros",
|
"TaskCleanLogs": "Limpar directorio de rexistros",
|
||||||
"TaskCleanActivityLog": "Limpar Rexistro de Actividade",
|
"TaskCleanActivityLog": "Limpar rexistro de actividade",
|
||||||
"TasksChannelsCategory": "Canáis de Internet",
|
"TasksChannelsCategory": "Canles da Internet",
|
||||||
"TaskUpdatePlugins": "Actualizar Plugins",
|
"TaskUpdatePlugins": "Actualizar plugins",
|
||||||
"User": "Usuario",
|
"User": "Usuario",
|
||||||
"Undefined": "Sen definir",
|
"Undefined": "Sen definir",
|
||||||
"TvShows": "Programas de TV",
|
"TvShows": "Programas de TV",
|
||||||
"System": "Sistema",
|
"System": "Sistema",
|
||||||
"Sync": "Sincronizar",
|
"Sync": "Sincronizar",
|
||||||
"SubtitleDownloadFailureFromForItem": "Fallou a descarga de subtítulos para {1} dende {0}",
|
"SubtitleDownloadFailureFromForItem": "Fallou a descarga de subtítulos para {1} dende {0}",
|
||||||
"StartupEmbyServerIsLoading": "O Servidor Jellyfin está cargando. Por favor, reinténteo en breve.",
|
"StartupEmbyServerIsLoading": "O servidor Jellyfin está cargando. Por favor, ténteo axiña outra vez.",
|
||||||
"Songs": "Cancións",
|
"Songs": "Cancións",
|
||||||
"Shows": "Programas",
|
"Shows": "Programas",
|
||||||
"ServerNameNeedsToBeRestarted": "{0} precisa ser reiniciado",
|
"ServerNameNeedsToBeRestarted": "{0} precisa ser reiniciado",
|
||||||
@@ -85,55 +85,57 @@
|
|||||||
"UserDeletedWithName": "O usuario {0} foi borrado",
|
"UserDeletedWithName": "O usuario {0} foi borrado",
|
||||||
"UserCreatedWithName": "O usuario {0} foi creado",
|
"UserCreatedWithName": "O usuario {0} foi creado",
|
||||||
"Plugin": "Plugin",
|
"Plugin": "Plugin",
|
||||||
"NotificationOptionVideoPlaybackStopped": "Reproducción de vídeo parada",
|
"NotificationOptionVideoPlaybackStopped": "Reproducción de vídeo detida",
|
||||||
"NotificationOptionVideoPlayback": "Reproducción de vídeo iniciada",
|
"NotificationOptionVideoPlayback": "Reproducción de vídeo iniciada",
|
||||||
"NotificationOptionUserLockedOut": "Usuario bloqueado",
|
"NotificationOptionUserLockedOut": "Usuario bloqueado",
|
||||||
"NotificationOptionTaskFailed": "Falla na tarefa axendada",
|
"NotificationOptionTaskFailed": "Falla na tarefa axendada",
|
||||||
"TaskCleanTranscodeDescription": "Borra os arquivos de transcode anteriores a un día.",
|
"TaskCleanTranscodeDescription": "Borra os ficheiros de transcodificación de hai más dun día.",
|
||||||
"TaskCleanTranscode": "Limpar Directorio de Transcode",
|
"TaskCleanTranscode": "Limpar o directorio de transcodificación",
|
||||||
"UserStoppedPlayingItemWithValues": "{0} rematou de reproducir {1} en {2}",
|
"UserStoppedPlayingItemWithValues": "{0} rematou de reproducir {1} en {2}",
|
||||||
"UserStartedPlayingItemWithValues": "{0} está reproducindo {1} en {2}",
|
"UserStartedPlayingItemWithValues": "{0} está a reproducir {1} en {2}",
|
||||||
"TaskDownloadMissingSubtitlesDescription": "Busca en internet por subtítulos que faltan baseado na configuración de metadatos.",
|
"TaskDownloadMissingSubtitlesDescription": "Procura na internet os subtítulos que faltan segundo a configuración de metadatos.",
|
||||||
"TaskDownloadMissingSubtitles": "Descargar subtítulos que faltan",
|
"TaskDownloadMissingSubtitles": "Descargar subtítulos que faltan",
|
||||||
"TaskRefreshChannelsDescription": "Refresca a información do canle de internet.",
|
"TaskRefreshChannelsDescription": "Refresca a información da canle de internet.",
|
||||||
"TaskRefreshChannels": "Refrescar Canles",
|
"TaskRefreshChannels": "Refrescar canles",
|
||||||
"TaskUpdatePluginsDescription": "Descarga e instala actualizacións para plugins que están configurados para actualizarse automáticamente.",
|
"TaskUpdatePluginsDescription": "Descarga e instala actualizacións dos plugins configurados para actualizarse automáticamente.",
|
||||||
"TaskRefreshPeopleDescription": "Actualiza os metadatos dos actores e directores na túa libraría multimedia.",
|
"TaskRefreshPeopleDescription": "Actualiza os metadatos dos actores e directores na túa biblioteca de medios.",
|
||||||
"TaskRefreshPeople": "Refrescar Persoas",
|
"TaskRefreshPeople": "Refrescar persoas",
|
||||||
"TaskCleanLogsDescription": "Borra arquivos de rexistro que son mais antigos que {0} días.",
|
"TaskCleanLogsDescription": "Borra ficheiros de rexistro con máis de {0} días de antigüidade.",
|
||||||
"TaskRefreshLibraryDescription": "Escanea a tua libraría multimedia buscando novos arquivos e refrescando os metadatos.",
|
"TaskRefreshLibraryDescription": "Escanea a túa biblioteca de medios á procura de novos ficheiros e refresca os metadatos.",
|
||||||
"TaskRefreshLibrary": "Escanear Libraría Multimedia",
|
"TaskRefreshLibrary": "Escanear a biblioteca de medios",
|
||||||
"TaskRefreshChapterImagesDescription": "Crea previsualizacións para videos que teñen capítulos.",
|
"TaskRefreshChapterImagesDescription": "Crea miniaturas dos vídeos que teñen capítulos.",
|
||||||
"TaskRefreshChapterImages": "Extraer Imaxes dos Capítulos",
|
"TaskRefreshChapterImages": "Extraer imaxes dos capítulos",
|
||||||
"TaskCleanCacheDescription": "Borra ficheiros da caché que xa non son necesarios para o sistema.",
|
"TaskCleanCacheDescription": "Borra ficheiros da caché que xa non son necesarios para o sistema.",
|
||||||
"TaskCleanCache": "Limpa Directorio de Caché",
|
"TaskCleanCache": "Limpar directorio de caché",
|
||||||
"TaskCleanActivityLogDescription": "Borra as entradas no rexistro de actividade anteriores á data configurada.",
|
"TaskCleanActivityLogDescription": "Borra do rexistro de actividade as entradas anteriores á data configurada.",
|
||||||
"TasksApplicationCategory": "Aplicación",
|
"TasksApplicationCategory": "Aplicación",
|
||||||
"ValueSpecialEpisodeName": "Especial - {0}",
|
"ValueSpecialEpisodeName": "Especial - {0}",
|
||||||
"ValueHasBeenAddedToLibrary": "{0} foi engadido a túa libraría multimedia",
|
"ValueHasBeenAddedToLibrary": "{0} engadiuse á túa biblioteca de medios",
|
||||||
"TasksLibraryCategory": "Libraría",
|
"TasksLibraryCategory": "Biblioteca",
|
||||||
"TasksMaintenanceCategory": "Mantemento",
|
"TasksMaintenanceCategory": "Mantemento",
|
||||||
"VersionNumber": "Versión {0}",
|
"VersionNumber": "Versión {0}",
|
||||||
"UserPolicyUpdatedWithName": "A política de usuario foi actualizada para {0}",
|
"UserPolicyUpdatedWithName": "A política de usuario foi actualizada para {0}",
|
||||||
"UserPasswordChangedWithName": "Cambiouse o contrasinal para o usuario {0}",
|
"UserPasswordChangedWithName": "Cambiouse o contrasinal para o usuario {0}",
|
||||||
"UserOnlineFromDevice": "{0} está en liña desde {1}",
|
"UserOnlineFromDevice": "{0} está en liña desde {1}",
|
||||||
"UserOfflineFromDevice": "{0} desconectouse desde {1}",
|
"UserOfflineFromDevice": "{0} desconectouse dende {1}",
|
||||||
"TaskOptimizeDatabaseDescription": "Compacta e libera o espazo libre da base de datos. Executar esta tarefa logo de realizar mudanzas que impliquen modificacións da base de datos ou despois de escanear a biblioteca pode traer mellorías de desempeño.",
|
"TaskOptimizeDatabaseDescription": "Compacta e libera espazo na base de datos. Executar esta tarefa logo de facer cambios que muden a base de datos ou despois de escanear a biblioteca pode mellorar o rendemento.",
|
||||||
"TaskOptimizeDatabase": "Optimizar base de datos",
|
"TaskOptimizeDatabase": "Optimizar base de datos",
|
||||||
"TaskKeyframeExtractorDescription": "Extrae fragmentos do vídeo para crear listas de reprodución HLS máis precisas. Podería levarlle bastante tempo.",
|
"TaskKeyframeExtractorDescription": "Extrae fotogramas clave dos vídeos para crear listas de reprodución HLS máis precisas. Podería levar moito tempo.",
|
||||||
"External": "Externo",
|
"External": "Externo",
|
||||||
"HearingImpaired": "Problemas de audición",
|
"HearingImpaired": "Problemas de audición",
|
||||||
"TaskKeyframeExtractor": "Extractor de fragmentos",
|
"TaskKeyframeExtractor": "Extractor de fotogramas clave",
|
||||||
"TaskAudioNormalization": "Normalización do audio",
|
"TaskAudioNormalization": "Normalización de volume",
|
||||||
"TaskRefreshTrickplayImagesDescription": "Crea vistas previas de reprodución con truco para vídeos en bibliotecas activadas.",
|
"TaskRefreshTrickplayImagesDescription": "Crea miniaturas de previsualización para os vídeos nas bibliotecas habilitadas.",
|
||||||
"TaskDownloadMissingLyrics": "Descargar letras que faltan",
|
"TaskDownloadMissingLyrics": "Descargar letras que faltan",
|
||||||
"TaskDownloadMissingLyricsDescription": "Descargas de letras das cancións",
|
"TaskDownloadMissingLyricsDescription": "Descarga as letras das cancións",
|
||||||
"TaskCleanCollectionsAndPlaylists": "Limpar coleccións e listas de reprodución",
|
"TaskCleanCollectionsAndPlaylists": "Limpar coleccións e listas de reprodución",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "Elimina elementos de coleccións e listas de reprodución que xa non existen.",
|
"TaskCleanCollectionsAndPlaylistsDescription": "Quita ítems que xa non existen das coleccións e listas de reprodución.",
|
||||||
"TaskExtractMediaSegmentsDescription": "Extrae ou obtén segmentos multimedia de complementos habilitados para o Segmento de medios.",
|
"TaskExtractMediaSegmentsDescription": "Procura segmentos de medios cos plugins habilitados.",
|
||||||
"TaskExtractMediaSegments": "Escaneo de segmentos multimedia",
|
"TaskExtractMediaSegments": "Escaneo de segmentos de medios",
|
||||||
"TaskMoveTrickplayImages": "Migrar a localización da imaxe de Trickplay",
|
"TaskMoveTrickplayImages": "Migrar as miniaturas de previsualización a outra ubicación",
|
||||||
"TaskMoveTrickplayImagesDescription": "Move os ficheiros de reprodución con trickplay existentes segundo a configuración da biblioteca.",
|
"TaskMoveTrickplayImagesDescription": "Move as miniaturas de previsualización segundo a configuración da biblioteca.",
|
||||||
"TaskRefreshTrickplayImages": "Xerar imaxes de Trickplay",
|
"TaskRefreshTrickplayImages": "Xerar miniaturas de previsualización",
|
||||||
"TaskAudioNormalizationDescription": "Analiza ficheiros para obter datos de normalización de audio."
|
"TaskAudioNormalizationDescription": "Escanea ficheiros á procura de datos de normalización de volume.",
|
||||||
|
"CleanupUserDataTask": "Tarefa de limpeza de datos dos usuarios",
|
||||||
|
"CleanupUserDataTaskDescription": "Limpa todos os datos do usuario (estado de visualización, de favorito etc.) dos medios ausentes polo menos 90 días."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,10 +12,10 @@
|
|||||||
"DeviceOfflineWithName": "{0} wurde getrennt",
|
"DeviceOfflineWithName": "{0} wurde getrennt",
|
||||||
"DeviceOnlineWithName": "{0} ist verbunden",
|
"DeviceOnlineWithName": "{0} ist verbunden",
|
||||||
"FailedLoginAttemptWithUserName": "Fehlgeschlagener Anmeldeversuch von {0}",
|
"FailedLoginAttemptWithUserName": "Fehlgeschlagener Anmeldeversuch von {0}",
|
||||||
"Favorites": "Favoriten",
|
"Favorites": "Favorite",
|
||||||
"Folders": "Ordner",
|
"Folders": "Ordner",
|
||||||
"Genres": "Genre",
|
"Genres": "Genre",
|
||||||
"HeaderAlbumArtists": "Album-Künstler",
|
"HeaderAlbumArtists": "Album-Künschtler",
|
||||||
"HeaderContinueWatching": "weiter schauen",
|
"HeaderContinueWatching": "weiter schauen",
|
||||||
"HeaderFavoriteAlbums": "Lieblingsalben",
|
"HeaderFavoriteAlbums": "Lieblingsalben",
|
||||||
"HeaderFavoriteArtists": "Lieblings-Künstler",
|
"HeaderFavoriteArtists": "Lieblings-Künstler",
|
||||||
|
|||||||
@@ -32,8 +32,8 @@
|
|||||||
"LabelIpAddressValue": "Ip כתובת: {0}",
|
"LabelIpAddressValue": "Ip כתובת: {0}",
|
||||||
"LabelRunningTimeValue": "משך צפייה: {0}",
|
"LabelRunningTimeValue": "משך צפייה: {0}",
|
||||||
"Latest": "אחרון",
|
"Latest": "אחרון",
|
||||||
"MessageApplicationUpdated": "שרת ג'ליפין עודכן",
|
"MessageApplicationUpdated": "שרת Jellyfin עודכן",
|
||||||
"MessageApplicationUpdatedTo": "שרת ג'ליפין עודכן לגרסה {0}",
|
"MessageApplicationUpdatedTo": "שרת Jellyfin עודכן לגרסה {0}",
|
||||||
"MessageNamedServerConfigurationUpdatedWithValue": "סעיף הגדרת השרת {0} עודכן",
|
"MessageNamedServerConfigurationUpdatedWithValue": "סעיף הגדרת השרת {0} עודכן",
|
||||||
"MessageServerConfigurationUpdated": "תצורת השרת עודכנה",
|
"MessageServerConfigurationUpdated": "תצורת השרת עודכנה",
|
||||||
"MixedContent": "תוכן מעורב",
|
"MixedContent": "תוכן מעורב",
|
||||||
@@ -43,7 +43,7 @@
|
|||||||
"NameInstallFailed": "התקנת {0} נכשלה",
|
"NameInstallFailed": "התקנת {0} נכשלה",
|
||||||
"NameSeasonNumber": "עונה {0}",
|
"NameSeasonNumber": "עונה {0}",
|
||||||
"NameSeasonUnknown": "עונה לא ידועה",
|
"NameSeasonUnknown": "עונה לא ידועה",
|
||||||
"NewVersionIsAvailable": "גרסה חדשה של שרת ג'ליפין זמינה להורדה.",
|
"NewVersionIsAvailable": "גרסה חדשה של שרת Jellyfin זמינה להורדה.",
|
||||||
"NotificationOptionApplicationUpdateAvailable": "קיים עדכון זמין ליישום",
|
"NotificationOptionApplicationUpdateAvailable": "קיים עדכון זמין ליישום",
|
||||||
"NotificationOptionApplicationUpdateInstalled": "עדכון ליישום הותקן",
|
"NotificationOptionApplicationUpdateInstalled": "עדכון ליישום הותקן",
|
||||||
"NotificationOptionAudioPlayback": "ניגון שמע החל",
|
"NotificationOptionAudioPlayback": "ניגון שמע החל",
|
||||||
@@ -72,7 +72,7 @@
|
|||||||
"ServerNameNeedsToBeRestarted": "{0} דורש הפעלה מחדש",
|
"ServerNameNeedsToBeRestarted": "{0} דורש הפעלה מחדש",
|
||||||
"Shows": "סדרות",
|
"Shows": "סדרות",
|
||||||
"Songs": "שירים",
|
"Songs": "שירים",
|
||||||
"StartupEmbyServerIsLoading": "שרת ג'ליפין טוען. נא לנסות שוב בקרוב.",
|
"StartupEmbyServerIsLoading": "שרת Jellyfin בתהליך טעינה. נא לנסות שוב בקרוב.",
|
||||||
"SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
|
"SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
|
||||||
"SubtitleDownloadFailureFromForItem": "הורדת כתוביות מ־{0} עבור {1} נכשלה",
|
"SubtitleDownloadFailureFromForItem": "הורדת כתוביות מ־{0} עבור {1} נכשלה",
|
||||||
"Sync": "סנכרון",
|
"Sync": "סנכרון",
|
||||||
@@ -100,14 +100,14 @@
|
|||||||
"TasksLibraryCategory": "ספרייה",
|
"TasksLibraryCategory": "ספרייה",
|
||||||
"TasksMaintenanceCategory": "תחזוקה",
|
"TasksMaintenanceCategory": "תחזוקה",
|
||||||
"TaskUpdatePlugins": "עדכן תוספים",
|
"TaskUpdatePlugins": "עדכן תוספים",
|
||||||
"TaskRefreshPeopleDescription": "מעדכן מטא נתונים עבור שחקנים ובמאים בספריית המדיה שלך.",
|
"TaskRefreshPeopleDescription": "מעדכן מטא-דאטה עבור שחקנים ובמאים בספריית המדיה שלך.",
|
||||||
"TaskRefreshPeople": "רענן אנשים",
|
"TaskRefreshPeople": "רענן אנשים",
|
||||||
"TaskCleanLogsDescription": "מוחק קבצי יומן בני יותר מ- {0} ימים.",
|
"TaskCleanLogsDescription": "מוחק קבצי יומן בני יותר מ- {0} ימים.",
|
||||||
"TaskCleanLogs": "ניקוי תיקיית יומן",
|
"TaskCleanLogs": "ניקוי תיקיית יומן",
|
||||||
"TaskRefreshLibraryDescription": "סורק את ספריית המדיה שלך אחר קבצים חדשים ומרענן מטא נתונים.",
|
"TaskRefreshLibraryDescription": "סורק את ספריית המדיה שלך אחר קבצים חדשים ומרענן מטא-דאטה.",
|
||||||
"TaskRefreshChapterImagesDescription": "יוצר תמונות ממוזערות לסרטונים שיש להם פרקים.",
|
"TaskRefreshChapterImagesDescription": "יוצר תמונות ממוזערות לסרטונים שיש להם פרקים.",
|
||||||
"TasksChannelsCategory": "ערוצי אינטרנט",
|
"TasksChannelsCategory": "ערוצי אינטרנט",
|
||||||
"TaskDownloadMissingSubtitlesDescription": "חפש באינטרנט עבור הכתוביות החסרות בהתבסס על המטה-דיאטה.",
|
"TaskDownloadMissingSubtitlesDescription": "חפש באינטרנט כתוביות חסרות בהתבסס על המטא-דאטה.",
|
||||||
"TaskDownloadMissingSubtitles": "הורד כתוביות חסרות",
|
"TaskDownloadMissingSubtitles": "הורד כתוביות חסרות",
|
||||||
"TaskRefreshChannelsDescription": "רענן פרטי ערוץ אינטרנטי.",
|
"TaskRefreshChannelsDescription": "רענן פרטי ערוץ אינטרנטי.",
|
||||||
"TaskRefreshChannels": "רענן ערוץ",
|
"TaskRefreshChannels": "רענן ערוץ",
|
||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskMoveTrickplayImages": "העברת מיקום של תמונות Trickplay",
|
"TaskMoveTrickplayImages": "העברת מיקום של תמונות Trickplay",
|
||||||
"TaskExtractMediaSegments": "סריקת מדיה",
|
"TaskExtractMediaSegments": "סריקת מדיה",
|
||||||
"TaskExtractMediaSegmentsDescription": "מחלץ חלקי מדיה מתוספים המאפשרים זאת.",
|
"TaskExtractMediaSegmentsDescription": "מחלץ חלקי מדיה מתוספים המאפשרים זאת.",
|
||||||
"TaskMoveTrickplayImagesDescription": "הזזת קבצי Trickplay קיימים בהתאם להגדרות הספרייה."
|
"TaskMoveTrickplayImagesDescription": "הזזת קבצי Trickplay קיימים בהתאם להגדרות הספרייה.",
|
||||||
|
"CleanupUserDataTaskDescription": "ניקוי כל המידע של המשתמש (מצב צפייה, מועדפים וכו) ממדיה שאינה קיימת מעל 90 יום.",
|
||||||
|
"CleanupUserDataTask": "משימת ניקוי מידע משתמש"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -125,8 +125,8 @@
|
|||||||
"TaskKeyframeExtractor": "Izvoditelj ključnog okvira",
|
"TaskKeyframeExtractor": "Izvoditelj ključnog okvira",
|
||||||
"TaskOptimizeDatabaseDescription": "Sažima bazu podataka i uklanja prazan prostor. Pokretanje ovog zadatka, može poboljšati performanse nakon provođenja indeksiranja biblioteke ili provođenja drugih promjena koje utječu na bazu podataka.",
|
"TaskOptimizeDatabaseDescription": "Sažima bazu podataka i uklanja prazan prostor. Pokretanje ovog zadatka, može poboljšati performanse nakon provođenja indeksiranja biblioteke ili provođenja drugih promjena koje utječu na bazu podataka.",
|
||||||
"HearingImpaired": "Oštećen sluh",
|
"HearingImpaired": "Oštećen sluh",
|
||||||
"TaskRefreshTrickplayImages": "Generiraj Trickplay Slike",
|
"TaskRefreshTrickplayImages": "Generiraj slike brzog pregledavanja",
|
||||||
"TaskRefreshTrickplayImagesDescription": "Kreira trickplay pretpreglede za videe u omogućenim knjižnicama.",
|
"TaskRefreshTrickplayImagesDescription": "Stvara preglede brzog pregledavanja za videa u aktiviranim bibliotekama.",
|
||||||
"TaskAudioNormalization": "Normalizacija zvuka",
|
"TaskAudioNormalization": "Normalizacija zvuka",
|
||||||
"TaskAudioNormalizationDescription": "Skenira datoteke u potrazi za podacima o normalizaciji zvuka.",
|
"TaskAudioNormalizationDescription": "Skenira datoteke u potrazi za podacima o normalizaciji zvuka.",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "Uklanja stavke iz zbirki i popisa za reprodukciju koje više ne postoje.",
|
"TaskCleanCollectionsAndPlaylistsDescription": "Uklanja stavke iz zbirki i popisa za reprodukciju koje više ne postoje.",
|
||||||
@@ -135,6 +135,8 @@
|
|||||||
"TaskDownloadMissingLyrics": "Preuzmi tekstove koji nedostaju",
|
"TaskDownloadMissingLyrics": "Preuzmi tekstove koji nedostaju",
|
||||||
"TaskDownloadMissingLyricsDescription": "Preuzmi tekstove pjesama",
|
"TaskDownloadMissingLyricsDescription": "Preuzmi tekstove pjesama",
|
||||||
"TaskExtractMediaSegmentsDescription": "Izvlači ili pribavlja dijelove medija iz omogućenih media pluginova.",
|
"TaskExtractMediaSegmentsDescription": "Izvlači ili pribavlja dijelove medija iz omogućenih media pluginova.",
|
||||||
"TaskMoveTrickplayImages": "Preseli lokaciju Trickplay slika",
|
"TaskMoveTrickplayImages": "Premjesti mjesto slika brzog pregledavanja",
|
||||||
"TaskMoveTrickplayImagesDescription": "Preseli lokaciju Trickplay slika prema postavkama zbirke."
|
"TaskMoveTrickplayImagesDescription": "Premješta postojeće datoteke brzog pregledavanja prema postavkama biblioteke.",
|
||||||
|
"CleanupUserDataTask": "Zadatak čišćenja korisničkih podataka",
|
||||||
|
"CleanupUserDataTaskDescription": "Briše sve korisničke podatke (stanje gledanja, status favorita itd.) s medija koji više nisu prisutni najmanje 90 dana."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,62 @@
|
|||||||
{
|
{
|
||||||
"Books": "liv"
|
"Books": "Liv",
|
||||||
|
"TasksLibraryCategory": "Libreri",
|
||||||
|
"Albums": "Albòm yo",
|
||||||
|
"Artists": "Atis yo",
|
||||||
|
"Application": "Aplikasyon",
|
||||||
|
"Channels": "Kanal yo",
|
||||||
|
"ChapterNameValue": "Chapit {0}",
|
||||||
|
"Default": "Defo",
|
||||||
|
"DeviceOnlineWithName": "{0} konekte",
|
||||||
|
"DeviceOfflineWithName": "{0} dekonekte",
|
||||||
|
"External": "Extèn",
|
||||||
|
"Collections": "Koleksyon yo",
|
||||||
|
"Favorites": "Pi Renmen",
|
||||||
|
"Folders": "Dosye",
|
||||||
|
"Genres": "Jan yo",
|
||||||
|
"Forced": "Fòse",
|
||||||
|
"HeaderAlbumArtists": "Albòm Atis",
|
||||||
|
"HeaderContinueWatching": "Kontinye Kade",
|
||||||
|
"HeaderFavoriteAlbums": "Albòm Pi Renmen",
|
||||||
|
"HeaderFavoriteArtists": "Atis Pi Renmen",
|
||||||
|
"HeaderFavoriteEpisodes": "Epizòd Pi Renmen",
|
||||||
|
"HeaderFavoriteShows": "Emisyon Pi Renmen",
|
||||||
|
"HeaderFavoriteSongs": "Mizik Pi Renmen",
|
||||||
|
"HeaderLiveTV": "Televizyon an Direk",
|
||||||
|
"HeaderNextUp": "Pwochen an",
|
||||||
|
"HomeVideos": "Videyo Lakay",
|
||||||
|
"Latest": "Pi Resan",
|
||||||
|
"MessageApplicationUpdated": "Sèvè Jellyfin met a jou",
|
||||||
|
"MessageApplicationUpdatedTo": "Sèvè Jellyfin met a jou sou {0}",
|
||||||
|
"Movies": "Fim",
|
||||||
|
"MixedContent": "Kontni Melanje",
|
||||||
|
"Music": "Mizik",
|
||||||
|
"MusicVideos": "Videyo Mizik",
|
||||||
|
"NameInstallFailed": "{0} enstalasyon fe fayit",
|
||||||
|
"NameSeasonNumber": "Sezon {0}",
|
||||||
|
"NameSeasonUnknown": "Sezon Enkoni",
|
||||||
|
"NotificationOptionCameraImageUploaded": "Imaj Kamera telechaje",
|
||||||
|
"NotificationOptionInstallationFailed": "Enstalasyon echwe",
|
||||||
|
"Photos": "Foto",
|
||||||
|
"PluginInstalledWithName": "{0} te enstale",
|
||||||
|
"PluginUninstalledWithName": "{0} te dezenstale",
|
||||||
|
"PluginUpdatedWithName": "{0} te mi a jou",
|
||||||
|
"ScheduledTaskFailedWithName": "{0} echwe",
|
||||||
|
"ScheduledTaskStartedWithName": "{0} komanse",
|
||||||
|
"Songs": "Mizik yo",
|
||||||
|
"Shows": "Emisyon yo",
|
||||||
|
"System": "Sistèm",
|
||||||
|
"TvShows": "Emisyon Tele",
|
||||||
|
"User": "Itilizatè",
|
||||||
|
"UserCreatedWithName": "Itilizatè {0} kreye",
|
||||||
|
"UserDeletedWithName": "Itilizatè {0} a efase",
|
||||||
|
"UserDownloadingItemWithValues": "{0} ap telechaje {1}",
|
||||||
|
"UserOfflineFromDevice": "{0} dekonekte de {1}",
|
||||||
|
"UserStartedPlayingItemWithValues": "{0} ap jwe {1} sou {2}",
|
||||||
|
"UserStoppedPlayingItemWithValues": "{0} fin jwe {1} sou {2}",
|
||||||
|
"UserPasswordChangedWithName": "Modpas la chanje pou Itilizatè {0}",
|
||||||
|
"ValueSpecialEpisodeName": "Spesyal - {0}",
|
||||||
|
"VersionNumber": "Vesyon {0}",
|
||||||
|
"TasksApplicationCategory": "Aplikasyon",
|
||||||
|
"TasksMaintenanceCategory": "Antretyen"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"Albums": "Albumok",
|
"Albums": "Albumok",
|
||||||
"AppDeviceValues": "Program: {0}, eszköz: {1}",
|
"AppDeviceValues": "Program: {0}, Eszköz: {1}",
|
||||||
"Application": "Alkalmazás",
|
"Application": "Alkalmazás",
|
||||||
"Artists": "Előadók",
|
"Artists": "Előadók",
|
||||||
"AuthenticationSucceededWithUserName": "{0} sikeresen hitelesítve",
|
"AuthenticationSucceededWithUserName": "{0} sikeresen hitelesítve",
|
||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskDownloadMissingLyricsDescription": "Zenék szövegének letöltése",
|
"TaskDownloadMissingLyricsDescription": "Zenék szövegének letöltése",
|
||||||
"TaskMoveTrickplayImages": "Trickplay képek helyének átköltöztetése",
|
"TaskMoveTrickplayImages": "Trickplay képek helyének átköltöztetése",
|
||||||
"TaskMoveTrickplayImagesDescription": "A médiatár-beállításoknak megfelelően áthelyezi a meglévő trickplay fájlokat.",
|
"TaskMoveTrickplayImagesDescription": "A médiatár-beállításoknak megfelelően áthelyezi a meglévő trickplay fájlokat.",
|
||||||
"TaskExtractMediaSegmentsDescription": "Kinyeri vagy megszerzi a médiaszegmenseket a MediaSegment támogatással rendelkező bővítményekből."
|
"TaskExtractMediaSegmentsDescription": "Kinyeri vagy megszerzi a médiaszegmenseket a MediaSegment támogatással rendelkező bővítményekből.",
|
||||||
|
"CleanupUserDataTaskDescription": "Legalább 90 napja nem elérhető médiákhoz kapcsolódó összes felhasználói adat (pl. megtekintési állapot, kedvencek) törlése.",
|
||||||
|
"CleanupUserDataTask": "Felhasználói adatok tisztítása feladat"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,5 +129,13 @@
|
|||||||
"TaskAudioNormalizationDescription": "Pindai file untuk data normalisasi audio.",
|
"TaskAudioNormalizationDescription": "Pindai file untuk data normalisasi audio.",
|
||||||
"TaskAudioNormalization": "Normalisasi Audio",
|
"TaskAudioNormalization": "Normalisasi Audio",
|
||||||
"TaskCleanCollectionsAndPlaylists": "Bersihkan koleksi dan daftar putar",
|
"TaskCleanCollectionsAndPlaylists": "Bersihkan koleksi dan daftar putar",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "Menghapus item dari koleksi dan daftar putar yang sudah tidak ada."
|
"TaskCleanCollectionsAndPlaylistsDescription": "Menghapus item dari koleksi dan daftar putar yang sudah tidak ada.",
|
||||||
|
"TaskDownloadMissingLyricsDescription": "Unduh lirik untuk lagu",
|
||||||
|
"TaskExtractMediaSegmentsDescription": "Mengekstrak atau memperoleh segmen media dari plugin yang mendukung MediaSegment.",
|
||||||
|
"TaskMoveTrickplayImagesDescription": "Memindahkan file trickplay yang sudah ada sesuai dengan pengaturan pustaka.",
|
||||||
|
"CleanupUserDataTaskDescription": "Membersihkan semua data pengguna (status tontonan, status favorit, dll.) dari media yang sudah tidak ada selama setidaknya 90 hari.",
|
||||||
|
"TaskExtractMediaSegments": "Scan Segmen media",
|
||||||
|
"TaskMoveTrickplayImages": "Migrasikan Lokasi Gambar Trickplay",
|
||||||
|
"TaskDownloadMissingLyrics": "Unduh Lirik yang Hilang",
|
||||||
|
"CleanupUserDataTask": "Tugas Pembersihan Data Pengguna"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -131,5 +131,8 @@
|
|||||||
"TaskCleanCollectionsAndPlaylists": "Hreinsa söfn og spilunarlista",
|
"TaskCleanCollectionsAndPlaylists": "Hreinsa söfn og spilunarlista",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "Fjarlægir hluti úr söfnum og spilalistum sem eru ekki lengur til.",
|
"TaskCleanCollectionsAndPlaylistsDescription": "Fjarlægir hluti úr söfnum og spilalistum sem eru ekki lengur til.",
|
||||||
"TaskDownloadMissingLyricsDescription": "Sækja söngtexta fyrir lög",
|
"TaskDownloadMissingLyricsDescription": "Sækja söngtexta fyrir lög",
|
||||||
"TaskDownloadMissingLyrics": "Sækja söngtexta sem vantar"
|
"TaskDownloadMissingLyrics": "Sækja söngtexta sem vantar",
|
||||||
|
"TaskExtractMediaSegments": "Skönnun efnishluta",
|
||||||
|
"CleanupUserDataTask": "Hreinsun notendagagna",
|
||||||
|
"CleanupUserDataTaskDescription": "Hreinsar öll notendagögn (spilunarstöðu, uppáhöld o.s.frv.) um gögn sem hafa ekki verið til staðar í að lámarki 90 daga."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskMoveTrickplayImages": "Sposta le immagini Trickplay",
|
"TaskMoveTrickplayImages": "Sposta le immagini Trickplay",
|
||||||
"TaskMoveTrickplayImagesDescription": "Sposta le immagini Trickplay esistenti secondo la configurazione della libreria.",
|
"TaskMoveTrickplayImagesDescription": "Sposta le immagini Trickplay esistenti secondo la configurazione della libreria.",
|
||||||
"TaskExtractMediaSegmentsDescription": "Estrae o ottiene segmenti multimediali dai plugin abilitati MediaSegment.",
|
"TaskExtractMediaSegmentsDescription": "Estrae o ottiene segmenti multimediali dai plugin abilitati MediaSegment.",
|
||||||
"TaskExtractMediaSegments": "Scansiona Segmento Media"
|
"TaskExtractMediaSegments": "Scansiona Segmento Media",
|
||||||
|
"CleanupUserDataTask": "Task di pulizia dei dati utente",
|
||||||
|
"CleanupUserDataTaskDescription": "Pulisce tutti i dati utente (stato di visione, status preferiti, ecc.) dai contenuti non più presenti da almeno 90 giorni."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,5 +135,7 @@
|
|||||||
"TaskMoveTrickplayImages": "Trickplayの画像を移動",
|
"TaskMoveTrickplayImages": "Trickplayの画像を移動",
|
||||||
"TaskMoveTrickplayImagesDescription": "ライブラリ設定によりTrickplayのファイルを移動。",
|
"TaskMoveTrickplayImagesDescription": "ライブラリ設定によりTrickplayのファイルを移動。",
|
||||||
"TaskDownloadMissingLyrics": "失われた歌詞をダウンロード",
|
"TaskDownloadMissingLyrics": "失われた歌詞をダウンロード",
|
||||||
"TaskExtractMediaSegmentsDescription": "MediaSegment 対応プラグインからメディア セグメントを抽出または取得します。"
|
"TaskExtractMediaSegmentsDescription": "MediaSegment 対応プラグインからメディア セグメントを抽出または取得します。",
|
||||||
|
"CleanupUserDataTask": "ユーザーデータのクリーンアップタスク",
|
||||||
|
"CleanupUserDataTaskDescription": "90日以上存在しないメディアに対して、視聴状態やお気に入り状態などのユーザーデータをすべて削除します。"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@
|
|||||||
"DeviceOfflineWithName": "{0} ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ",
|
"DeviceOfflineWithName": "{0} ಸಂಪರ್ಕ ಕಡಿತಗೊಂಡಿದೆ",
|
||||||
"DeviceOnlineWithName": "{0} ಸಂಪರ್ಕಗೊಂಡಿದೆ",
|
"DeviceOnlineWithName": "{0} ಸಂಪರ್ಕಗೊಂಡಿದೆ",
|
||||||
"External": "ಹೊರಗಿನ",
|
"External": "ಹೊರಗಿನ",
|
||||||
"FailedLoginAttemptWithUserName": "{0} ರಿಂದ ವಿಫಲ ಲಾಗಿನ್ ಪ್ರಯತ್ನ",
|
"FailedLoginAttemptWithUserName": "ವಿಫಲ ಲಾಗಿನ್ ಪ್ರಯತ್ನ ಸಂಖ್ಯೆ {0}",
|
||||||
"Favorites": "ಮೆಚ್ಚಿನವುಗಳು",
|
"Favorites": "ಮೆಚ್ಚಿನವುಗಳು",
|
||||||
"Folders": "ಫೋಲ್ಡರ್ಗಳು",
|
"Folders": "ಫೋಲ್ಡರ್ಗಳು",
|
||||||
"Forced": "ಬಲವಂತವಾಗಿ",
|
"Forced": "ಬಲವಂತವಾಗಿ",
|
||||||
@@ -123,5 +123,13 @@
|
|||||||
"TaskUpdatePlugins": "ಪ್ಲಗಿನ್ಗಳನ್ನು ನವೀಕರಿಸಿ",
|
"TaskUpdatePlugins": "ಪ್ಲಗಿನ್ಗಳನ್ನು ನವೀಕರಿಸಿ",
|
||||||
"TaskCleanTranscode": "ಟ್ರಾನ್ಸ್ಕೋಡ್ ಡೈರೆಕ್ಟರಿಯನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಿ",
|
"TaskCleanTranscode": "ಟ್ರಾನ್ಸ್ಕೋಡ್ ಡೈರೆಕ್ಟರಿಯನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಿ",
|
||||||
"TaskRefreshChannels": "ಚಾನಲ್ಗಳನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ",
|
"TaskRefreshChannels": "ಚಾನಲ್ಗಳನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡಿ",
|
||||||
"TaskRefreshChannelsDescription": "ಇಂಟರ್ನೆಟ್ ಚಾನಲ್ ಮಾಹಿತಿಯನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡುತ್ತದೆ."
|
"TaskRefreshChannelsDescription": "ಇಂಟರ್ನೆಟ್ ಚಾನಲ್ ಮಾಹಿತಿಯನ್ನು ರಿಫ್ರೆಶ್ ಮಾಡುತ್ತದೆ.",
|
||||||
|
"TaskAudioNormalizationDescription": "ಧ್ವನಿ ಸಾಮಾನ್ಯೀಕರಣ ಮಾಹಿತಿಗಾಗಿ ಕಡತಗಳನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡುತ್ತದೆ.",
|
||||||
|
"TaskDownloadMissingLyricsDescription": "ಹಾಡುಗಳಿಗೆ ಸಾಹಿತ್ಯ ಪಡೆಯಿರಿ",
|
||||||
|
"TaskExtractMediaSegments": "ಮಾಧ್ಯಮ ವಿಭಾಗದ ಹುಡುಕು",
|
||||||
|
"TaskDownloadMissingLyrics": "ಇಲ್ಲದ ಸಾಹಿತ್ಯವನ್ನು ಪಡೆಯಿರಿ",
|
||||||
|
"TaskAudioNormalization": "ಧ್ವನಿ ಸಾಮಾನ್ಯೀಕರಣ",
|
||||||
|
"TaskRefreshTrickplayImages": "ಟ್ರಿಕ್ಪ್ಲೇ ಚಿತ್ರಗಳನ್ನು ರಚಿಸಿ",
|
||||||
|
"TaskCleanCollectionsAndPlaylists": "ಸಂಗ್ರಹಗಳು ಮತ್ತು ಪ್ಲೇಪಟ್ಟಿಗಳನ್ನು ಸ್ವಚ್ಛಗೊಳಿಸಿ",
|
||||||
|
"TaskCleanCollectionsAndPlaylistsDescription": "ಇಲ್ಲದ ಸಂಗ್ರಹಗಳು ಮತ್ತು ಪ್ಲೇಪಟ್ಟಿಗಳಿಂದ ವಸ್ತುಗಳನ್ನು ತೆಗೆದುಹಾಕುತ್ತದೆ."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
"CameraImageUploadedFrom": "Nauja nuotrauka įkelta iš kameros {0}",
|
"CameraImageUploadedFrom": "Nauja nuotrauka įkelta iš kameros {0}",
|
||||||
"Channels": "Kanalai",
|
"Channels": "Kanalai",
|
||||||
"ChapterNameValue": "Scena{0}",
|
"ChapterNameValue": "Scena{0}",
|
||||||
"Collections": "Kolekcijos",
|
"Collections": "Rinkiniai",
|
||||||
"DeviceOfflineWithName": "{0} buvo atjungtas",
|
"DeviceOfflineWithName": "{0} buvo atjungtas",
|
||||||
"DeviceOnlineWithName": "{0} prisijungęs",
|
"DeviceOnlineWithName": "{0} prisijungęs",
|
||||||
"FailedLoginAttemptWithUserName": "Nesėkmingas {0} bandymas prisijungti",
|
"FailedLoginAttemptWithUserName": "Nesėkmingas {0} bandymas prisijungti",
|
||||||
@@ -17,18 +17,18 @@
|
|||||||
"Genres": "Žanrai",
|
"Genres": "Žanrai",
|
||||||
"HeaderAlbumArtists": "Albumo atlikėjai",
|
"HeaderAlbumArtists": "Albumo atlikėjai",
|
||||||
"HeaderContinueWatching": "Žiūrėti toliau",
|
"HeaderContinueWatching": "Žiūrėti toliau",
|
||||||
"HeaderFavoriteAlbums": "Mėgstami Albumai",
|
"HeaderFavoriteAlbums": "Mėgstami albumai",
|
||||||
"HeaderFavoriteArtists": "Mėgstami Atlikėjai",
|
"HeaderFavoriteArtists": "Mėgstami atlikėjai",
|
||||||
"HeaderFavoriteEpisodes": "Mėgstamiausios serijos",
|
"HeaderFavoriteEpisodes": "Mėgstamiausios serijos",
|
||||||
"HeaderFavoriteShows": "Mėgstamiausios TV Laidos",
|
"HeaderFavoriteShows": "Mėgstamiausios TV Laidos",
|
||||||
"HeaderFavoriteSongs": "Mėgstamos Dainos",
|
"HeaderFavoriteSongs": "Mėgstamos Dainos",
|
||||||
"HeaderLiveTV": "Tiesioginė TV",
|
"HeaderLiveTV": "Tiesioginė TV",
|
||||||
"HeaderNextUp": "Toliau eilėje",
|
"HeaderNextUp": "Toliau",
|
||||||
"HeaderRecordingGroups": "Įrašų grupės",
|
"HeaderRecordingGroups": "Įrašų grupės",
|
||||||
"HomeVideos": "Namų vaizdo įrašai",
|
"HomeVideos": "Namų vaizdo įrašai",
|
||||||
"Inherit": "Paveldėti",
|
"Inherit": "Paveldėti",
|
||||||
"ItemAddedWithName": "{0} - buvo įkeltas į mediateką",
|
"ItemAddedWithName": "{0} - buvo įkeltas į biblioteką",
|
||||||
"ItemRemovedWithName": "{0} - buvo pašalinta iš mediatekos",
|
"ItemRemovedWithName": "{0} - buvo pašalinta iš bibliotekos",
|
||||||
"LabelIpAddressValue": "IP adresas: {0}",
|
"LabelIpAddressValue": "IP adresas: {0}",
|
||||||
"LabelRunningTimeValue": "Trukmė: {0}",
|
"LabelRunningTimeValue": "Trukmė: {0}",
|
||||||
"Latest": "Naujausi",
|
"Latest": "Naujausi",
|
||||||
@@ -36,7 +36,7 @@
|
|||||||
"MessageApplicationUpdatedTo": "\"Jellyfin Server\" buvo atnaujinta iki {0}",
|
"MessageApplicationUpdatedTo": "\"Jellyfin Server\" buvo atnaujinta iki {0}",
|
||||||
"MessageNamedServerConfigurationUpdatedWithValue": "Serverio nustatymai (skyrius {0}) buvo atnaujinti",
|
"MessageNamedServerConfigurationUpdatedWithValue": "Serverio nustatymai (skyrius {0}) buvo atnaujinti",
|
||||||
"MessageServerConfigurationUpdated": "Serverio nustatymai buvo atnaujinti",
|
"MessageServerConfigurationUpdated": "Serverio nustatymai buvo atnaujinti",
|
||||||
"MixedContent": "Mixed content",
|
"MixedContent": "Mišrus turinys",
|
||||||
"Movies": "Filmai",
|
"Movies": "Filmai",
|
||||||
"Music": "Muzika",
|
"Music": "Muzika",
|
||||||
"MusicVideos": "Muzikiniai vaizdo įrašai",
|
"MusicVideos": "Muzikiniai vaizdo įrašai",
|
||||||
@@ -53,21 +53,21 @@
|
|||||||
"NotificationOptionNewLibraryContent": "Naujas turinys įkeltas",
|
"NotificationOptionNewLibraryContent": "Naujas turinys įkeltas",
|
||||||
"NotificationOptionPluginError": "Įskiepio klaida",
|
"NotificationOptionPluginError": "Įskiepio klaida",
|
||||||
"NotificationOptionPluginInstalled": "Įskiepis įdiegtas",
|
"NotificationOptionPluginInstalled": "Įskiepis įdiegtas",
|
||||||
"NotificationOptionPluginUninstalled": "Įskiepis pašalintas",
|
"NotificationOptionPluginUninstalled": "Įskiepis išdiegtas",
|
||||||
"NotificationOptionPluginUpdateInstalled": "Įskiepio atnaujinimas įdiegtas",
|
"NotificationOptionPluginUpdateInstalled": "Įskiepio atnaujinimas įdiegtas",
|
||||||
"NotificationOptionServerRestartRequired": "Reikalingas serverio perleidimas",
|
"NotificationOptionServerRestartRequired": "Reikalingas serverio perleidimas",
|
||||||
"NotificationOptionTaskFailed": "Suplanuotos užduoties klaida",
|
"NotificationOptionTaskFailed": "Suplanuotos užduoties klaida",
|
||||||
"NotificationOptionUserLockedOut": "Vartotojas užblokuotas",
|
"NotificationOptionUserLockedOut": "Naudotojas užblokuotas",
|
||||||
"NotificationOptionVideoPlayback": "Vaizdo įrašo atkūrimas pradėtas",
|
"NotificationOptionVideoPlayback": "Vaizdo įrašo atkūrimas pradėtas",
|
||||||
"NotificationOptionVideoPlaybackStopped": "Vaizdo įrašo atkūrimas sustabdytas",
|
"NotificationOptionVideoPlaybackStopped": "Vaizdo įrašo atkūrimas sustabdytas",
|
||||||
"Photos": "Nuotraukos",
|
"Photos": "Nuotraukos",
|
||||||
"Playlists": "Grojaraštis",
|
"Playlists": "Grojaraščiai",
|
||||||
"Plugin": "Plugin",
|
"Plugin": "Įskiepis",
|
||||||
"PluginInstalledWithName": "{0} buvo įdiegtas",
|
"PluginInstalledWithName": "{0} buvo įdiegtas",
|
||||||
"PluginUninstalledWithName": "{0} buvo pašalintas",
|
"PluginUninstalledWithName": "{0} buvo pašalintas",
|
||||||
"PluginUpdatedWithName": "{0} buvo atnaujintas",
|
"PluginUpdatedWithName": "{0} buvo atnaujintas",
|
||||||
"ProviderValue": "Provider: {0}",
|
"ProviderValue": "Paslaugos tiekėjas: {0}",
|
||||||
"ScheduledTaskFailedWithName": "{0} klaida",
|
"ScheduledTaskFailedWithName": "{0} nepavyko",
|
||||||
"ScheduledTaskStartedWithName": "{0} paleista",
|
"ScheduledTaskStartedWithName": "{0} paleista",
|
||||||
"ServerNameNeedsToBeRestarted": "{0} reikia iš naujo paleisti",
|
"ServerNameNeedsToBeRestarted": "{0} reikia iš naujo paleisti",
|
||||||
"Shows": "Laidos",
|
"Shows": "Laidos",
|
||||||
@@ -76,65 +76,67 @@
|
|||||||
"SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
|
"SubtitleDownloadFailureForItem": "Subtitles failed to download for {0}",
|
||||||
"SubtitleDownloadFailureFromForItem": "{1} subtitrai buvo nesėkmingai parsiųsti iš {0}",
|
"SubtitleDownloadFailureFromForItem": "{1} subtitrai buvo nesėkmingai parsiųsti iš {0}",
|
||||||
"Sync": "Sinchronizuoti",
|
"Sync": "Sinchronizuoti",
|
||||||
"System": "System",
|
"System": "Sistema",
|
||||||
"TvShows": "TV Serialai",
|
"TvShows": "TV laidos",
|
||||||
"User": "User",
|
"User": "Naudotojas",
|
||||||
"UserCreatedWithName": "Vartotojas {0} buvo sukurtas",
|
"UserCreatedWithName": "Buvo sukurtas {0} naudotojas",
|
||||||
"UserDeletedWithName": "Vartotojas {0} ištrintas",
|
"UserDeletedWithName": "Naudotojas {0} ištrintas",
|
||||||
"UserDownloadingItemWithValues": "{0} siunčiasi {1}",
|
"UserDownloadingItemWithValues": "{0} siunčiasi {1}",
|
||||||
"UserLockedOutWithName": "Vartotojas {0} užblokuotas",
|
"UserLockedOutWithName": "Naudotojas {0} užblokuotas",
|
||||||
"UserOfflineFromDevice": "{0} buvo atjungtas nuo {1}",
|
"UserOfflineFromDevice": "{0} buvo atjungtas nuo {1}",
|
||||||
"UserOnlineFromDevice": "{0} prisijungęs iš {1}",
|
"UserOnlineFromDevice": "{0} prisijungęs iš {1}",
|
||||||
"UserPasswordChangedWithName": "Slaptažodis pakeistas vartotojui {0}",
|
"UserPasswordChangedWithName": "Slaptažodis pakeistas naudotojui {0}",
|
||||||
"UserPolicyUpdatedWithName": "Vartotojo {0} teisės buvo pakeistos",
|
"UserPolicyUpdatedWithName": "Naudotojo {0} teisės buvo pakeistos",
|
||||||
"UserStartedPlayingItemWithValues": "{0} leidžia {1} į {2}",
|
"UserStartedPlayingItemWithValues": "{0} leidžia {1} į {2}",
|
||||||
"UserStoppedPlayingItemWithValues": "{0} baigė leisti {1} į {2}",
|
"UserStoppedPlayingItemWithValues": "{0} baigė leisti {1} į {2}",
|
||||||
"ValueHasBeenAddedToLibrary": "{0} pridėtas į mediateką",
|
"ValueHasBeenAddedToLibrary": "{0} pridėtas į mediateką",
|
||||||
"ValueSpecialEpisodeName": "Ypatinga - {0}",
|
"ValueSpecialEpisodeName": "Ypatingų - {0}",
|
||||||
"VersionNumber": "Version {0}",
|
"VersionNumber": "Versija {0}",
|
||||||
"TaskUpdatePluginsDescription": "Atsisiųsti ir įdiegti atnaujinimus priedams kuriem yra nustatytas automatiškas atnaujinimas.",
|
"TaskUpdatePluginsDescription": "Atsisiunčia ir įdiegia įskiepių, kurie sukonfigūruoti atnaujinti automatiškai, naujinius.",
|
||||||
"TaskUpdatePlugins": "Atnaujinti Priedus",
|
"TaskUpdatePlugins": "Atnaujinti įskieius",
|
||||||
"TaskDownloadMissingSubtitlesDescription": "Ieško trūkstamų subtitrų internete remiantis metaduomenų konfigūracija.",
|
"TaskDownloadMissingSubtitlesDescription": "Ieško trūkstamų subtitrų internete remiantis metaduomenų konfigūracija.",
|
||||||
"TaskCleanTranscodeDescription": "Ištrina dienos senumo perkodavimo failus.",
|
"TaskCleanTranscodeDescription": "Ištrina dienos senumo perkodavimo failus.",
|
||||||
"TaskCleanTranscode": "Išvalyti Perkodavimo Direktorija",
|
"TaskCleanTranscode": "Išvalyti perkodavimo katalogą",
|
||||||
"TaskRefreshLibraryDescription": "Ieškoti naujų failų jūsų mediatekoje ir atnaujina metaduomenis.",
|
"TaskRefreshLibraryDescription": "Skenuoja medijos biblioteką, ieškodamas naujų failų, ir atnaujina metaduomenis.",
|
||||||
"TaskRefreshLibrary": "Skenuoti Mediateka",
|
"TaskRefreshLibrary": "Skenuoti medijos biblioteką",
|
||||||
"TaskDownloadMissingSubtitles": "Atsisiųsti trūkstamus subtitrus",
|
"TaskDownloadMissingSubtitles": "Atsisiųsti trūkstamus subtitrus",
|
||||||
"TaskRefreshChannelsDescription": "Atnaujina internetinių kanalų informaciją.",
|
"TaskRefreshChannelsDescription": "Atnaujina internetinių kanalų informaciją.",
|
||||||
"TaskRefreshChannels": "Atnaujinti kanalus",
|
"TaskRefreshChannels": "Atnaujinti kanalus",
|
||||||
"TaskRefreshPeopleDescription": "Atnaujina metaduomenis apie aktorius ir režisierius jūsų mediatekoje.",
|
"TaskRefreshPeopleDescription": "Atnaujina metaduomenis apie aktorius ir režisierius jūsų medijos bibliotekoje.",
|
||||||
"TaskRefreshPeople": "Atnaujinti Žmones",
|
"TaskRefreshPeople": "Atnaujinti žmones",
|
||||||
"TaskCleanLogsDescription": "Ištrina žurnalo failus kurie yra senesni nei {0} dienos.",
|
"TaskCleanLogsDescription": "Ištrina žurnalo failus kurie yra senesni nei {0} dienos.",
|
||||||
"TaskCleanLogs": "Išvalyti Žurnalą",
|
"TaskCleanLogs": "Išvalyti žurnalą",
|
||||||
"TaskRefreshChapterImagesDescription": "Sukuria miniatiūras vaizdo įrašam, kurie turi scenas.",
|
"TaskRefreshChapterImagesDescription": "Sukuria vaizdo įrašų, kuriuose yra skyrių, miniatiūras.",
|
||||||
"TaskRefreshChapterImages": "Ištraukti Scenų Paveikslus",
|
"TaskRefreshChapterImages": "Ištraukti skyrių vaizdus",
|
||||||
"TaskCleanCache": "Išvalyti Talpyklą",
|
"TaskCleanCache": "Išvalyti talpyklą",
|
||||||
"TaskCleanCacheDescription": "Ištrina talpyklos failus, kurių daugiau nereikia sistemai.",
|
"TaskCleanCacheDescription": "Ištrina talpyklos failus, kurių daugiau nereikia sistemai.",
|
||||||
"TasksChannelsCategory": "Internetiniai Kanalai",
|
"TasksChannelsCategory": "Internetiniai kanalai",
|
||||||
"TasksApplicationCategory": "Programa",
|
"TasksApplicationCategory": "Programa",
|
||||||
"TasksLibraryCategory": "Mediateka",
|
"TasksLibraryCategory": "Biblioteka",
|
||||||
"TasksMaintenanceCategory": "Priežiūra",
|
"TasksMaintenanceCategory": "Priežiūra",
|
||||||
"TaskCleanActivityLog": "Išvalyti veiklos žurnalą",
|
"TaskCleanActivityLog": "Išvalyti veiklos žurnalą",
|
||||||
"Undefined": "Neapibrėžtas",
|
"Undefined": "Neapibrėžtas",
|
||||||
"Forced": "Priverstas",
|
"Forced": "Priverstinis",
|
||||||
"Default": "Numatytas",
|
"Default": "Numatytas",
|
||||||
"TaskCleanActivityLogDescription": "Ištrina veiklos žuranlo įrašus, kurie yra senesni nei nustatytas amžius.",
|
"TaskCleanActivityLogDescription": "Ištrina senesnius nei nustatytas amžius veiklos žurnalo įrašus.",
|
||||||
"TaskOptimizeDatabase": "Optimizuoti duomenų bazę",
|
"TaskOptimizeDatabase": "Optimizuoti duomenų bazę",
|
||||||
"TaskKeyframeExtractorDescription": "Iš vaizdo įrašo paruošia reikšminius kadrus, kad būtų sukuriamas tikslenis HLS grojaraštis. Šios užduoties vykdymas gali ilgai užtrukti.",
|
"TaskKeyframeExtractorDescription": "Iš vaizdo įrašo paruošia reikšminius kadrus, kad būtų sukuriamas tikslenis HLS grojaraštis. Šios užduoties vykdymas gali ilgai užtrukti.",
|
||||||
"TaskKeyframeExtractor": "Pagrindinių kadrų išgavėjas",
|
"TaskKeyframeExtractor": "Reikšminių kadrų (KeyFrame) išgavėjas",
|
||||||
"TaskOptimizeDatabaseDescription": "Suspaudžia duomenų bazę ir atlaisvina vietą. Paleidžiant šią užduotį, po bibliotekos skenavimo arba kitų veiksmų kurie galimai modifikuoja duomenų bazę, gali pagerinti greitaveiką.",
|
"TaskOptimizeDatabaseDescription": "Suspaudžia duomenų bazę ir atlaisvina vietą. Paleidžiant šią užduotį, po bibliotekos skenavimo arba kitų veiksmų kurie galimai modifikuoja duomenų bazę, gali pagerinti greitaveiką.",
|
||||||
"External": "Išorinis",
|
"External": "Išorinis",
|
||||||
"HearingImpaired": "Su klausos sutrikimais",
|
"HearingImpaired": "Su klausos sutrikimais",
|
||||||
"TaskRefreshTrickplayImages": "Generuoti Trickplay atvaizdus",
|
"TaskRefreshTrickplayImages": "Generuoti Trickplay atvaizdus",
|
||||||
"TaskRefreshTrickplayImagesDescription": "Sukuria trickplay peržiūras vaizdo įrašams įgalintose bibliotekose.",
|
"TaskRefreshTrickplayImagesDescription": "Sukuria trickplay peržiūras vaizdo įrašams įgalintose bibliotekose.",
|
||||||
"TaskCleanCollectionsAndPlaylists": "Išvalo duomenis kolekcijose ir grojaraščiuose",
|
"TaskCleanCollectionsAndPlaylists": "Išvalo duomenis rinkiniuose ir grojaraščiuose",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "Pašalina neegzistuojančius elementus iš kolekcijų ir grojaraščių.",
|
"TaskCleanCollectionsAndPlaylistsDescription": "Pašalina neegzistuojančius elementus iš rinkinių ir grojaraščių.",
|
||||||
"TaskAudioNormalization": "Garso Normalizavimas",
|
"TaskAudioNormalization": "Garso normalizavimas",
|
||||||
"TaskAudioNormalizationDescription": "Skenuoti garso normalizavimo informacijos failuose.",
|
"TaskAudioNormalizationDescription": "Skenuoja failus, ieškant garso normalizavimo duomenų.",
|
||||||
"TaskExtractMediaSegments": "Medijos segmentų nuskaitymas",
|
"TaskExtractMediaSegments": "Medijos segmentų nuskaitymas",
|
||||||
"TaskDownloadMissingLyrics": "Parsisiųsti trūkstamus dainų tekstus",
|
"TaskDownloadMissingLyrics": "Parsisiųsti trūkstamus dainų tekstus",
|
||||||
"TaskExtractMediaSegmentsDescription": "Ištraukia arba gauna medijos segmentus iš MediaSegment ijungtų papildinių.",
|
"TaskExtractMediaSegmentsDescription": "Ištraukia arba gauna medijos segmentus iš MediaSegment ijungtų įskiepių.",
|
||||||
"TaskMoveTrickplayImages": "Pakeisti Trickplay vaizdų vietą",
|
"TaskMoveTrickplayImages": "Pakeisti Trickplay vaizdų vietą",
|
||||||
"TaskMoveTrickplayImagesDescription": "Perkelia egzistuojančius trickplay failus pagal bibliotekos nustatymus.",
|
"TaskMoveTrickplayImagesDescription": "Perkelia egzistuojančius trickplay failus pagal bibliotekos nustatymus.",
|
||||||
"TaskDownloadMissingLyricsDescription": "Parsisiųsti dainų žodžius"
|
"TaskDownloadMissingLyricsDescription": "Parsisiųsti dainų žodžius",
|
||||||
|
"CleanupUserDataTask": "Naudotojo duomenų valymo užduotis",
|
||||||
|
"CleanupUserDataTaskDescription": "Iš medijos, kurios nebėra bent 90 dienų, išvalo visus naudotojo duomenis (žiūrėjimo būseną, mėgstamiausią būseną ir t. t.)."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
{
|
{
|
||||||
"Books": "Номууд",
|
"Books": "Номнууд",
|
||||||
"HeaderNextUp": "Дараа нь",
|
"HeaderNextUp": "Дараа нь",
|
||||||
"HeaderContinueWatching": "Үргэлжлүүлэн үзэх",
|
"HeaderContinueWatching": "Үргэлжлүүлэн үзэх",
|
||||||
"Songs": "Дуунууд",
|
"Songs": "Дуунууд",
|
||||||
"Playlists": "Тоглуулах жагсаалт",
|
"Playlists": "Playlist-ууд",
|
||||||
"Movies": "Кино",
|
"Movies": "Кинонууд",
|
||||||
"Latest": "Сүүлийн үеийн",
|
"Latest": "Сүүлийн үеийн",
|
||||||
"Genres": "Төрлүүд",
|
"Genres": "Төрлүүд",
|
||||||
"Favorites": "Дуртай",
|
"Favorites": "Дуртай",
|
||||||
"Collections": "Багц",
|
"Collections": "Цуглуулгууд",
|
||||||
"Artists": "Уран бүтээлчид",
|
"Artists": "Уран бүтээлчид",
|
||||||
"Albums": "Цомгууд",
|
"Albums": "Дуут цомгууд",
|
||||||
"TaskExtractMediaSegments": "Медиа сегмент шалга",
|
"TaskExtractMediaSegments": "Медиа сегмент шалга",
|
||||||
"TaskExtractMediaSegmentsDescription": "MediaSegment идэвхжүүлсэн залгаасуудаас медиа сегментүүдийг задлах эсвэл олж авах.",
|
"TaskExtractMediaSegmentsDescription": "MediaSegment идэвхжүүлсэн залгаасуудаас медиа сегментүүдийг задлах эсвэл олж авах.",
|
||||||
"TaskMoveTrickplayImages": "Трикплэй зургуудын байршлыг шилжүүлэх",
|
"TaskMoveTrickplayImages": "Трикплэй зургуудын байршлыг шилжүүлэх",
|
||||||
@@ -63,11 +63,11 @@
|
|||||||
"CameraImageUploadedFrom": "{0}-с шинэ зураг байршуулагдлаа",
|
"CameraImageUploadedFrom": "{0}-с шинэ зураг байршуулагдлаа",
|
||||||
"Channels": "Сувгууд",
|
"Channels": "Сувгууд",
|
||||||
"ChapterNameValue": "{0}-р бүлэг",
|
"ChapterNameValue": "{0}-р бүлэг",
|
||||||
"Default": "Өгөгдмөл",
|
"Default": "Анхдагч",
|
||||||
"DeviceOfflineWithName": "{0}-н холболт саллаа",
|
"DeviceOfflineWithName": "{0}-н холболт саллаа",
|
||||||
"DeviceOnlineWithName": "{0} холбогдлоо",
|
"DeviceOnlineWithName": "{0} холбогдлоо",
|
||||||
"FailedLoginAttemptWithUserName": "{0}-н нэвтрэх оролдлого амжилтгүй",
|
"FailedLoginAttemptWithUserName": "{0}-н нэвтрэх оролдлого амжилтгүй",
|
||||||
"Folders": "Хавтаснууд",
|
"Folders": "Хавтасууд",
|
||||||
"Forced": "Хүчээр",
|
"Forced": "Хүчээр",
|
||||||
"HeaderAlbumArtists": "Цомгийн уран бүтээлчид",
|
"HeaderAlbumArtists": "Цомгийн уран бүтээлчид",
|
||||||
"HeaderFavoriteAlbums": "Дуртай цомгууд",
|
"HeaderFavoriteAlbums": "Дуртай цомгууд",
|
||||||
@@ -84,8 +84,8 @@
|
|||||||
"MessageApplicationUpdatedTo": "Jellyfin Server {0} болж шинэчлэгдлээ",
|
"MessageApplicationUpdatedTo": "Jellyfin Server {0} болж шинэчлэгдлээ",
|
||||||
"MessageServerConfigurationUpdated": "Server-н тохиргоо шинэчлэгдлээ",
|
"MessageServerConfigurationUpdated": "Server-н тохиргоо шинэчлэгдлээ",
|
||||||
"MixedContent": "Холимог агуулга",
|
"MixedContent": "Холимог агуулга",
|
||||||
"Music": "Дуу",
|
"Music": "Хөгжим",
|
||||||
"MusicVideos": "Дууны клип",
|
"MusicVideos": "Дууны клипүүд",
|
||||||
"NameInstallFailed": "{0} суулгахад алдаа гарлаа",
|
"NameInstallFailed": "{0} суулгахад алдаа гарлаа",
|
||||||
"NameSeasonNumber": "{0}-р улирал",
|
"NameSeasonNumber": "{0}-р улирал",
|
||||||
"NameSeasonUnknown": "Улирал олдсонгүй",
|
"NameSeasonUnknown": "Улирал олдсонгүй",
|
||||||
@@ -101,14 +101,14 @@
|
|||||||
"NotificationOptionUserLockedOut": "Хэрэглэгчийг түгжив",
|
"NotificationOptionUserLockedOut": "Хэрэглэгчийг түгжив",
|
||||||
"NotificationOptionVideoPlayback": "Бичлэгийг тоглуулж эхлэв",
|
"NotificationOptionVideoPlayback": "Бичлэгийг тоглуулж эхлэв",
|
||||||
"Photos": "Зургууд",
|
"Photos": "Зургууд",
|
||||||
"Plugin": "Plugin",
|
"Plugin": "Плагин",
|
||||||
"PluginInstalledWithName": "{0}-г суулгалаа",
|
"PluginInstalledWithName": "{0}-г суулгалаа",
|
||||||
"PluginUninstalledWithName": "{0}-г устгалаа",
|
"PluginUninstalledWithName": "{0}-г устгалаа",
|
||||||
"PluginUpdatedWithName": "{0}-г шинэчиллээ",
|
"PluginUpdatedWithName": "{0}-г шинэчиллээ",
|
||||||
"ProviderValue": "Нийлүүлэгч: {0}",
|
"ProviderValue": "Нийлүүлэгч: {0}",
|
||||||
"ScheduledTaskStartedWithName": "{0}-г эхлүүлэв",
|
"ScheduledTaskStartedWithName": "{0}-г эхлүүлэв",
|
||||||
"ServerNameNeedsToBeRestarted": "{0}-г дахин асаана уу",
|
"ServerNameNeedsToBeRestarted": "{0}-г дахин асаана уу",
|
||||||
"Shows": "Нэвтрүүлгүүд",
|
"Shows": "Шоу",
|
||||||
"Sync": "Дахин",
|
"Sync": "Дахин",
|
||||||
"System": "Систем",
|
"System": "Систем",
|
||||||
"TvShows": "ТВ нэвтрүүлгүүд",
|
"TvShows": "ТВ нэвтрүүлгүүд",
|
||||||
@@ -122,7 +122,7 @@
|
|||||||
"UserPolicyUpdatedWithName": "Хэрэглэгчийн журмыг {0}-д зориулан шинэчиллээ",
|
"UserPolicyUpdatedWithName": "Хэрэглэгчийн журмыг {0}-д зориулан шинэчиллээ",
|
||||||
"UserStartedPlayingItemWithValues": "{0}-г {2} дээр {1}-г тоглуулж байна",
|
"UserStartedPlayingItemWithValues": "{0}-г {2} дээр {1}-г тоглуулж байна",
|
||||||
"UserStoppedPlayingItemWithValues": "{0}-г {2} дээр {1}-г тоглуулж дуусгалаа",
|
"UserStoppedPlayingItemWithValues": "{0}-г {2} дээр {1}-г тоглуулж дуусгалаа",
|
||||||
"ValueSpecialEpisodeName": "Тусгай - {0}",
|
"ValueSpecialEpisodeName": "Онцгой - {0}",
|
||||||
"VersionNumber": "Хувилбар {0}",
|
"VersionNumber": "Хувилбар {0}",
|
||||||
"TasksMaintenanceCategory": "Засвар",
|
"TasksMaintenanceCategory": "Засвар",
|
||||||
"TasksLibraryCategory": "Сан",
|
"TasksLibraryCategory": "Сан",
|
||||||
|
|||||||
@@ -130,5 +130,7 @@
|
|||||||
"TaskExtractMediaSegments": "मिडिया विभाग तपासणी",
|
"TaskExtractMediaSegments": "मिडिया विभाग तपासणी",
|
||||||
"TaskMoveTrickplayImages": "ट्रिकप्ले प्रतिमेचे स्थान स्थलांतर करा",
|
"TaskMoveTrickplayImages": "ट्रिकप्ले प्रतिमेचे स्थान स्थलांतर करा",
|
||||||
"TaskDownloadMissingLyrics": "उपलब्ध नसलेली गीतपट्टी (Lyrics) डाउनलोड करा",
|
"TaskDownloadMissingLyrics": "उपलब्ध नसलेली गीतपट्टी (Lyrics) डाउनलोड करा",
|
||||||
"TaskAudioNormalization": "ऑडिओ सामान्यीकरण"
|
"TaskAudioNormalization": "ऑडिओ सामान्यीकरण",
|
||||||
|
"TaskAudioNormalizationDescription": "ऑडिओ सामान्यीकरणाचा डाटा स्कॅन करतो.",
|
||||||
|
"TaskDownloadMissingLyricsDescription": "गाण्यांची गीतपट्टी (Lyrics) डाउनलोड करतो"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"Albums": "Album",
|
"Albums": "Album",
|
||||||
"AppDeviceValues": "Apl: {0}, Peranti: {1}",
|
"AppDeviceValues": "Aplikasi: {0}, Peranti: {1}",
|
||||||
"Application": "Aplikasi",
|
"Application": "Aplikasi",
|
||||||
"Artists": "Artis-artis",
|
"Artists": "Artis",
|
||||||
"AuthenticationSucceededWithUserName": "{0} berjaya disahkan",
|
"AuthenticationSucceededWithUserName": "{0} berjaya disahkan",
|
||||||
"Books": "Buku-buku",
|
"Books": "Buku",
|
||||||
"CameraImageUploadedFrom": "Gambar baharu telah dimuat naik melalui {0}",
|
"CameraImageUploadedFrom": "Gambar baharu telah dimuat naik melalui {0}",
|
||||||
"Channels": "Saluran",
|
"Channels": "Saluran",
|
||||||
"ChapterNameValue": "Bab {0}",
|
"ChapterNameValue": "Bab {0}",
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
"TasksMaintenanceCategory": "Penyelenggaraan",
|
"TasksMaintenanceCategory": "Penyelenggaraan",
|
||||||
"Undefined": "Tidak ditentukan",
|
"Undefined": "Tidak ditentukan",
|
||||||
"Forced": "Dipaksa",
|
"Forced": "Dipaksa",
|
||||||
"Default": "Lalai",
|
"Default": "Default",
|
||||||
"TaskCleanCache": "Bersihkan Direktori Cache",
|
"TaskCleanCache": "Bersihkan Direktori Cache",
|
||||||
"TaskCleanActivityLogDescription": "Padamkan entri log aktiviti yang lebih tua daripada usia yang dikonfigurasi.",
|
"TaskCleanActivityLogDescription": "Padamkan entri log aktiviti yang lebih tua daripada usia yang dikonfigurasi.",
|
||||||
"TaskRefreshPeople": "Segarkan Orang",
|
"TaskRefreshPeople": "Segarkan Orang",
|
||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskCleanCollectionsAndPlaylists": "Bersihkan koleksi dan senarai audio video",
|
"TaskCleanCollectionsAndPlaylists": "Bersihkan koleksi dan senarai audio video",
|
||||||
"TaskAudioNormalization": "Normalisasi Audio",
|
"TaskAudioNormalization": "Normalisasi Audio",
|
||||||
"TaskAudioNormalizationDescription": "Mengimbas fail-fail untuk data normalisasi audio.",
|
"TaskAudioNormalizationDescription": "Mengimbas fail-fail untuk data normalisasi audio.",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "Mengalih keluar item daripada koleksi dan senarai audio video yang tidak wujud lagi."
|
"TaskCleanCollectionsAndPlaylistsDescription": "Mengalih keluar item daripada koleksi dan senarai audio video yang tidak wujud lagi.",
|
||||||
|
"CleanupUserDataTaskDescription": "Membersihkan semua data pengguna (keadaan tontonan, status kegemaran, dan sebagainya) daripada media yang tidak lagi wujud sekurang-kurangnya selama 90 hari.",
|
||||||
|
"CleanupUserDataTask": "Tugas pembersihan data pengguna"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,6 +135,8 @@
|
|||||||
"TaskDownloadMissingLyricsDescription": "Last ned sangtekster",
|
"TaskDownloadMissingLyricsDescription": "Last ned sangtekster",
|
||||||
"TaskExtractMediaSegments": "Skann mediasegment",
|
"TaskExtractMediaSegments": "Skann mediasegment",
|
||||||
"TaskMoveTrickplayImages": "Migrer bildeplassering for Trickplay",
|
"TaskMoveTrickplayImages": "Migrer bildeplassering for Trickplay",
|
||||||
"TaskMoveTrickplayImagesDescription": "Flytter eksisterende Trickplay-filer i henhold til bibliotekseinstillingene.",
|
"TaskMoveTrickplayImagesDescription": "Flytter eksisterende Trickplay-filer i henhold til biblioteksinstillingene.",
|
||||||
"TaskExtractMediaSegmentsDescription": "Trekker ut eller henter mediasegmenter fra plugins som støtter MediaSegment."
|
"TaskExtractMediaSegmentsDescription": "Trekker ut eller henter mediasegmenter fra plugins som støtter MediaSegment.",
|
||||||
|
"CleanupUserDataTaskDescription": "Sletter all brukerdata (avspillings-status, favoritter osv.) fra innhold som har vært utilgjengelig i minst 90 dager.",
|
||||||
|
"CleanupUserDataTask": "Oppgave for opprydding av brukerdata"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,6 +137,6 @@
|
|||||||
"TaskMoveTrickplayImages": "Locatie trickplay-afbeeldingen migreren",
|
"TaskMoveTrickplayImages": "Locatie trickplay-afbeeldingen migreren",
|
||||||
"TaskMoveTrickplayImagesDescription": "Verplaatst bestaande trickplay-bestanden op basis van de bibliotheekinstellingen.",
|
"TaskMoveTrickplayImagesDescription": "Verplaatst bestaande trickplay-bestanden op basis van de bibliotheekinstellingen.",
|
||||||
"TaskExtractMediaSegments": "Scannen op mediasegmenten",
|
"TaskExtractMediaSegments": "Scannen op mediasegmenten",
|
||||||
"CleanupUserDataTaskDescription": "Wist alle gebruikersgegevens (kijkstatus, favorieten, etc.) van media die al minstens 90 dagen niet meer aanwezig is.",
|
"CleanupUserDataTaskDescription": "Wist alle gebruikersgegevens (kijkstatus, favorieten, etc.) van media die al minstens 90 dagen niet meer aanwezig zijn.",
|
||||||
"CleanupUserDataTask": "Opruimtaak gebruikersdata"
|
"CleanupUserDataTask": "Opruimtaak gebruikersdata"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,5 +119,7 @@
|
|||||||
"Forced": "Tvungen",
|
"Forced": "Tvungen",
|
||||||
"Default": "Standard",
|
"Default": "Standard",
|
||||||
"External": "Ekstern",
|
"External": "Ekstern",
|
||||||
"HearingImpaired": "Nedsett høyrsel"
|
"HearingImpaired": "Nedsett høyrsel",
|
||||||
|
"TaskRefreshTrickplayImages": "Generer Trickplay-bilete",
|
||||||
|
"TaskAudioNormalization": "Normalisering av lyd"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,5 +32,86 @@
|
|||||||
"HeaderFavoriteShows": "Treasured Tales",
|
"HeaderFavoriteShows": "Treasured Tales",
|
||||||
"ChapterNameValue": "Piece {0}",
|
"ChapterNameValue": "Piece {0}",
|
||||||
"HeaderFavoriteSongs": "Treasured Chimes",
|
"HeaderFavoriteSongs": "Treasured Chimes",
|
||||||
"HeaderNextUp": "Incoming"
|
"HeaderNextUp": "Incoming",
|
||||||
|
"HeaderLiveTV": "Scrying Glass",
|
||||||
|
"HearingImpaired": "Hard o' Hearing",
|
||||||
|
"LabelRunningTimeValue": "Journey duration: {0}",
|
||||||
|
"MessageApplicationUpdated": "Yer Map of the Seas has been scribbled",
|
||||||
|
"HomeVideos": "Yer Onboard Booty",
|
||||||
|
"MixedContent": "Jumbled loot",
|
||||||
|
"Music": "Tunes",
|
||||||
|
"NameInstallFailed": "Ye couldn't bring {0} aboard yer ship",
|
||||||
|
"MessageApplicationUpdatedTo": "Yer Map of the Seas has been scribbled with {0}",
|
||||||
|
"MessageNamedServerConfigurationUpdatedWithValue": "Yer Map Drawer has been rescribbled to {0}",
|
||||||
|
"MessageServerConfigurationUpdated": "Yer Map drawer has been rescribbled",
|
||||||
|
"Inherit": "Carry on what be passed along",
|
||||||
|
"Latest": "Newfangled",
|
||||||
|
"Movies": "Moving pictures",
|
||||||
|
"NewVersionIsAvailable": "A fresh build o’ Jellyfin Server be waitin’ fer ye to fetch.",
|
||||||
|
"NotificationOptionPluginInstalled": "Plugin nailed down",
|
||||||
|
"NotificationOptionVideoPlayback": "Video playback be underway",
|
||||||
|
"ScheduledTaskFailedWithName": "{0} ran aground",
|
||||||
|
"StartupEmbyServerIsLoading": "Jellyfin Server be preparin’ the ship. Try yer luck again soon.",
|
||||||
|
"UserOfflineFromDevice": "{0} severed ties with {1}",
|
||||||
|
"UserDownloadingItemWithValues": "{0} be haulin’ in {1}",
|
||||||
|
"UserStartedPlayingItemWithValues": "{0} be playin’ {1} aboard {2}",
|
||||||
|
"ValueHasBeenAddedToLibrary": "{0} be stashed in yer treasure trove",
|
||||||
|
"TaskCleanCacheDescription": "Wipes away cache cargo no longer called fer.",
|
||||||
|
"TaskCleanLogsDescription": "Clears the logbook o’ entries older than {0} days.",
|
||||||
|
"TaskRefreshPeopleDescription": "Refreshes the charts fer actors an’ directors in yer Treasure Trove.",
|
||||||
|
"UserLockedOutWithName": "Matey {0} be denied boarding",
|
||||||
|
"TaskAudioNormalization": "Steadyin’ the shanties",
|
||||||
|
"TaskAudioNormalizationDescription": "Scans files fer shanty steadiyin’ data.",
|
||||||
|
"HeaderRecordingGroups": "Loggin' Groups",
|
||||||
|
"MusicVideos": "Shanty films",
|
||||||
|
"Playlists": "Lists o’ plunder",
|
||||||
|
"Plugin": "Extra sail",
|
||||||
|
"NotificationOptionVideoPlaybackStopped": "Video playback dropped anchor",
|
||||||
|
"NameSeasonNumber": "Saga {0}",
|
||||||
|
"NameSeasonUnknown": "Saga be Lost",
|
||||||
|
"NotificationOptionApplicationUpdateAvailable": "A fresh build awaits",
|
||||||
|
"NotificationOptionApplicationUpdateInstalled": "App upgrade be aboard",
|
||||||
|
"NotificationOptionAudioPlayback": "Audio playback be rollin",
|
||||||
|
"NotificationOptionAudioPlaybackStopped": "Audio playback dropped anchor",
|
||||||
|
"NotificationOptionCameraImageUploaded": "Spyglass shot be hoisted",
|
||||||
|
"NotificationOptionInstallationFailed": "Install be wrecked",
|
||||||
|
"NotificationOptionNewLibraryContent": "Fresh plunder ready to claim",
|
||||||
|
"NotificationOptionPluginError": "Plugin ran aground",
|
||||||
|
"NotificationOptionPluginUninstalled": "Plugin cast overboard",
|
||||||
|
"NotificationOptionPluginUpdateInstalled": "Plugin patched ‘n ready",
|
||||||
|
"NotificationOptionServerRestartRequired": "Server be due fer a restart",
|
||||||
|
"NotificationOptionTaskFailed": "Set chore went overboard",
|
||||||
|
"TaskRefreshLibraryDescription": "Searches the Treasure Trove fer new plunder ‘n updates the charts.",
|
||||||
|
"PluginInstalledWithName": "{0} nailed down",
|
||||||
|
"TaskCleanLogs": "Swab the Log Hold",
|
||||||
|
"TaskRefreshPeople": "Freshen the Mateys",
|
||||||
|
"PluginUninstalledWithName": "{0} sent t’ Davy Jones",
|
||||||
|
"PluginUpdatedWithName": "{0} patched ‘n ready",
|
||||||
|
"ProviderValue": "Supplier o’ goods: {0}",
|
||||||
|
"ScheduledTaskStartedWithName": "{0} set sail",
|
||||||
|
"ServerNameNeedsToBeRestarted": "{0} be cravin’ a restart",
|
||||||
|
"Shows": "Sagas",
|
||||||
|
"SubtitleDownloadFailureFromForItem": "Subtitles be sunk fetchin’ from {0} fer {1}",
|
||||||
|
"Sync": "Match the tides",
|
||||||
|
"System": "The ship’s works",
|
||||||
|
"TvShows": "TV Sagas",
|
||||||
|
"Undefined": "Uncharted",
|
||||||
|
"User": "Matey",
|
||||||
|
"UserCreatedWithName": "Matey {0} joined the crew",
|
||||||
|
"UserDeletedWithName": "Matey {0} cast overboard",
|
||||||
|
"UserOnlineFromDevice": "{0} be aboard ship from {1}",
|
||||||
|
"UserPasswordChangedWithName": "New passphrase set fer Matey {0}",
|
||||||
|
"UserPolicyUpdatedWithName": "Ship rules be changed fer {0}",
|
||||||
|
"UserStoppedPlayingItemWithValues": "{0} be done playin’ {1} on {2",
|
||||||
|
"ValueSpecialEpisodeName": "Special Tale – {0}",
|
||||||
|
"VersionNumber": "Edition {0}",
|
||||||
|
"TasksMaintenanceCategory": "Hull patchin’",
|
||||||
|
"TasksLibraryCategory": "Treasure Trove",
|
||||||
|
"TasksApplicationCategory": "Ship",
|
||||||
|
"TaskCleanActivityLog": "Clear the Ship’s Log",
|
||||||
|
"TaskCleanActivityLogDescription": "Purges ship’s logs older than the chosen time.",
|
||||||
|
"TaskCleanCache": "Sweep the Cache Chest",
|
||||||
|
"TaskRefreshChapterImages": "Claim chapter portraits",
|
||||||
|
"TaskRefreshChapterImagesDescription": "Paints wee portraits fer videos that own chapters.",
|
||||||
|
"TaskRefreshLibrary": "Scan the Treasure Trove"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskMoveTrickplayImagesDescription": "Move os arquivos do trickplay de acordo com as configurações da biblioteca.",
|
"TaskMoveTrickplayImagesDescription": "Move os arquivos do trickplay de acordo com as configurações da biblioteca.",
|
||||||
"TaskExtractMediaSegments": "Varredura do segmento de mídia",
|
"TaskExtractMediaSegments": "Varredura do segmento de mídia",
|
||||||
"TaskExtractMediaSegmentsDescription": "Extrai ou obtém segmentos de mídia de plug-ins habilitados para MediaSegment.",
|
"TaskExtractMediaSegmentsDescription": "Extrai ou obtém segmentos de mídia de plug-ins habilitados para MediaSegment.",
|
||||||
"TaskMoveTrickplayImages": "Migrar o local da imagem do Trickplay"
|
"TaskMoveTrickplayImages": "Migrar o local da imagem do Trickplay",
|
||||||
|
"CleanupUserDataTask": "Tarefa de limpeza de dados do usuário",
|
||||||
|
"CleanupUserDataTaskDescription": "Limpa todos os dados do usuário (estado de visualização, status de favorito, etc.) de mídias que não estão presentes por pelo menos 90 dias."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskMoveTrickplayImages": "Migrar a localização da imagem do Trickplay",
|
"TaskMoveTrickplayImages": "Migrar a localização da imagem do Trickplay",
|
||||||
"TaskDownloadMissingLyricsDescription": "Transferir letra para músicas",
|
"TaskDownloadMissingLyricsDescription": "Transferir letra para músicas",
|
||||||
"TaskExtractMediaSegmentsDescription": "Extrai ou obtém segmentos de multimédia a partir de plugins com suporte para MediaSegment.",
|
"TaskExtractMediaSegmentsDescription": "Extrai ou obtém segmentos de multimédia a partir de plugins com suporte para MediaSegment.",
|
||||||
"TaskMoveTrickplayImagesDescription": "Move os ficheiros trickplay existentes de acordo com as definições da mediateca."
|
"TaskMoveTrickplayImagesDescription": "Move os ficheiros trickplay existentes de acordo com as definições da mediateca.",
|
||||||
|
"CleanupUserDataTaskDescription": "Apaga todos os dados de utilizador (estados de reprodução, favoritos, etc) de arquivos média não presentes há 90 dias ou mais.",
|
||||||
|
"CleanupUserDataTask": "Limpeza de dados de utilizador"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,5 +135,7 @@
|
|||||||
"TaskMoveTrickplayImagesDescription": "Move os ficheiros trickplay existentes de acordo com as definições da mediateca.",
|
"TaskMoveTrickplayImagesDescription": "Move os ficheiros trickplay existentes de acordo com as definições da mediateca.",
|
||||||
"TaskExtractMediaSegments": "Analisar segmentos de multimédia",
|
"TaskExtractMediaSegments": "Analisar segmentos de multimédia",
|
||||||
"TaskExtractMediaSegmentsDescription": "Extrai ou obtém segmentos de multimédia a partir de plugins com suporte para MediaSegment.",
|
"TaskExtractMediaSegmentsDescription": "Extrai ou obtém segmentos de multimédia a partir de plugins com suporte para MediaSegment.",
|
||||||
"TaskMoveTrickplayImages": "Migrar a localização da imagem do Trickplay"
|
"TaskMoveTrickplayImages": "Migrar a localização da imagem do Trickplay",
|
||||||
|
"CleanupUserDataTask": "Task de limpeza de dados do usuário",
|
||||||
|
"CleanupUserDataTaskDescription": "Remove todos os dados do usuário (progresso, favoritos etc) de mídias que não estão presentes há pelo menos 90 dias."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,7 +98,7 @@
|
|||||||
"TaskCleanTranscodeDescription": "Șterge fișierele de transcodare mai vechi de o zi.",
|
"TaskCleanTranscodeDescription": "Șterge fișierele de transcodare mai vechi de o zi.",
|
||||||
"TaskCleanTranscode": "Curățați directorul de transcodare",
|
"TaskCleanTranscode": "Curățați directorul de transcodare",
|
||||||
"TaskUpdatePluginsDescription": "Descarcă și instalează actualizări pentru extensiile care sunt configurate să se actualizeze automat.",
|
"TaskUpdatePluginsDescription": "Descarcă și instalează actualizări pentru extensiile care sunt configurate să se actualizeze automat.",
|
||||||
"TaskUpdatePlugins": "Actualizați Extensile",
|
"TaskUpdatePlugins": "Actualizați Extensiile",
|
||||||
"TaskRefreshPeopleDescription": "Actualizează metadatele pentru actori și regizori din biblioteca media.",
|
"TaskRefreshPeopleDescription": "Actualizează metadatele pentru actori și regizori din biblioteca media.",
|
||||||
"TaskRefreshPeople": "Actualizează Persoanele",
|
"TaskRefreshPeople": "Actualizează Persoanele",
|
||||||
"TaskCleanLogsDescription": "Șterge fișierele jurnal care au mai mult de {0} zile.",
|
"TaskCleanLogsDescription": "Șterge fișierele jurnal care au mai mult de {0} zile.",
|
||||||
@@ -135,5 +135,7 @@
|
|||||||
"TaskExtractMediaSegmentsDescription": "Extrage sau obține segmentele media de la pluginurile MediaSegment activate.",
|
"TaskExtractMediaSegmentsDescription": "Extrage sau obține segmentele media de la pluginurile MediaSegment activate.",
|
||||||
"TaskMoveTrickplayImages": "Migrează locația imaginii Trickplay",
|
"TaskMoveTrickplayImages": "Migrează locația imaginii Trickplay",
|
||||||
"TaskDownloadMissingLyrics": "Descarcă versurile lipsă",
|
"TaskDownloadMissingLyrics": "Descarcă versurile lipsă",
|
||||||
"TaskDownloadMissingLyricsDescription": "Descarcă versuri pentru melodii"
|
"TaskDownloadMissingLyricsDescription": "Descarcă versuri pentru melodii",
|
||||||
|
"CleanupUserDataTask": "Sarcina de curatare a datelor utilizatorului",
|
||||||
|
"CleanupUserDataTaskDescription": "Sterge toate datele utilizatorului (starea vizionarii, starea favoritelor etc.) de pe suporturile media care nu mai sunt prezente timp de cel puțin 90 de zile."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@
|
|||||||
"ScheduledTaskFailedWithName": "{0} - неудачна",
|
"ScheduledTaskFailedWithName": "{0} - неудачна",
|
||||||
"ScheduledTaskStartedWithName": "{0} - запущена",
|
"ScheduledTaskStartedWithName": "{0} - запущена",
|
||||||
"ServerNameNeedsToBeRestarted": "Необходим перезапуск {0}",
|
"ServerNameNeedsToBeRestarted": "Необходим перезапуск {0}",
|
||||||
"Shows": "Телешоу",
|
"Shows": "Сериалы",
|
||||||
"Songs": "Композиции",
|
"Songs": "Композиции",
|
||||||
"StartupEmbyServerIsLoading": "Jellyfin Server загружается. Повторите попытку в ближайшее время.",
|
"StartupEmbyServerIsLoading": "Jellyfin Server загружается. Повторите попытку в ближайшее время.",
|
||||||
"SubtitleDownloadFailureForItem": "Субтитры к {0} не удалось загрузить",
|
"SubtitleDownloadFailureForItem": "Субтитры к {0} не удалось загрузить",
|
||||||
@@ -138,5 +138,5 @@
|
|||||||
"TaskExtractMediaSegmentsDescription": "Извлекает или получает медиасегменты из плагинов MediaSegment.",
|
"TaskExtractMediaSegmentsDescription": "Извлекает или получает медиасегменты из плагинов MediaSegment.",
|
||||||
"TaskMoveTrickplayImagesDescription": "Перемещает существующие файлы trickplay в соответствии с настройками медиатеки.",
|
"TaskMoveTrickplayImagesDescription": "Перемещает существующие файлы trickplay в соответствии с настройками медиатеки.",
|
||||||
"CleanupUserDataTask": "Задача очистки пользовательских данных",
|
"CleanupUserDataTask": "Задача очистки пользовательских данных",
|
||||||
"CleanupUserDataTaskDescription": "Очищает все пользовательские данные (состояние просмотра, статус избранного и т.д.) с носителей, на которых больше нет информации, по крайней мере, в течение 90 дней."
|
"CleanupUserDataTaskDescription": "Очищает все пользовательские данные (состояние просмотра, статус избранного и т.д.) с медиа, отсутствующих по меньшей мере в течение 90 дней."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskMoveTrickplayImages": "Presunúť umiestnenie obrázkov Trickplay",
|
"TaskMoveTrickplayImages": "Presunúť umiestnenie obrázkov Trickplay",
|
||||||
"TaskMoveTrickplayImagesDescription": "Presunie existujúce súbory Trickplay podľa nastavení knižnice.",
|
"TaskMoveTrickplayImagesDescription": "Presunie existujúce súbory Trickplay podľa nastavení knižnice.",
|
||||||
"TaskDownloadMissingLyrics": "Stiahnuť chýbajúce texty piesní",
|
"TaskDownloadMissingLyrics": "Stiahnuť chýbajúce texty piesní",
|
||||||
"TaskDownloadMissingLyricsDescription": "Stiahne texty pre piesne"
|
"TaskDownloadMissingLyricsDescription": "Stiahne texty pre piesne",
|
||||||
|
"CleanupUserDataTask": "Prečistiť používateľské dáta",
|
||||||
|
"CleanupUserDataTaskDescription": "Vyčistí všetky dáta používateľa (stav sledovania, stav obľúbených atď.) z médií, ktoré už neexistujú aspoň 90 dní."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskCleanCollectionsAndPlaylists": "Počisti zbirke in sezname predvajanja",
|
"TaskCleanCollectionsAndPlaylists": "Počisti zbirke in sezname predvajanja",
|
||||||
"TaskAudioNormalization": "Normalizacija zvoka",
|
"TaskAudioNormalization": "Normalizacija zvoka",
|
||||||
"TaskAudioNormalizationDescription": "Pregled datotek za podatke o normalizaciji zvoka.",
|
"TaskAudioNormalizationDescription": "Pregled datotek za podatke o normalizaciji zvoka.",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "Odstrani elemente iz zbirk in seznamov predvajanja, ki ne obstajajo več."
|
"TaskCleanCollectionsAndPlaylistsDescription": "Odstrani elemente iz zbirk in seznamov predvajanja, ki ne obstajajo več.",
|
||||||
|
"CleanupUserDataTask": "Čiščenje uporabniških podatkov",
|
||||||
|
"CleanupUserDataTaskDescription": "Izbriše vse uporabniške podatke (stanje ogleda, priljubljene itd.) za vsebine, ki že več kot 90 dni niso na voljo."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,5 +135,7 @@
|
|||||||
"TaskCleanCollectionsAndPlaylists": "Pastron koleksionet dhe listat e këngëve",
|
"TaskCleanCollectionsAndPlaylists": "Pastron koleksionet dhe listat e këngëve",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "Heq elementet nga koleksionet dhe listat e këngëve që nuk ekzistojnë më.",
|
"TaskCleanCollectionsAndPlaylistsDescription": "Heq elementet nga koleksionet dhe listat e këngëve që nuk ekzistojnë më.",
|
||||||
"TaskAudioNormalization": "Normalizimi i audios",
|
"TaskAudioNormalization": "Normalizimi i audios",
|
||||||
"TaskAudioNormalizationDescription": "Skannon skedarët për të dhëna të normalizimit të audios."
|
"TaskAudioNormalizationDescription": "Skannon skedarët për të dhëna të normalizimit të audios.",
|
||||||
|
"CleanupUserDataTaskDescription": "Pastron të gjitha të dhënat e përdorueseve (gjendja e shikimit, statusi i të preferuarave etj.) nga mediat që nuk janë më të pranishme për të paktën 90 ditë.",
|
||||||
|
"CleanupUserDataTask": "Veprim për pastrimin të dhënave të përdorueseve"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -126,5 +126,16 @@
|
|||||||
"HearingImpaired": "ослабљен слух",
|
"HearingImpaired": "ослабљен слух",
|
||||||
"TaskAudioNormalization": "Нормализација звука",
|
"TaskAudioNormalization": "Нормализација звука",
|
||||||
"TaskCleanCollectionsAndPlaylists": "Очистите колекције и плејлисте",
|
"TaskCleanCollectionsAndPlaylists": "Очистите колекције и плејлисте",
|
||||||
"TaskAudioNormalizationDescription": "Скенира датотеке за податке о нормализацији звука."
|
"TaskAudioNormalizationDescription": "Скенира датотеке за податке о нормализацији звука.",
|
||||||
|
"TaskRefreshTrickplayImages": "Направи сличице за визуелно премотавање",
|
||||||
|
"TaskRefreshTrickplayImagesDescription": "Прављење сличица које помажу код визуелног премотавања видео-снимака.",
|
||||||
|
"TaskDownloadMissingLyrics": "Преузми стихове који недостају",
|
||||||
|
"TaskCleanCollectionsAndPlaylistsDescription": "Уклања ставке које више не постоје из колекција и плејлиста.",
|
||||||
|
"TaskExtractMediaSegments": "Скенирај сегменте медија",
|
||||||
|
"TaskExtractMediaSegmentsDescription": "Извлачи или добавља сегменте медија у додацима који раде са MediaSegment-ом.",
|
||||||
|
"TaskMoveTrickplayImagesDescription": "Премешта постојеће сличице за визуелно премотавање сходно подешавањима библиотеке.",
|
||||||
|
"CleanupUserDataTask": "Задатак чишћења корисничких података",
|
||||||
|
"CleanupUserDataTaskDescription": "Чисти све корисничке податке (напредак гледања, ознаке за омиљено...) медија који нису доступни 90 дана или дуже.",
|
||||||
|
"TaskMoveTrickplayImages": "Промени локацију сличица за визуелно премотавање",
|
||||||
|
"TaskDownloadMissingLyricsDescription": "Преузми стихове песама"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
"Inherit": "மரபுரிமையாகப் பெறு",
|
"Inherit": "மரபுரிமையாகப் பெறு",
|
||||||
"HeaderRecordingGroups": "பதிவு குழுக்கள்",
|
"HeaderRecordingGroups": "பதிவு குழுக்கள்",
|
||||||
"Folders": "கோப்புறைகள்",
|
"Folders": "கோப்புறைகள்",
|
||||||
"FailedLoginAttemptWithUserName": "{0} இன் உள்நுழைவு முயற்சி தோல்வியடைந்தது",
|
"FailedLoginAttemptWithUserName": "{0} இலிருந்து உள்நுழைவு முயற்சி தோல்வியடைந்தது",
|
||||||
"DeviceOnlineWithName": "{0} இணைக்கப்பட்டது",
|
"DeviceOnlineWithName": "{0} இணைக்கப்பட்டது",
|
||||||
"DeviceOfflineWithName": "{0} துண்டிக்கப்பட்டது",
|
"DeviceOfflineWithName": "{0} துண்டிக்கப்பட்டது",
|
||||||
"Collections": "தொகுப்புகள்",
|
"Collections": "தொகுப்புகள்",
|
||||||
@@ -133,5 +133,9 @@
|
|||||||
"TaskDownloadMissingLyrics": "விடுபட்ட பாடல் வரிகளைப் பதிவிறக்கவும்",
|
"TaskDownloadMissingLyrics": "விடுபட்ட பாடல் வரிகளைப் பதிவிறக்கவும்",
|
||||||
"TaskDownloadMissingLyricsDescription": "பாடல்களுக்கான வரிகளைப் பதிவிறக்குகிறது",
|
"TaskDownloadMissingLyricsDescription": "பாடல்களுக்கான வரிகளைப் பதிவிறக்குகிறது",
|
||||||
"TaskMoveTrickplayImages": "ட்ரிக்பிளே பட இருப்பிடத்தை நகர்த்து",
|
"TaskMoveTrickplayImages": "ட்ரிக்பிளே பட இருப்பிடத்தை நகர்த்து",
|
||||||
"TaskMoveTrickplayImagesDescription": "நூலக அமைப்புகளுக்கு ஏற்ப ஏற்கனவே உள்ள ட்ரிக்பிளே கோப்புகளை நகர்த்துகிறது."
|
"TaskMoveTrickplayImagesDescription": "நூலக அமைப்புகளுக்கு ஏற்ப ஏற்கனவே உள்ள ட்ரிக்பிளே கோப்புகளை நகர்த்துகிறது.",
|
||||||
|
"TaskExtractMediaSegments": "மீடியா பிரிவு ஸ்கேன்",
|
||||||
|
"TaskExtractMediaSegmentsDescription": "மீடியாசெக்மென்ட் இயக்கப்பட்ட செருகுநிரல்களிலிருந்து மீடியா பிரிவுகளைப் பிரித்தெடுக்கிறது அல்லது பெறுகிறது.",
|
||||||
|
"CleanupUserDataTaskDescription": "குறைந்தது 90 நாட்களுக்கு இல்லாத மீடியாவிலிருந்து அனைத்து பயனர் தரவையும் (கண்காணிப்பு நிலை, பிடித்த நிலை போன்றவை) சுத்தம் செய்கிறது.",
|
||||||
|
"CleanupUserDataTask": "பயனர் தரவை சுத்தம் செய்யும் பணி"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -59,5 +59,6 @@
|
|||||||
"NotificationOptionAudioPlayback": "ఆడియో ప్లే కావడం మొదలైంది",
|
"NotificationOptionAudioPlayback": "ఆడియో ప్లే కావడం మొదలైంది",
|
||||||
"NotificationOptionCameraImageUploaded": "కెమెరా చిత్రాన్ని అప్లోడ్ చేశారు",
|
"NotificationOptionCameraImageUploaded": "కెమెరా చిత్రాన్ని అప్లోడ్ చేశారు",
|
||||||
"NotificationOptionInstallationFailed": "ఇన్స్టాలేషన్ విఫలమైంది",
|
"NotificationOptionInstallationFailed": "ఇన్స్టాలేషన్ విఫలమైంది",
|
||||||
"NotificationOptionServerRestartRequired": "సర్వర్ రీస్టార్ట్ అవసరం"
|
"NotificationOptionServerRestartRequired": "సర్వర్ రీస్టార్ట్ అవసరం",
|
||||||
|
"Inherit": "సంక్రమించు"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,8 +98,8 @@
|
|||||||
"TasksLibraryCategory": "Kütüphane",
|
"TasksLibraryCategory": "Kütüphane",
|
||||||
"TasksMaintenanceCategory": "Bakım",
|
"TasksMaintenanceCategory": "Bakım",
|
||||||
"TaskRefreshPeopleDescription": "Medya kütüphanenizdeki videoların oyuncu ve yönetmen bilgilerini günceller.",
|
"TaskRefreshPeopleDescription": "Medya kütüphanenizdeki videoların oyuncu ve yönetmen bilgilerini günceller.",
|
||||||
"TaskDownloadMissingSubtitlesDescription": "Meta veri yapılandırmasına dayalı olarak eksik altyazılar için internette arama yapar.",
|
"TaskDownloadMissingSubtitlesDescription": "Meta veri yapılandırmasına dayalı olarak eksik alt yazılar için internette arama yapar.",
|
||||||
"TaskDownloadMissingSubtitles": "Eksik altyazıları indir",
|
"TaskDownloadMissingSubtitles": "Eksik alt yazıları indir",
|
||||||
"TaskRefreshChannelsDescription": "Internet kanal bilgilerini yenile.",
|
"TaskRefreshChannelsDescription": "Internet kanal bilgilerini yenile.",
|
||||||
"TaskRefreshChannels": "Kanalları Yenile",
|
"TaskRefreshChannels": "Kanalları Yenile",
|
||||||
"TaskCleanTranscodeDescription": "Bir günden daha eski kod dönüştürme dosyalarını siler.",
|
"TaskCleanTranscodeDescription": "Bir günden daha eski kod dönüştürme dosyalarını siler.",
|
||||||
@@ -136,5 +136,7 @@
|
|||||||
"TaskMoveTrickplayImagesDescription": "Mevcut trickplay dosyalarını kütüphane ayarlarına göre taşır.",
|
"TaskMoveTrickplayImagesDescription": "Mevcut trickplay dosyalarını kütüphane ayarlarına göre taşır.",
|
||||||
"TaskDownloadMissingLyrics": "Eksik şarkı sözlerini indir",
|
"TaskDownloadMissingLyrics": "Eksik şarkı sözlerini indir",
|
||||||
"TaskDownloadMissingLyricsDescription": "Şarkı sözlerini indirir",
|
"TaskDownloadMissingLyricsDescription": "Şarkı sözlerini indirir",
|
||||||
"TaskExtractMediaSegmentsDescription": "MediaSegment özelliği etkin olan eklentilerden medya segmentlerini çıkarır veya alır."
|
"TaskExtractMediaSegmentsDescription": "MediaSegment özelliği etkin olan eklentilerden medya segmentlerini çıkarır veya alır.",
|
||||||
|
"CleanupUserDataTask": "Kullanıcı verisi temizleme görevi",
|
||||||
|
"CleanupUserDataTaskDescription": "En az 90 gün boyunca artık mevcut olmayan medyadaki tüm kullanıcı verilerini (İzleme durumu, favori durumu vb.) temizler."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,16 @@
|
|||||||
{
|
{
|
||||||
"Books": "کتابیں"
|
"Books": "کتابیں",
|
||||||
|
"AppDeviceValues": "ایپ: {0}، ڈیوائس: {1}",
|
||||||
|
"Albums": "البمز",
|
||||||
|
"Application": "ایپلی کیشن",
|
||||||
|
"Artists": "فنکار",
|
||||||
|
"AuthenticationSucceededWithUserName": "{0} کی کامیابی سے تصدیق ہو چکی ہے",
|
||||||
|
"CameraImageUploadedFrom": "ایک نئی کیمرے کی تصویر {0} سے اپ لوڈ کی گئی ہے",
|
||||||
|
"Channels": "چینلز",
|
||||||
|
"ChapterNameValue": "باب {0}",
|
||||||
|
"Collections": "مجموعے",
|
||||||
|
"Default": "ڈیفالٹ",
|
||||||
|
"DeviceOfflineWithName": "{0} نے رابطہ منقطع کر دیا ہے",
|
||||||
|
"DeviceOnlineWithName": "{0} منسلک ہے",
|
||||||
|
"External": "بیرونی"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -123,5 +123,9 @@
|
|||||||
"TaskCleanActivityLogDescription": "تشکیل شدہ عمر سے زیادہ پرانی سرگرمی لاگ اندراجات کو حذف کرتا ہے۔",
|
"TaskCleanActivityLogDescription": "تشکیل شدہ عمر سے زیادہ پرانی سرگرمی لاگ اندراجات کو حذف کرتا ہے۔",
|
||||||
"External": "بیرونی",
|
"External": "بیرونی",
|
||||||
"HearingImpaired": "قوت سماعت سے محروم",
|
"HearingImpaired": "قوت سماعت سے محروم",
|
||||||
"TaskCleanActivityLog": "سرگرمی لاگ کو صاف کریں"
|
"TaskCleanActivityLog": "سرگرمی لاگ کو صاف کریں",
|
||||||
|
"TaskDownloadMissingLyrics": "غائب بول ڈاؤن لوڈ کریں",
|
||||||
|
"TaskDownloadMissingLyricsDescription": "گانے کے غائب بول ڈاؤن لوڈ کریں",
|
||||||
|
"TaskAudioNormalization": "آڈیو نارملائزیشن",
|
||||||
|
"TaskAudioNormalizationDescription": "آڈیو نارملائزیشن ڈیٹا کے لیے فائلوں کو سکین کرتا ہے۔"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -110,5 +110,6 @@
|
|||||||
"TaskCleanCache": "Kesh katalogini tozalash",
|
"TaskCleanCache": "Kesh katalogini tozalash",
|
||||||
"TaskRefreshChapterImages": "Sahnadan tasvirini chiqarish",
|
"TaskRefreshChapterImages": "Sahnadan tasvirini chiqarish",
|
||||||
"TaskRefreshChapterImagesDescription": "Sahnalarni o'z ichiga olgan videolar uchun eskizlarni yaratadi.",
|
"TaskRefreshChapterImagesDescription": "Sahnalarni o'z ichiga olgan videolar uchun eskizlarni yaratadi.",
|
||||||
"TaskRefreshLibrary": "Media kutubxonangizni skanerlash"
|
"TaskRefreshLibrary": "Media kutubxonangizni skanerlash",
|
||||||
|
"TaskCleanLogsDescription": "{0} kundan eski log fayllarni o'chiradi."
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -136,5 +136,6 @@
|
|||||||
"TaskAudioNormalizationDescription": "掃描檔案裏的音訊同等化資料。",
|
"TaskAudioNormalizationDescription": "掃描檔案裏的音訊同等化資料。",
|
||||||
"TaskCleanCollectionsAndPlaylistsDescription": "從資料庫及播放清單中移除已不存在的項目。",
|
"TaskCleanCollectionsAndPlaylistsDescription": "從資料庫及播放清單中移除已不存在的項目。",
|
||||||
"TaskMoveTrickplayImagesDescription": "根據媒體庫設定移動現有的 Trickplay 檔案。",
|
"TaskMoveTrickplayImagesDescription": "根據媒體庫設定移動現有的 Trickplay 檔案。",
|
||||||
"TaskMoveTrickplayImages": "轉移 Trickplay 影像位置"
|
"TaskMoveTrickplayImages": "轉移 Trickplay 影像位置",
|
||||||
|
"CleanupUserDataTask": "用戶資料清理工作"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,23 +5,23 @@
|
|||||||
"Artists": "藝人",
|
"Artists": "藝人",
|
||||||
"AuthenticationSucceededWithUserName": "成功授權 {0}",
|
"AuthenticationSucceededWithUserName": "成功授權 {0}",
|
||||||
"Books": "書籍",
|
"Books": "書籍",
|
||||||
"CameraImageUploadedFrom": "已從 {0} 成功上傳一張相片",
|
"CameraImageUploadedFrom": "已從 {0} 成功上傳一張照片",
|
||||||
"Channels": "頻道",
|
"Channels": "頻道",
|
||||||
"ChapterNameValue": "章節 {0}",
|
"ChapterNameValue": "章節 {0}",
|
||||||
"Collections": "系列作",
|
"Collections": "系列作",
|
||||||
"DeviceOfflineWithName": "{0} 已中斷連接",
|
"DeviceOfflineWithName": "{0} 已中斷連接",
|
||||||
"DeviceOnlineWithName": "{0} 已連接",
|
"DeviceOnlineWithName": "{0} 已連接",
|
||||||
"FailedLoginAttemptWithUserName": "來自使用者 {0} 的登入失敗嘗試",
|
"FailedLoginAttemptWithUserName": "來自 {0} 的登入失敗嘗試",
|
||||||
"Favorites": "我的最愛",
|
"Favorites": "我的最愛",
|
||||||
"Folders": "資料夾",
|
"Folders": "資料夾",
|
||||||
"Genres": "風格",
|
"Genres": "風格",
|
||||||
"HeaderAlbumArtists": "專輯演出者",
|
"HeaderAlbumArtists": "專輯演出者",
|
||||||
"HeaderContinueWatching": "繼續觀看",
|
"HeaderContinueWatching": "繼續觀看",
|
||||||
"HeaderFavoriteAlbums": "最愛專輯",
|
"HeaderFavoriteAlbums": "最愛專輯",
|
||||||
"HeaderFavoriteArtists": "最愛藝人",
|
"HeaderFavoriteArtists": "最愛的藝人",
|
||||||
"HeaderFavoriteEpisodes": "最愛劇集",
|
"HeaderFavoriteEpisodes": "最愛的劇集",
|
||||||
"HeaderFavoriteShows": "最愛節目",
|
"HeaderFavoriteShows": "最愛的節目",
|
||||||
"HeaderFavoriteSongs": "最愛歌曲",
|
"HeaderFavoriteSongs": "最愛的歌曲",
|
||||||
"HeaderLiveTV": "電視直播",
|
"HeaderLiveTV": "電視直播",
|
||||||
"HeaderNextUp": "接下來",
|
"HeaderNextUp": "接下來",
|
||||||
"HomeVideos": "家庭影片",
|
"HomeVideos": "家庭影片",
|
||||||
@@ -135,5 +135,7 @@
|
|||||||
"TaskExtractMediaSegments": "掃描媒體片段",
|
"TaskExtractMediaSegments": "掃描媒體片段",
|
||||||
"TaskExtractMediaSegmentsDescription": "從使用媒體片段的擴充功能取得媒體片段。",
|
"TaskExtractMediaSegmentsDescription": "從使用媒體片段的擴充功能取得媒體片段。",
|
||||||
"TaskMoveTrickplayImages": "遷移快轉縮圖位置",
|
"TaskMoveTrickplayImages": "遷移快轉縮圖位置",
|
||||||
"TaskMoveTrickplayImagesDescription": "根據媒體庫的設定遷移快轉縮圖的檔案。"
|
"TaskMoveTrickplayImagesDescription": "根據媒體庫的設定遷移快轉縮圖的檔案。",
|
||||||
|
"CleanupUserDataTask": "用戶資料清理工作",
|
||||||
|
"CleanupUserDataTaskDescription": "從用戶資料中清除已被刪除超過 90 天的媒體的相關資料。"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -128,7 +128,8 @@ namespace Emby.Server.Implementations.Localization
|
|||||||
}
|
}
|
||||||
|
|
||||||
string name = parts[3];
|
string name = parts[3];
|
||||||
if (string.IsNullOrWhiteSpace(name))
|
string displayname = parts[3];
|
||||||
|
if (string.IsNullOrWhiteSpace(displayname))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -138,6 +139,10 @@ namespace Emby.Server.Implementations.Localization
|
|||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
else if (twoCharName.Contains('-', StringComparison.OrdinalIgnoreCase))
|
||||||
|
{
|
||||||
|
name = twoCharName;
|
||||||
|
}
|
||||||
|
|
||||||
string[] threeLetterNames;
|
string[] threeLetterNames;
|
||||||
if (string.IsNullOrWhiteSpace(parts[1]))
|
if (string.IsNullOrWhiteSpace(parts[1]))
|
||||||
@@ -153,7 +158,7 @@ namespace Emby.Server.Implementations.Localization
|
|||||||
iso6392BtoTdict.TryAdd(parts[1], parts[0]);
|
iso6392BtoTdict.TryAdd(parts[1], parts[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
list.Add(new CultureDto(name, name, twoCharName, threeLetterNames));
|
list.Add(new CultureDto(name, displayname, twoCharName, threeLetterNames));
|
||||||
}
|
}
|
||||||
|
|
||||||
_cultures = list;
|
_cultures = list;
|
||||||
|
|||||||
@@ -311,8 +311,8 @@ nia|||Nias|nias
|
|||||||
nic|||Niger-Kordofanian languages|nigéro-kordofaniennes, langues
|
nic|||Niger-Kordofanian languages|nigéro-kordofaniennes, langues
|
||||||
niu|||Niuean|niué
|
niu|||Niuean|niué
|
||||||
nld|dut|nl|Dutch; Flemish|néerlandais; flamand
|
nld|dut|nl|Dutch; Flemish|néerlandais; flamand
|
||||||
nno||nn|Norwegian Nynorsk; Nynorsk, Norwegian|norvégien nynorsk; nynorsk, norvégien
|
nno||nn|Norwegian (Nynorsk)|norvégien (nynorsk)
|
||||||
nob||nb|Bokmål, Norwegian; Norwegian Bokmål|norvégien bokmål
|
nob||nb|Norwegian (Bokmal)|norvégien (bokmål)
|
||||||
nog|||Nogai|nogaï; nogay
|
nog|||Nogai|nogaï; nogay
|
||||||
non|||Norse, Old|norrois, vieux
|
non|||Norse, Old|norrois, vieux
|
||||||
nor||no|Norwegian|norvégien
|
nor||no|Norwegian|norvégien
|
||||||
@@ -347,8 +347,8 @@ pli||pi|Pali|pali
|
|||||||
pol||pl|Polish|polonais
|
pol||pl|Polish|polonais
|
||||||
pon|||Pohnpeian|pohnpei
|
pon|||Pohnpeian|pohnpei
|
||||||
por||pt|Portuguese|portugais
|
por||pt|Portuguese|portugais
|
||||||
por||pt-pt|Portuguese (Portugal)|portugais (pt-pt)
|
pop||pt-pt|Portuguese (Portugal)|portugais (pt-pt)
|
||||||
por||pt-br|Portuguese (Brazil)|portugais (pt-br)
|
pob||pt-br|Portuguese (Brazil)|portugais (pt-br)
|
||||||
pra|||Prakrit languages|prâkrit, langues
|
pra|||Prakrit languages|prâkrit, langues
|
||||||
pro|||Provençal, Old (to 1500)|provençal ancien (jusqu'à 1500)
|
pro|||Provençal, Old (to 1500)|provençal ancien (jusqu'à 1500)
|
||||||
pus||ps|Pushto; Pashto|pachto
|
pus||ps|Pushto; Pashto|pachto
|
||||||
@@ -373,7 +373,7 @@ sam|||Samaritan Aramaic|samaritain
|
|||||||
san||sa|Sanskrit|sanskrit
|
san||sa|Sanskrit|sanskrit
|
||||||
sas|||Sasak|sasak
|
sas|||Sasak|sasak
|
||||||
sat|||Santali|santal
|
sat|||Santali|santal
|
||||||
scc|srp|sr|Serbian|serbe
|
srp||sr|Serbian|serbe
|
||||||
scn|||Sicilian|sicilien
|
scn|||Sicilian|sicilien
|
||||||
sco|||Scots|écossais
|
sco|||Scots|écossais
|
||||||
sel|||Selkup|selkoupe
|
sel|||Selkup|selkoupe
|
||||||
@@ -391,10 +391,10 @@ slv||sl|Slovenian|slovène
|
|||||||
sma|||Southern Sami|sami du Sud
|
sma|||Southern Sami|sami du Sud
|
||||||
sme||se|Northern Sami|sami du Nord
|
sme||se|Northern Sami|sami du Nord
|
||||||
smi|||Sami languages|sames, langues
|
smi|||Sami languages|sames, langues
|
||||||
smj|||Lule Sami|sami de Lule
|
smj|||Sami (Lule)|sami de Lule
|
||||||
smn|||Inari Sami|sami d'Inari
|
smn|||Sami (Inari)|sami d'Inari
|
||||||
smo||sm|Samoan|samoan
|
smo||sm|Samoan|samoan
|
||||||
sms|||Skolt Sami|sami skolt
|
sms|||Sami (Skolt)|sami skolt
|
||||||
sna||sn|Shona|shona
|
sna||sn|Shona|shona
|
||||||
snd||sd|Sindhi|sindhi
|
snd||sd|Sindhi|sindhi
|
||||||
snk|||Soninke|soninké
|
snk|||Soninke|soninké
|
||||||
@@ -402,8 +402,8 @@ sog|||Sogdian|sogdien
|
|||||||
som||so|Somali|somali
|
som||so|Somali|somali
|
||||||
son|||Songhai languages|songhai, langues
|
son|||Songhai languages|songhai, langues
|
||||||
sot||st|Sotho, Southern|sotho du Sud
|
sot||st|Sotho, Southern|sotho du Sud
|
||||||
spa||es-mx|Spanish; Latin|espagnol; Latin
|
|
||||||
spa||es|Spanish; Castilian|espagnol; castillan
|
spa||es|Spanish; Castilian|espagnol; castillan
|
||||||
|
spa||es-419|Spanish; Latin|espagnol; Latin
|
||||||
sqi|alb|sq|Albanian|albanais
|
sqi|alb|sq|Albanian|albanais
|
||||||
srd||sc|Sardinian|sarde
|
srd||sc|Sardinian|sarde
|
||||||
srn|||Sranan Tongo|sranan tongo
|
srn|||Sranan Tongo|sranan tongo
|
||||||
@@ -483,9 +483,12 @@ zen|||Zenaga|zenaga
|
|||||||
zgh|||Standard Moroccan Tamazight|amazighe standard marocain
|
zgh|||Standard Moroccan Tamazight|amazighe standard marocain
|
||||||
zha||za|Zhuang; Chuang|zhuang; chuang
|
zha||za|Zhuang; Chuang|zhuang; chuang
|
||||||
zho|chi|zh|Chinese|chinois
|
zho|chi|zh|Chinese|chinois
|
||||||
zho|chi|ze|Chinese; Bilingual|chinois
|
zho|chi|ze|Chinese (Bilingual)|chinois
|
||||||
zho|chi|zh-tw|Chinese; Traditional|chinois
|
zho|chi|zh-cn|Chinese (Simplified)|chinois
|
||||||
zho|chi|zh-hk|Chinese; Hong Kong|chinois
|
zho|chi|zh-hans|Chinese (Simplified)|chinois
|
||||||
|
zho|chi|zh-tw|Chinese (Traditional)|chinois
|
||||||
|
zho|chi|zh-hant|Chinese (Traditional)|chinois
|
||||||
|
zho|chi|zh-hk|Chinese (Hong Kong)|chinois
|
||||||
znd|||Zande languages|zandé, langues
|
znd|||Zande languages|zandé, langues
|
||||||
zul||zu|Zulu|zoulou
|
zul||zu|Zulu|zoulou
|
||||||
zun|||Zuni|zuni
|
zun|||Zuni|zuni
|
||||||
|
|||||||
@@ -244,6 +244,7 @@ namespace Emby.Server.Implementations.Playlists
|
|||||||
|
|
||||||
// Update the playlist in the repository
|
// Update the playlist in the repository
|
||||||
playlist.LinkedChildren = [.. playlist.LinkedChildren, .. childrenToAdd];
|
playlist.LinkedChildren = [.. playlist.LinkedChildren, .. childrenToAdd];
|
||||||
|
playlist.DateLastMediaAdded = DateTime.UtcNow;
|
||||||
|
|
||||||
await UpdatePlaylistInternal(playlist).ConfigureAwait(false);
|
await UpdatePlaylistInternal(playlist).ConfigureAwait(false);
|
||||||
|
|
||||||
@@ -314,7 +315,7 @@ namespace Emby.Server.Implementations.Playlists
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
var newPriorItemIndex = newIndex > oldIndexAccessible ? newIndex : newIndex - 1 < 0 ? 0 : newIndex - 1;
|
var newPriorItemIndex = Math.Max(newIndex - 1, 0);
|
||||||
var newPriorItemId = accessibleChildren[newPriorItemIndex].Item1.ItemId;
|
var newPriorItemId = accessibleChildren[newPriorItemIndex].Item1.ItemId;
|
||||||
var newPriorItemIndexOnAllChildren = children.FindIndex(c => c.Item1.ItemId.Equals(newPriorItemId));
|
var newPriorItemIndexOnAllChildren = children.FindIndex(c => c.Item1.ItemId.Equals(newPriorItemId));
|
||||||
var adjustedNewIndex = DetermineAdjustedIndex(newPriorItemIndexOnAllChildren, newIndex);
|
var adjustedNewIndex = DetermineAdjustedIndex(newPriorItemIndexOnAllChildren, newIndex);
|
||||||
|
|||||||
@@ -423,7 +423,7 @@ namespace Emby.Server.Implementations.Plugins
|
|||||||
Overview = packageInfo.Overview,
|
Overview = packageInfo.Overview,
|
||||||
Owner = packageInfo.Owner,
|
Owner = packageInfo.Owner,
|
||||||
TargetAbi = versionInfo.TargetAbi ?? string.Empty,
|
TargetAbi = versionInfo.TargetAbi ?? string.Empty,
|
||||||
Timestamp = string.IsNullOrEmpty(versionInfo.Timestamp) ? DateTime.MinValue : DateTime.Parse(versionInfo.Timestamp, CultureInfo.InvariantCulture),
|
Timestamp = string.IsNullOrEmpty(versionInfo.Timestamp) ? DateTime.MinValue : DateTime.Parse(versionInfo.Timestamp, CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal),
|
||||||
Version = versionInfo.Version,
|
Version = versionInfo.Version,
|
||||||
Status = status == PluginStatus.Disabled ? PluginStatus.Disabled : PluginStatus.Active, // Keep disabled state.
|
Status = status == PluginStatus.Disabled ? PluginStatus.Disabled : PluginStatus.Active, // Keep disabled state.
|
||||||
AutoUpdate = true,
|
AutoUpdate = true,
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user