mirror of
https://github.com/Prowlarr/Prowlarr.git
synced 2026-04-17 21:44:48 -04:00
Compare commits
47 Commits
v1.25.3.48
...
v1.28.0.48
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f3328863e1 | ||
|
|
a23d792781 | ||
|
|
f066cf399d | ||
|
|
61e863cb31 | ||
|
|
b2afbc6872 | ||
|
|
aace65f88e | ||
|
|
9ab2d8b444 | ||
|
|
bc314061ef | ||
|
|
87b3dcd780 | ||
|
|
f3b99f68f6 | ||
|
|
c4a90e8ba4 | ||
|
|
41320ca2dc | ||
|
|
b8b32f8708 | ||
|
|
30c4bb24e8 | ||
|
|
b447db5d08 | ||
|
|
299001a513 | ||
|
|
2871f1f2a2 | ||
|
|
a9b93df0c9 | ||
|
|
2726787ee9 | ||
|
|
b917932f19 | ||
|
|
06ae85e6d1 | ||
|
|
b1c7e98664 | ||
|
|
62479737a7 | ||
|
|
8e69415d64 | ||
|
|
222dfb1821 | ||
|
|
94f439e238 | ||
|
|
903a88c121 | ||
|
|
9690ab6883 | ||
|
|
1e1a2b3b4a | ||
|
|
9dc2d3669c | ||
|
|
511c76e219 | ||
|
|
78329b7b92 | ||
|
|
4240048853 | ||
|
|
432af42ffd | ||
|
|
0d6c03f8d4 | ||
|
|
96830f975e | ||
|
|
13c538ff58 | ||
|
|
14250e9634 | ||
|
|
e2f7890d76 | ||
|
|
257d38de66 | ||
|
|
fd2a14e01b | ||
|
|
b4d76c7138 | ||
|
|
9655f37fa8 | ||
|
|
246fb9b855 | ||
|
|
25afadc9b2 | ||
|
|
3f547f0856 | ||
|
|
11e322b6d7 |
@@ -1,33 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="70px" height="70px" viewBox="0 0 70 70" style="enable-background:new 0 0 70 70;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="-1.3318" y1="43.7371" x2="67.0419" y2="26.0967">
|
||||
<stop offset="0.1237" style="stop-color:#7866FF"/>
|
||||
<stop offset="0.5376" style="stop-color:#FE2EB6"/>
|
||||
<stop offset="0.8548" style="stop-color:#FD0486"/>
|
||||
</linearGradient>
|
||||
<polygon style="fill:url(#SVGID_1_);" points="67.3,16 43.7,0 0,31.1 11.1,70 58.9,60.3 "/>
|
||||
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="45.9148" y1="38.9098" x2="67.6577" y2="9.0989">
|
||||
<stop offset="0.1237" style="stop-color:#FF0080"/>
|
||||
<stop offset="0.2587" style="stop-color:#FE0385"/>
|
||||
<stop offset="0.4109" style="stop-color:#FA0C92"/>
|
||||
<stop offset="0.5713" style="stop-color:#F41BA9"/>
|
||||
<stop offset="0.7363" style="stop-color:#EB2FC8"/>
|
||||
<stop offset="0.8656" style="stop-color:#E343E6"/>
|
||||
</linearGradient>
|
||||
<polygon style="fill:url(#SVGID_2_);" points="67.3,16 43.7,0 38,15.7 38,47.8 70,47.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="13.4" y="13.4" style="fill:#000000;" width="43.2" height="43.2"/>
|
||||
<rect x="17.4" y="48.5" style="fill:#FFFFFF;" width="16.2" height="2.7"/>
|
||||
<g>
|
||||
<path style="fill:#FFFFFF;" d="M17.4,19.1h6.9c5.6,0,9.5,3.8,9.5,8.9V28c0,5-3.9,8.9-9.5,8.9h-6.9V19.1z M21.4,22.7v10.7h3
|
||||
c3.2,0,5.4-2.2,5.4-5.3V28c0-3.2-2.2-5.4-5.4-5.4H21.4z"/>
|
||||
<polygon style="fill:#FFFFFF;" points="40.3,22.7 34.9,22.7 34.9,19.1 49.6,19.1 49.6,22.7 44.2,22.7 44.2,37 40.3,37 "/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
@@ -1,66 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="120.1px" height="130.2px" viewBox="0 0 120.1 130.2" style="enable-background:new 0 0 120.1 130.2;" xml:space="preserve"
|
||||
>
|
||||
<g>
|
||||
<linearGradient id="XMLID_2_" gradientUnits="userSpaceOnUse" x1="31.8412" y1="120.5578" x2="110.2402" y2="73.24">
|
||||
<stop offset="0" style="stop-color:#FCEE39"/>
|
||||
<stop offset="1" style="stop-color:#F37B3D"/>
|
||||
</linearGradient>
|
||||
<path id="XMLID_3041_" style="fill:url(#XMLID_2_);" d="M118.6,71.8c0.9-0.8,1.4-1.9,1.5-3.2c0.1-2.6-1.8-4.7-4.4-4.9
|
||||
c-1.2-0.1-2.4,0.4-3.3,1.1l0,0l-83.8,45.9c-1.9,0.8-3.6,2.2-4.7,4.1c-2.9,4.8-1.3,11,3.6,13.9c3.4,2,7.5,1.8,10.7-0.2l0,0l0,0
|
||||
c0.2-0.2,0.5-0.3,0.7-0.5l78-54.8C117.3,72.9,118.4,72.1,118.6,71.8L118.6,71.8L118.6,71.8z"/>
|
||||
<linearGradient id="XMLID_3_" gradientUnits="userSpaceOnUse" x1="48.3607" y1="6.9083" x2="119.9179" y2="69.5546">
|
||||
<stop offset="0" style="stop-color:#EF5A6B"/>
|
||||
<stop offset="0.57" style="stop-color:#F26F4E"/>
|
||||
<stop offset="1" style="stop-color:#F37B3D"/>
|
||||
</linearGradient>
|
||||
<path id="XMLID_3049_" style="fill:url(#XMLID_3_);" d="M118.8,65.1L118.8,65.1L55,2.5C53.6,1,51.6,0,49.3,0
|
||||
c-4.3,0-7.7,3.5-7.7,7.7v0c0,2.1,0.8,3.9,2.1,5.3l0,0l0,0c0.4,0.4,0.8,0.7,1.2,1l67.4,57.7l0,0c0.8,0.7,1.8,1.2,3,1.3
|
||||
c2.6,0.1,4.7-1.8,4.9-4.4C120.2,67.3,119.7,66,118.8,65.1z"/>
|
||||
<linearGradient id="XMLID_4_" gradientUnits="userSpaceOnUse" x1="52.9467" y1="63.6407" x2="10.5379" y2="37.1562">
|
||||
<stop offset="0" style="stop-color:#7C59A4"/>
|
||||
<stop offset="0.3852" style="stop-color:#AF4C92"/>
|
||||
<stop offset="0.7654" style="stop-color:#DC4183"/>
|
||||
<stop offset="0.957" style="stop-color:#ED3D7D"/>
|
||||
</linearGradient>
|
||||
<path id="XMLID_3042_" style="fill:url(#XMLID_4_);" d="M57.1,59.5C57,59.5,17.7,28.5,16.9,28l0,0l0,0c-0.6-0.3-1.2-0.6-1.8-0.9
|
||||
c-5.8-2.2-12.2,0.8-14.4,6.6c-1.9,5.1,0.2,10.7,4.6,13.4l0,0l0,0C6,47.5,6.6,47.8,7.3,48c0.4,0.2,45.4,18.8,45.4,18.8l0,0
|
||||
c1.8,0.8,3.9,0.3,5.1-1.2C59.3,63.7,59,61,57.1,59.5z"/>
|
||||
<linearGradient id="XMLID_5_" gradientUnits="userSpaceOnUse" x1="52.1736" y1="3.7019" x2="10.7706" y2="37.8971">
|
||||
<stop offset="0" style="stop-color:#EF5A6B"/>
|
||||
<stop offset="0.364" style="stop-color:#EE4E72"/>
|
||||
<stop offset="1" style="stop-color:#ED3D7D"/>
|
||||
</linearGradient>
|
||||
<path id="XMLID_3057_" style="fill:url(#XMLID_5_);" d="M49.3,0c-1.7,0-3.3,0.6-4.6,1.5L4.9,28.3c-0.1,0.1-0.2,0.1-0.2,0.2l-0.1,0
|
||||
l0,0c-1.7,1.2-3.1,3-3.9,5.1C-1.5,39.4,1.5,45.9,7.3,48c3.6,1.4,7.5,0.7,10.4-1.4l0,0l0,0c0.7-0.5,1.3-1,1.8-1.6l34.6-31.2l0,0
|
||||
c1.8-1.4,3-3.6,3-6.1v0C57.1,3.5,53.6,0,49.3,0z"/>
|
||||
<g id="XMLID_3008_">
|
||||
<rect id="XMLID_3033_" x="34.6" y="37.4" style="fill:#000000;" width="51" height="51"/>
|
||||
<rect id="XMLID_3032_" x="39" y="78.8" style="fill:#FFFFFF;" width="19.1" height="3.2"/>
|
||||
<g id="XMLID_3009_">
|
||||
<path id="XMLID_3030_" style="fill:#FFFFFF;" d="M38.8,50.8l1.5-1.4c0.4,0.5,0.8,0.8,1.3,0.8c0.6,0,0.9-0.4,0.9-1.2l0-5.3l2.3,0
|
||||
l0,5.3c0,1-0.3,1.8-0.8,2.3c-0.5,0.5-1.3,0.8-2.3,0.8C40.2,52.2,39.4,51.6,38.8,50.8z"/>
|
||||
<path id="XMLID_3028_" style="fill:#FFFFFF;" d="M45.3,43.8l6.7,0v1.9l-4.4,0V47l4,0l0,1.8l-4,0l0,1.3l4.5,0l0,2l-6.7,0
|
||||
L45.3,43.8z"/>
|
||||
<path id="XMLID_3026_" style="fill:#FFFFFF;" d="M55,45.8l-2.5,0l0-2l7.3,0l0,2l-2.5,0l0,6.3l-2.3,0L55,45.8z"/>
|
||||
<path id="XMLID_3022_" style="fill:#FFFFFF;" d="M39,54l4.3,0c1,0,1.8,0.3,2.3,0.7c0.3,0.3,0.5,0.8,0.5,1.4v0
|
||||
c0,1-0.5,1.5-1.3,1.9c1,0.3,1.6,0.9,1.6,2v0c0,1.4-1.2,2.3-3.1,2.3l-4.3,0L39,54z M43.8,56.6c0-0.5-0.4-0.7-1-0.7l-1.5,0l0,1.5
|
||||
l1.4,0C43.4,57.3,43.8,57.1,43.8,56.6L43.8,56.6z M43,59l-1.8,0l0,1.5H43c0.7,0,1.1-0.3,1.1-0.8v0C44.1,59.2,43.7,59,43,59z"/>
|
||||
<path id="XMLID_3019_" style="fill:#FFFFFF;" d="M46.8,54l3.9,0c1.3,0,2.1,0.3,2.7,0.9c0.5,0.5,0.7,1.1,0.7,1.9v0
|
||||
c0,1.3-0.7,2.1-1.7,2.6l2,2.9l-2.6,0l-1.7-2.5h-1l0,2.5l-2.3,0L46.8,54z M50.6,58c0.8,0,1.2-0.4,1.2-1v0c0-0.7-0.5-1-1.2-1
|
||||
l-1.5,0v2H50.6z"/>
|
||||
<path id="XMLID_3016_" style="fill:#FFFFFF;" d="M56.8,54l2.2,0l3.5,8.4l-2.5,0l-0.6-1.5l-3.2,0l-0.6,1.5l-2.4,0L56.8,54z
|
||||
M58.8,59l-0.9-2.3L57,59L58.8,59z"/>
|
||||
<path id="XMLID_3014_" style="fill:#FFFFFF;" d="M62.8,54l2.3,0l0,8.3l-2.3,0L62.8,54z"/>
|
||||
<path id="XMLID_3012_" style="fill:#FFFFFF;" d="M65.7,54l2.1,0l3.4,4.4l0-4.4l2.3,0l0,8.3l-2,0L68,57.8l0,4.6l-2.3,0L65.7,54z"
|
||||
/>
|
||||
<path id="XMLID_3010_" style="fill:#FFFFFF;" d="M73.7,61.1l1.3-1.5c0.8,0.7,1.7,1,2.7,1c0.6,0,1-0.2,1-0.6v0
|
||||
c0-0.4-0.3-0.5-1.4-0.8c-1.8-0.4-3.1-0.9-3.1-2.6v0c0-1.5,1.2-2.7,3.2-2.7c1.4,0,2.5,0.4,3.4,1.1l-1.2,1.6
|
||||
c-0.8-0.5-1.6-0.8-2.3-0.8c-0.6,0-0.8,0.2-0.8,0.5v0c0,0.4,0.3,0.5,1.4,0.8c1.9,0.4,3.1,1,3.1,2.6v0c0,1.7-1.3,2.7-3.4,2.7
|
||||
C76.1,62.5,74.7,62,73.7,61.1z"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.8 KiB |
@@ -1,50 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="70px" height="70px" viewBox="0 0 70 70" style="enable-background:new 0 0 70 70;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<g>
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="22.9451" y1="75.7869" x2="74.7868" y2="20.6415">
|
||||
<stop offset="1.612903e-002" style="stop-color:#B35BA3"/>
|
||||
<stop offset="0.4044" style="stop-color:#C41E57"/>
|
||||
<stop offset="0.4677" style="stop-color:#C41E57"/>
|
||||
<stop offset="0.6505" style="stop-color:#EB8523"/>
|
||||
<stop offset="0.9516" style="stop-color:#FEBD11"/>
|
||||
</linearGradient>
|
||||
<polygon style="fill:url(#SVGID_1_);" points="49.8,15.2 36,36.7 58.4,70 70,23.1 "/>
|
||||
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="17.7187" y1="73.2922" x2="69.5556" y2="18.1519">
|
||||
<stop offset="1.612903e-002" style="stop-color:#B35BA3"/>
|
||||
<stop offset="0.4044" style="stop-color:#C41E57"/>
|
||||
<stop offset="0.4677" style="stop-color:#C41E57"/>
|
||||
<stop offset="0.7043" style="stop-color:#EB8523"/>
|
||||
</linearGradient>
|
||||
<polygon style="fill:url(#SVGID_2_);" points="51.1,15.7 49,0 18.8,33.6 27.6,42.3 20.8,70 58.4,70 "/>
|
||||
</g>
|
||||
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="1.8281" y1="53.4275" x2="48.8245" y2="9.2255">
|
||||
<stop offset="1.612903e-002" style="stop-color:#B35BA3"/>
|
||||
<stop offset="0.6613" style="stop-color:#C41E57"/>
|
||||
</linearGradient>
|
||||
<polygon style="fill:url(#SVGID_3_);" points="49,0 11.6,0 0,47.1 55.6,47.1 "/>
|
||||
<linearGradient id="SVGID_4_" gradientUnits="userSpaceOnUse" x1="49.8935" y1="-11.5569" x2="48.8588" y2="24.0352">
|
||||
<stop offset="0.5" style="stop-color:#C41E57"/>
|
||||
<stop offset="0.6668" style="stop-color:#D13F48"/>
|
||||
<stop offset="0.7952" style="stop-color:#D94F39"/>
|
||||
<stop offset="0.8656" style="stop-color:#DD5433"/>
|
||||
</linearGradient>
|
||||
<polygon style="fill:url(#SVGID_4_);" points="55.3,47.1 51.1,15.7 49,0 41.7,23 "/>
|
||||
</g>
|
||||
<g>
|
||||
|
||||
<rect x="13.4" y="13.5" transform="matrix(-1 2.577289e-003 -2.577289e-003 -1 70.0288 70.081)" style="fill:#000000;" width="43.2" height="43.2"/>
|
||||
|
||||
<rect x="17.6" y="48.6" transform="matrix(1 -2.577289e-003 2.577289e-003 1 -0.1287 6.634109e-002)" style="fill:#FFFFFF;" width="16.2" height="2.7"/>
|
||||
<path style="fill:#FFFFFF;" d="M17.4,19.1l8.2,0c2.3,0,4,0.6,5.2,1.8c1,1,1.5,2.4,1.5,4.1l0,0.1c0,1.5-0.3,2.6-1.1,3.5
|
||||
c-0.7,0.9-1.6,1.6-2.8,2l4.4,6.4l-4.6,0l-3.7-5.5l-3.3,0l0,5.5l-3.9,0L17.4,19.1z M25.3,27.8c1,0,1.7-0.2,2.2-0.7
|
||||
c0.5-0.5,0.8-1.1,0.8-1.8l0-0.1c0-0.9-0.3-1.5-0.8-1.9c-0.5-0.4-1.3-0.6-2.3-0.6l-3.9,0l0,5.1L25.3,27.8z"/>
|
||||
<path style="fill:#FFFFFF;" d="M36,33.2l-1.9,0l0-3.3l2.5,0l0.6-3.8l-2.3,0l0-3.3l2.8,0l0.6-3.7l3.4,0l-0.6,3.7l3.7,0l0.6-3.7
|
||||
l3.4,0l-0.6,3.7l1.9,0l0,3.3l-2.5,0L47,29.9l2.3,0l0,3.3l-2.8,0L45.8,37l-3.4,0l0.7-3.8l-3.7,0L38.7,37l-3.4,0L36,33.2z
|
||||
M43.7,29.9l0.6-3.8l-3.7,0L40,29.9L43.7,29.9z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.1 KiB |
@@ -1,42 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="70px" height="70px" viewBox="0 0 70 70" style="enable-background:new 0 0 70 70;" xml:space="preserve">
|
||||
<defs>
|
||||
<linearGradient id="linear-gradient" x1="70.22612" y1="27.79912" x2="-5.13024" y2="63.12242" gradientTransform="matrix(1, 0, 0, -1, 0, 71.27997)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#c90f5e"/>
|
||||
<stop offset="0.22111" stop-color="#c90f5e"/>
|
||||
<stop offset="0.2356" stop-color="#c90f5e"/>
|
||||
<stop offset="0.35559" stop-color="#ca135c"/>
|
||||
<stop offset="0.46633" stop-color="#ce1e57"/>
|
||||
<stop offset="0.5735" stop-color="#d4314e"/>
|
||||
<stop offset="0.67844" stop-color="#dc4b41"/>
|
||||
<stop offset="0.78179" stop-color="#e66d31"/>
|
||||
<stop offset="0.88253" stop-color="#f3961d"/>
|
||||
<stop offset="0.94241" stop-color="#fcb20f"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-2" x1="24.65904" y1="61.99608" x2="46.04762" y2="2.93445" gradientTransform="matrix(1, 0, 0, -1, 0, 71.27997)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.04188" stop-color="#077cfb"/>
|
||||
<stop offset="0.44503" stop-color="#c90f5e"/>
|
||||
<stop offset="0.95812" stop-color="#077cfb"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="linear-gradient-3" x1="17.39552" y1="63.34592" x2="33.19389" y2="7.20092" gradientTransform="matrix(1, 0, 0, -1, 0, 71.27997)" gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0.27749" stop-color="#c90f5e"/>
|
||||
<stop offset="0.97382" stop-color="#fcb20f"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<title>rider</title>
|
||||
<g>
|
||||
<polygon points="70 27.237 63.391 23.75 20.926 0 3.827 17.921 21.619 41.068 60.537 44.397 70 27.237" fill="url(#linear-gradient)"/>
|
||||
<polygon points="50.423 16.132 44.271 1.107 27.643 17.471 11.768 50.194 49.411 70 70 57.98 50.423 16.132" fill="url(#linear-gradient-2)"/>
|
||||
<polygon points="20.926 0 0 14.095 7.779 62.172 27.848 69.889 53.78 48.823 20.926 0" fill="url(#linear-gradient-3)"/>
|
||||
</g>
|
||||
<g>
|
||||
<rect x="13.30219" y="13.19311" width="43.61371" height="43.61371"/>
|
||||
<g>
|
||||
<path d="M17.22741,18.86293h8.39564a7.38416,7.38416,0,0,1,5.34268,1.85358,5.86989,5.86989,0,0,1,1.52648,4.1433h0A5.74339,5.74339,0,0,1,28.567,30.5296l4.47041,6.54206H28.34891L24.42368,31.1838h-3.162v5.88785H17.22741V18.86293h0ZM25.296,27.69471c1.96262,0,3.053-1.09034,3.053-2.61682h0c0-1.74455-1.19938-2.61682-3.162-2.61682H21.15265v5.23365H25.296Z" fill="#fff"/>
|
||||
<path d="M36.09034,18.86293H43.2866c5.77882,0,9.70405,3.92523,9.70405,9.15888h0c0,5.12461-3.92523,9.15888-9.70405,9.15888H36.09034V18.86293Zm4.03427,3.59813V33.47352h3.162a5.23727,5.23727,0,0,0,5.56075-5.45171h0a5.26493,5.26493,0,0,0-5.56075-5.56075h-3.162Z" fill="#fff"/>
|
||||
</g>
|
||||
<rect x="17.22741" y="48.62925" width="16.35514" height="2.72586" fill="#fff"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.0 KiB |
@@ -1,36 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="70px" height="70px" viewBox="0 0 70 70" style="enable-background:new 0 0 70 70;" xml:space="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="25.0676" y1="1.4599" x2="43.1829" y2="66.675">
|
||||
<stop offset="0.2849" style="stop-color:#00CDD7"/>
|
||||
<stop offset="0.9409" style="stop-color:#2086D7"/>
|
||||
</linearGradient>
|
||||
<polygon style="fill:url(#SVGID_1_);" points="9.4,63.3 0,7.3 17.5,0.1 28.6,6.7 38.8,1.2 60.1,9.4 48.1,70 "/>
|
||||
<linearGradient id="SVGID_2_" gradientUnits="userSpaceOnUse" x1="30.7199" y1="9.7343" x2="61.365" y2="54.6713">
|
||||
<stop offset="0.1398" style="stop-color:#FFF045"/>
|
||||
<stop offset="0.3656" style="stop-color:#00CDD7"/>
|
||||
</linearGradient>
|
||||
<polygon style="fill:url(#SVGID_2_);" points="70,23.7 61,1.4 44.6,0 19.3,24.3 26.1,55.6 38.8,64.6 70,46 62.3,31.7 "/>
|
||||
<linearGradient id="SVGID_3_" gradientUnits="userSpaceOnUse" x1="61.0819" y1="15.2899" x2="65.1065" y2="29.5436">
|
||||
<stop offset="0.2849" style="stop-color:#00CDD7"/>
|
||||
<stop offset="0.9409" style="stop-color:#2086D7"/>
|
||||
</linearGradient>
|
||||
<polygon style="fill:url(#SVGID_3_);" points="56,20.4 62.3,31.7 70,23.7 64.4,9.8 "/>
|
||||
</g>
|
||||
<g>
|
||||
<g>
|
||||
<rect x="13.4" y="13.4" style="fill:#000000;" width="43.2" height="43.2"/>
|
||||
<rect x="17.5" y="48.5" style="fill:#FFFFFF;" width="16.2" height="2.7"/>
|
||||
<path style="fill:#FFFFFF;" d="M38.7,34.3l2.3-2.8c1.6,1.3,3.3,2.2,5.3,2.2c1.6,0,2.5-0.6,2.5-1.7v-0.1c0-1-0.6-1.5-3.6-2.3
|
||||
c-3.6-0.9-5.8-1.9-5.8-5.5v-0.1c0-3.3,2.6-5.4,6.2-5.4c2.6,0,4.8,0.8,6.6,2.3l-2,3c-1.6-1.1-3.1-1.8-4.6-1.8
|
||||
c-1.5,0-2.3,0.7-2.3,1.6v0.1c0,1.2,0.8,1.6,3.8,2.4c3.6,1,5.6,2.3,5.6,5.4v0.1c0,3.6-2.7,5.6-6.5,5.6
|
||||
C43.5,37.2,40.8,36.2,38.7,34.3"/>
|
||||
</g>
|
||||
<polygon style="fill:#FFFFFF;" points="35.2,19 32.5,29.4 29.5,19 26.5,19 23.4,29.4 20.7,19 16.6,19 21.7,36.9 25,36.9 28,26.5
|
||||
30.9,36.9 34.3,36.9 39.4,19 "/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
12
README.md
12
README.md
@@ -68,16 +68,16 @@ Support this project by becoming a sponsor. Your logo will show up here with a l
|
||||
|
||||
## JetBrains
|
||||
|
||||
Thank you to [<img src="/Logo/jetbrains.svg" alt="JetBrains" width="32"> JetBrains](http://www.jetbrains.com/) for providing us with free licenses to their great tools.
|
||||
Thank you to [<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/jetbrains.png" alt="JetBrains" width="96">](http://www.jetbrains.com/) for providing us with free licenses to their great tools.
|
||||
|
||||
- [<img src="/Logo/resharper.svg" alt="ReSharper" width="32"> ReSharper](http://www.jetbrains.com/resharper/)
|
||||
- [<img src="/Logo/webstorm.svg" alt="WebStorm" width="32"> WebStorm](http://www.jetbrains.com/webstorm/)
|
||||
- [<img src="/Logo/rider.svg" alt="Rider" width="32"> Rider](http://www.jetbrains.com/rider/)
|
||||
- [<img src="/Logo/dottrace.svg" alt="dotTrace" width="32"> dotTrace](http://www.jetbrains.com/dottrace/)
|
||||
* [<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/ReSharper_icon.png" alt="ReSharper" width="32"> ReSharper](http://www.jetbrains.com/resharper/)
|
||||
* [<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/WebStorm_icon.png" alt="WebStorm" width="32"> WebStorm](http://www.jetbrains.com/webstorm/)
|
||||
* [<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/Rider_icon.png" alt="Rider" width="32"> Rider](http://www.jetbrains.com/rider/)
|
||||
* [<img src="https://resources.jetbrains.com/storage/products/company/brand/logos/dotTrace_icon.png" alt="dotTrace" width="32"> dotTrace](http://www.jetbrains.com/dottrace/)
|
||||
|
||||
### License
|
||||
|
||||
- [GNU GPL v3](http://www.gnu.org/licenses/gpl.html)
|
||||
- Copyright 2010-2022
|
||||
- Copyright 2010-2024
|
||||
|
||||
Icon Credit - [Box vector created by freepik - www.freepik.com](https://www.freepik.com/vectors/box)
|
||||
|
||||
@@ -9,7 +9,7 @@ variables:
|
||||
testsFolder: './_tests'
|
||||
yarnCacheFolder: $(Pipeline.Workspace)/.yarn
|
||||
nugetCacheFolder: $(Pipeline.Workspace)/.nuget/packages
|
||||
majorVersion: '1.25.3'
|
||||
majorVersion: '1.28.0'
|
||||
minorVersion: $[counter('minorVersion', 1)]
|
||||
prowlarrVersion: '$(majorVersion).$(minorVersion)'
|
||||
buildName: '$(Build.SourceBranchName).$(prowlarrVersion)'
|
||||
@@ -1190,7 +1190,7 @@ stages:
|
||||
- task: SonarCloudAnalyze@2
|
||||
condition: eq(variables['System.PullRequest.IsFork'], 'False')
|
||||
displayName: Publish SonarCloud Results
|
||||
- task: reportgenerator@5
|
||||
- task: reportgenerator@5.3.11
|
||||
displayName: Generate Coverage Report
|
||||
inputs:
|
||||
reports: '$(Build.SourcesDirectory)/CoverageResults/**/coverage.opencover.xml'
|
||||
|
||||
@@ -25,6 +25,7 @@ module.exports = (env) => {
|
||||
const config = {
|
||||
mode: isProduction ? 'production' : 'development',
|
||||
devtool: isProduction ? 'source-map' : 'eval-source-map',
|
||||
target: 'web',
|
||||
|
||||
stats: {
|
||||
children: false
|
||||
|
||||
@@ -257,6 +257,7 @@ class HistoryRow extends Component {
|
||||
key={parameter.key}
|
||||
title={parameter.title}
|
||||
value={data[parameter.key]}
|
||||
queryType={data.queryType}
|
||||
/>
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,14 +1,16 @@
|
||||
import React from 'react';
|
||||
import Link from 'Components/Link/Link';
|
||||
import { HistoryQueryType } from 'typings/History';
|
||||
import styles from './HistoryRowParameter.css';
|
||||
|
||||
interface HistoryRowParameterProps {
|
||||
title: string;
|
||||
value: string;
|
||||
queryType: HistoryQueryType;
|
||||
}
|
||||
|
||||
function HistoryRowParameter(props: HistoryRowParameterProps) {
|
||||
const { title, value } = props;
|
||||
const { title, value, queryType } = props;
|
||||
|
||||
const type = title.toLowerCase();
|
||||
|
||||
@@ -18,7 +20,13 @@ function HistoryRowParameter(props: HistoryRowParameterProps) {
|
||||
link = <Link to={`https://imdb.com/title/${value}/`}>{value}</Link>;
|
||||
} else if (type === 'tmdb') {
|
||||
link = (
|
||||
<Link to={`https://www.themoviedb.org/movie/${value}`}>{value}</Link>
|
||||
<Link
|
||||
to={`https://www.themoviedb.org/${
|
||||
queryType === 'tvsearch' ? 'tv' : 'movie'
|
||||
}/${value}`}
|
||||
>
|
||||
{value}
|
||||
</Link>
|
||||
);
|
||||
} else if (type === 'tvdb') {
|
||||
link = (
|
||||
|
||||
@@ -68,6 +68,7 @@ function IndexerHistoryRow(props: IndexerHistoryRowProps) {
|
||||
key={parameter.key}
|
||||
title={parameter.title}
|
||||
value={data[parameter.key as keyof HistoryData].toString()}
|
||||
queryType={data.queryType}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
|
||||
@@ -270,7 +270,7 @@ function Updates() {
|
||||
|
||||
{generalSettingsError ? (
|
||||
<Alert kind={kinds.DANGER}>
|
||||
{translate('FailedToUpdateSettings')}
|
||||
{translate('FailedToFetchSettings')}
|
||||
</Alert>
|
||||
) : null}
|
||||
|
||||
|
||||
@@ -1,5 +1,12 @@
|
||||
import ModelBase from 'App/ModelBase';
|
||||
|
||||
export type HistoryQueryType =
|
||||
| 'search'
|
||||
| 'tvsearch'
|
||||
| 'movie'
|
||||
| 'book'
|
||||
| 'music';
|
||||
|
||||
export interface HistoryData {
|
||||
source: string;
|
||||
host: string;
|
||||
@@ -7,7 +14,7 @@ export interface HistoryData {
|
||||
offset: number;
|
||||
elapsedTime: number;
|
||||
query: string;
|
||||
queryType: string;
|
||||
queryType: HistoryQueryType;
|
||||
}
|
||||
|
||||
interface History extends ModelBase {
|
||||
|
||||
@@ -21,9 +21,28 @@ namespace NzbDrone.Common.Test.ExtensionTests
|
||||
[TestCase("1.2.3.4")]
|
||||
[TestCase("172.55.0.1")]
|
||||
[TestCase("192.55.0.1")]
|
||||
[TestCase("100.64.0.1")]
|
||||
[TestCase("100.127.255.254")]
|
||||
public void should_return_false_for_public_ip_address(string ipAddress)
|
||||
{
|
||||
IPAddress.Parse(ipAddress).IsLocalAddress().Should().BeFalse();
|
||||
}
|
||||
|
||||
[TestCase("100.64.0.1")]
|
||||
[TestCase("100.127.255.254")]
|
||||
[TestCase("100.100.100.100")]
|
||||
public void should_return_true_for_cgnat_ip_address(string ipAddress)
|
||||
{
|
||||
IPAddress.Parse(ipAddress).IsCgnatIpAddress().Should().BeTrue();
|
||||
}
|
||||
|
||||
[TestCase("1.2.3.4")]
|
||||
[TestCase("192.168.5.1")]
|
||||
[TestCase("100.63.255.255")]
|
||||
[TestCase("100.128.0.0")]
|
||||
public void should_return_false_for_non_cgnat_ip_address(string ipAddress)
|
||||
{
|
||||
IPAddress.Parse(ipAddress).IsCgnatIpAddress().Should().BeFalse();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -133,11 +133,16 @@ namespace NzbDrone.Common.Test
|
||||
|
||||
[TestCase(@"C:\test\", @"C:\Test\mydir")]
|
||||
[TestCase(@"C:\test", @"C:\Test\mydir\")]
|
||||
public void path_should_be_parent_on_windows_only(string parentPath, string childPath)
|
||||
public void windows_path_should_be_parent(string parentPath, string childPath)
|
||||
{
|
||||
var expectedResult = OsInfo.IsWindows;
|
||||
parentPath.IsParentPath(childPath).Should().Be(true);
|
||||
}
|
||||
|
||||
parentPath.IsParentPath(childPath).Should().Be(expectedResult);
|
||||
[TestCase("/test", "/test/mydir/")]
|
||||
[TestCase("/test/", "/test/mydir")]
|
||||
public void posix_path_should_be_parent(string parentPath, string childPath)
|
||||
{
|
||||
parentPath.IsParentPath(childPath).Should().Be(true);
|
||||
}
|
||||
|
||||
[TestCase(@"C:\Test\mydir", @"C:\Test")]
|
||||
@@ -145,20 +150,57 @@ namespace NzbDrone.Common.Test
|
||||
[TestCase(@"C:\", null)]
|
||||
[TestCase(@"\\server\share", null)]
|
||||
[TestCase(@"\\server\share\test", @"\\server\share")]
|
||||
public void path_should_return_parent_windows(string path, string parentPath)
|
||||
public void windows_path_should_return_parent(string path, string parentPath)
|
||||
{
|
||||
WindowsOnly();
|
||||
path.GetParentPath().Should().Be(parentPath);
|
||||
}
|
||||
|
||||
[TestCase(@"/", null)]
|
||||
[TestCase(@"/test", "/")]
|
||||
public void path_should_return_parent_mono(string path, string parentPath)
|
||||
[TestCase(@"/test/tv", "/test")]
|
||||
public void unix_path_should_return_parent(string path, string parentPath)
|
||||
{
|
||||
PosixOnly();
|
||||
path.GetParentPath().Should().Be(parentPath);
|
||||
}
|
||||
|
||||
[TestCase(@"C:\Test\mydir", "Test")]
|
||||
[TestCase(@"C:\Test\", @"C:\")]
|
||||
[TestCase(@"C:\Test", @"C:\")]
|
||||
[TestCase(@"C:\", null)]
|
||||
[TestCase(@"\\server\share", null)]
|
||||
[TestCase(@"\\server\share\test", @"\\server\share")]
|
||||
public void path_should_return_parent_name_windows(string path, string parentPath)
|
||||
{
|
||||
path.GetParentName().Should().Be(parentPath);
|
||||
}
|
||||
|
||||
[TestCase(@"/", null)]
|
||||
[TestCase(@"/test", "/")]
|
||||
[TestCase(@"/test/tv", "test")]
|
||||
public void path_should_return_parent_name_mono(string path, string parentPath)
|
||||
{
|
||||
path.GetParentName().Should().Be(parentPath);
|
||||
}
|
||||
|
||||
[TestCase(@"C:\Test\mydir", "mydir")]
|
||||
[TestCase(@"C:\Test\", "Test")]
|
||||
[TestCase(@"C:\Test", "Test")]
|
||||
[TestCase(@"C:\", "C:\\")]
|
||||
[TestCase(@"\\server\share", @"\\server\share")]
|
||||
[TestCase(@"\\server\share\test", "test")]
|
||||
public void path_should_return_directory_name_windows(string path, string parentPath)
|
||||
{
|
||||
path.GetDirectoryName().Should().Be(parentPath);
|
||||
}
|
||||
|
||||
[TestCase(@"/", "/")]
|
||||
[TestCase(@"/test", "test")]
|
||||
[TestCase(@"/test/tv", "tv")]
|
||||
public void path_should_return_directory_name_mono(string path, string parentPath)
|
||||
{
|
||||
path.GetDirectoryName().Should().Be(parentPath);
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void path_should_return_parent_for_oversized_path()
|
||||
{
|
||||
@@ -166,7 +208,7 @@ namespace NzbDrone.Common.Test
|
||||
|
||||
// This test will fail on Windows if long path support is not enabled: https://www.howtogeek.com/266621/how-to-make-windows-10-accept-file-paths-over-260-characters/
|
||||
// It will also fail if the app isn't configured to use long path (such as resharper): https://blogs.msdn.microsoft.com/jeremykuhne/2016/07/30/net-4-6-2-and-long-paths-on-windows-10/
|
||||
var path = @"C:\media\2e168617-f2ae-43fb-b88c-3663af1c8eea\downloads\sabnzbd\nzbdrone\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories".AsOsAgnostic();
|
||||
var path = @"C:\media\2e168617-f2ae-43fb-b88c-3663af1c8eea\downloads\sabnzbd\nzbdrone\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories".AsOsAgnostic();
|
||||
var parentPath = @"C:\media\2e168617-f2ae-43fb-b88c-3663af1c8eea\downloads\sabnzbd\nzbdrone\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing\With.Alot.Of.Nested.Directories\Some.Real.Big.Thing".AsOsAgnostic();
|
||||
|
||||
path.GetParentPath().Should().Be(parentPath);
|
||||
@@ -350,5 +392,46 @@ namespace NzbDrone.Common.Test
|
||||
PosixOnly();
|
||||
path.AsOsAgnostic().IsPathValid(PathValidationType.CurrentOs).Should().BeFalse();
|
||||
}
|
||||
|
||||
[TestCase(@"C:\", @"C:\")]
|
||||
[TestCase(@"C:\\", @"C:\")]
|
||||
[TestCase(@"C:\Test", @"C:\Test")]
|
||||
[TestCase(@"C:\Test\", @"C:\Test")]
|
||||
[TestCase(@"\\server\share", @"\\server\share")]
|
||||
[TestCase(@"\\server\share\", @"\\server\share")]
|
||||
public void windows_path_should_return_clean_path(string path, string cleanPath)
|
||||
{
|
||||
path.GetCleanPath().Should().Be(cleanPath);
|
||||
}
|
||||
|
||||
[TestCase("/", "/")]
|
||||
[TestCase("//", "/")]
|
||||
[TestCase("/test", "/test")]
|
||||
[TestCase("/test/", "/test")]
|
||||
[TestCase("/test//", "/test")]
|
||||
public void unix_path_should_return_clean_path(string path, string cleanPath)
|
||||
{
|
||||
path.GetCleanPath().Should().Be(cleanPath);
|
||||
}
|
||||
|
||||
[TestCase(@"C:\Test\", @"C:\Test\Series Title", "Series Title")]
|
||||
[TestCase(@"C:\Test\", @"C:\Test\Collection\Series Title", @"Collection\Series Title")]
|
||||
[TestCase(@"C:\Test\mydir\", @"C:\Test\mydir\Collection\Series Title", @"Collection\Series Title")]
|
||||
[TestCase(@"\\server\share", @"\\server\share\Series Title", "Series Title")]
|
||||
[TestCase(@"\\server\share\mydir\", @"\\server\share\mydir\/Collection\Series Title", @"Collection\Series Title")]
|
||||
public void windows_path_should_return_relative_path(string parentPath, string childPath, string relativePath)
|
||||
{
|
||||
parentPath.GetRelativePath(childPath).Should().Be(relativePath);
|
||||
}
|
||||
|
||||
[TestCase(@"/test", "/test/Series Title", "Series Title")]
|
||||
[TestCase(@"/test/", "/test/Collection/Series Title", "Collection/Series Title")]
|
||||
[TestCase(@"/test/mydir", "/test/mydir/Series Title", "Series Title")]
|
||||
[TestCase(@"/test/mydir/", "/test/mydir/Collection/Series Title", "Collection/Series Title")]
|
||||
[TestCase(@"/test/mydir/", @"/test/mydir/\Collection/Series Title", "Collection/Series Title")]
|
||||
public void unix_path_should_return_relative_path(string parentPath, string childPath, string relativePath)
|
||||
{
|
||||
parentPath.GetRelativePath(childPath).Should().Be(relativePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -189,6 +189,25 @@ namespace NzbDrone.Common.Disk
|
||||
}
|
||||
|
||||
var fi = new FileInfo(path);
|
||||
|
||||
try
|
||||
{
|
||||
// If the file is a symlink, resolve the target path and get the size of the target file.
|
||||
if (fi.Attributes.HasFlag(FileAttributes.ReparsePoint))
|
||||
{
|
||||
var targetPath = fi.ResolveLinkTarget(true)?.FullName;
|
||||
|
||||
if (targetPath != null)
|
||||
{
|
||||
fi = new FileInfo(targetPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (IOException ex)
|
||||
{
|
||||
Logger.Trace(ex, "Unable to resolve symlink target for {0}", path);
|
||||
}
|
||||
|
||||
return fi.Length;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
using NzbDrone.Common.Extensions;
|
||||
|
||||
namespace NzbDrone.Common.Disk
|
||||
@@ -9,6 +10,8 @@ namespace NzbDrone.Common.Disk
|
||||
private readonly string _path;
|
||||
private readonly OsPathKind _kind;
|
||||
|
||||
private static readonly Regex UncPathRegex = new Regex(@"(?<unc>^\\\\(?:\?\\UNC\\)?[^\\]+\\[^\\]+)(?:\\|$)", RegexOptions.Compiled | RegexOptions.IgnoreCase);
|
||||
|
||||
public OsPath(string path)
|
||||
{
|
||||
if (path == null)
|
||||
@@ -96,6 +99,29 @@ namespace NzbDrone.Common.Disk
|
||||
return path;
|
||||
}
|
||||
|
||||
private static string TrimTrailingSlash(string path, OsPathKind kind)
|
||||
{
|
||||
switch (kind)
|
||||
{
|
||||
case OsPathKind.Windows when !path.EndsWith(":\\"):
|
||||
while (!path.EndsWith(":\\") && path.EndsWith('\\'))
|
||||
{
|
||||
path = path[..^1];
|
||||
}
|
||||
|
||||
return path;
|
||||
case OsPathKind.Unix when path != "/":
|
||||
while (path != "/" && path.EndsWith('/'))
|
||||
{
|
||||
path = path[..^1];
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
public OsPathKind Kind => _kind;
|
||||
|
||||
public bool IsWindowsPath => _kind == OsPathKind.Windows;
|
||||
@@ -130,7 +156,19 @@ namespace NzbDrone.Common.Disk
|
||||
|
||||
if (index == -1)
|
||||
{
|
||||
return new OsPath(null);
|
||||
return Null;
|
||||
}
|
||||
|
||||
var rootLength = GetRootLength();
|
||||
|
||||
if (rootLength == _path.Length)
|
||||
{
|
||||
return Null;
|
||||
}
|
||||
|
||||
if (rootLength > index + 1)
|
||||
{
|
||||
return new OsPath(_path.Substring(0, rootLength));
|
||||
}
|
||||
|
||||
return new OsPath(_path.Substring(0, index), _kind).AsDirectory();
|
||||
@@ -139,6 +177,8 @@ namespace NzbDrone.Common.Disk
|
||||
|
||||
public string FullPath => _path;
|
||||
|
||||
public string PathWithoutTrailingSlash => TrimTrailingSlash(_path, _kind);
|
||||
|
||||
public string FileName
|
||||
{
|
||||
get
|
||||
@@ -161,6 +201,29 @@ namespace NzbDrone.Common.Disk
|
||||
}
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
// Meant to behave similar to DirectoryInfo.Name
|
||||
get
|
||||
{
|
||||
var index = GetFileNameIndex();
|
||||
|
||||
if (index == -1)
|
||||
{
|
||||
return PathWithoutTrailingSlash;
|
||||
}
|
||||
|
||||
var rootLength = GetRootLength();
|
||||
|
||||
if (rootLength > index + 1)
|
||||
{
|
||||
return _path.Substring(0, rootLength);
|
||||
}
|
||||
|
||||
return TrimTrailingSlash(_path.Substring(index).TrimStart('/', '\\'), _kind);
|
||||
}
|
||||
}
|
||||
|
||||
public bool IsValid => _path.IsPathValid(PathValidationType.CurrentOs);
|
||||
|
||||
private int GetFileNameIndex()
|
||||
@@ -190,11 +253,50 @@ namespace NzbDrone.Common.Disk
|
||||
return index;
|
||||
}
|
||||
|
||||
private int GetRootLength()
|
||||
{
|
||||
if (!IsRooted)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (_kind == OsPathKind.Unix)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (_kind == OsPathKind.Windows)
|
||||
{
|
||||
if (HasWindowsDriveLetter(_path))
|
||||
{
|
||||
return 3;
|
||||
}
|
||||
|
||||
var uncMatch = UncPathRegex.Match(_path);
|
||||
|
||||
// \\?\UNC\server\share\ or \\server\share
|
||||
if (uncMatch.Success)
|
||||
{
|
||||
return uncMatch.Groups["unc"].Length;
|
||||
}
|
||||
|
||||
// \\?\C:\
|
||||
if (_path.StartsWith(@"\\?\"))
|
||||
{
|
||||
return 7;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private string[] GetFragments()
|
||||
{
|
||||
return _path.Split(new char[] { '\\', '/' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
|
||||
public static OsPath Null => new (null);
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return _path;
|
||||
@@ -267,6 +369,11 @@ namespace NzbDrone.Common.Disk
|
||||
}
|
||||
|
||||
public bool Equals(OsPath other)
|
||||
{
|
||||
return Equals(other, false);
|
||||
}
|
||||
|
||||
public bool Equals(OsPath other, bool ignoreTrailingSlash)
|
||||
{
|
||||
if (ReferenceEquals(other, null))
|
||||
{
|
||||
@@ -278,8 +385,8 @@ namespace NzbDrone.Common.Disk
|
||||
return true;
|
||||
}
|
||||
|
||||
var left = _path;
|
||||
var right = other._path;
|
||||
var left = ignoreTrailingSlash ? PathWithoutTrailingSlash : _path;
|
||||
var right = ignoreTrailingSlash ? other.PathWithoutTrailingSlash : other._path;
|
||||
|
||||
if (Kind == OsPathKind.Windows || other.Kind == OsPathKind.Windows)
|
||||
{
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using NLog;
|
||||
@@ -25,22 +24,25 @@ namespace NzbDrone.Common.EnvironmentInfo
|
||||
|
||||
static OsInfo()
|
||||
{
|
||||
var platform = Environment.OSVersion.Platform;
|
||||
|
||||
switch (platform)
|
||||
if (OperatingSystem.IsWindows())
|
||||
{
|
||||
case PlatformID.Win32NT:
|
||||
{
|
||||
Os = Os.Windows;
|
||||
break;
|
||||
}
|
||||
|
||||
case PlatformID.MacOSX:
|
||||
case PlatformID.Unix:
|
||||
{
|
||||
Os = GetPosixFlavour();
|
||||
break;
|
||||
}
|
||||
Os = Os.Windows;
|
||||
}
|
||||
else if (OperatingSystem.IsMacOS())
|
||||
{
|
||||
Os = Os.Osx;
|
||||
}
|
||||
else if (OperatingSystem.IsFreeBSD())
|
||||
{
|
||||
Os = Os.Bsd;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if ISMUSL
|
||||
Os = Os.LinuxMusl;
|
||||
#else
|
||||
Os = Os.Linux;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -84,59 +86,6 @@ namespace NzbDrone.Common.EnvironmentInfo
|
||||
IsDocker = true;
|
||||
}
|
||||
}
|
||||
|
||||
private static Os GetPosixFlavour()
|
||||
{
|
||||
var output = RunAndCapture("uname", "-s");
|
||||
|
||||
if (output.StartsWith("Darwin"))
|
||||
{
|
||||
return Os.Osx;
|
||||
}
|
||||
else if (output.Contains("BSD"))
|
||||
{
|
||||
return Os.Bsd;
|
||||
}
|
||||
else
|
||||
{
|
||||
#if ISMUSL
|
||||
return Os.LinuxMusl;
|
||||
#else
|
||||
return Os.Linux;
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
private static string RunAndCapture(string filename, string args)
|
||||
{
|
||||
var processStartInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = filename,
|
||||
Arguments = args,
|
||||
UseShellExecute = false,
|
||||
CreateNoWindow = true,
|
||||
RedirectStandardOutput = true
|
||||
};
|
||||
|
||||
var output = string.Empty;
|
||||
|
||||
try
|
||||
{
|
||||
using (var p = Process.Start(processStartInfo))
|
||||
{
|
||||
// To avoid deadlocks, always read the output stream first and then wait.
|
||||
output = p.StandardOutput.ReadToEnd();
|
||||
|
||||
p.WaitForExit(1000);
|
||||
}
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
output = string.Empty;
|
||||
}
|
||||
|
||||
return output;
|
||||
}
|
||||
}
|
||||
|
||||
public interface IOsInfo
|
||||
|
||||
@@ -39,18 +39,24 @@ namespace NzbDrone.Common.Extensions
|
||||
private static bool IsLocalIPv4(byte[] ipv4Bytes)
|
||||
{
|
||||
// Link local (no IP assigned by DHCP): 169.254.0.0 to 169.254.255.255 (169.254.0.0/16)
|
||||
bool IsLinkLocal() => ipv4Bytes[0] == 169 && ipv4Bytes[1] == 254;
|
||||
var isLinkLocal = ipv4Bytes[0] == 169 && ipv4Bytes[1] == 254;
|
||||
|
||||
// Class A private range: 10.0.0.0 – 10.255.255.255 (10.0.0.0/8)
|
||||
bool IsClassA() => ipv4Bytes[0] == 10;
|
||||
var isClassA = ipv4Bytes[0] == 10;
|
||||
|
||||
// Class B private range: 172.16.0.0 – 172.31.255.255 (172.16.0.0/12)
|
||||
bool IsClassB() => ipv4Bytes[0] == 172 && ipv4Bytes[1] >= 16 && ipv4Bytes[1] <= 31;
|
||||
var isClassB = ipv4Bytes[0] == 172 && ipv4Bytes[1] >= 16 && ipv4Bytes[1] <= 31;
|
||||
|
||||
// Class C private range: 192.168.0.0 – 192.168.255.255 (192.168.0.0/16)
|
||||
bool IsClassC() => ipv4Bytes[0] == 192 && ipv4Bytes[1] == 168;
|
||||
var isClassC = ipv4Bytes[0] == 192 && ipv4Bytes[1] == 168;
|
||||
|
||||
return IsLinkLocal() || IsClassA() || IsClassC() || IsClassB();
|
||||
return isLinkLocal || isClassA || isClassC || isClassB;
|
||||
}
|
||||
|
||||
public static bool IsCgnatIpAddress(this IPAddress ipAddress)
|
||||
{
|
||||
var bytes = ipAddress.GetAddressBytes();
|
||||
return bytes.Length == 4 && bytes[0] == 100 && bytes[1] >= 64 && bytes[1] <= 127;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,8 +25,6 @@ namespace NzbDrone.Common.Extensions
|
||||
private static readonly string UPDATE_CLIENT_FOLDER_NAME = "Prowlarr.Update" + Path.DirectorySeparatorChar;
|
||||
private static readonly string UPDATE_LOG_FOLDER_NAME = "UpdateLogs" + Path.DirectorySeparatorChar;
|
||||
|
||||
private static readonly Regex PARENT_PATH_END_SLASH_REGEX = new Regex(@"(?<!:)\\$", RegexOptions.Compiled);
|
||||
|
||||
public static string CleanFilePath(this string path)
|
||||
{
|
||||
if (path.IsNotNullOrWhiteSpace())
|
||||
@@ -87,55 +85,50 @@ namespace NzbDrone.Common.Extensions
|
||||
throw new NotParentException("{0} is not a child of {1}", childPath, parentPath);
|
||||
}
|
||||
|
||||
return childPath.Substring(parentPath.Length).Trim(Path.DirectorySeparatorChar);
|
||||
return childPath.Substring(parentPath.Length).Trim('\\', '/');
|
||||
}
|
||||
|
||||
public static string GetParentPath(this string childPath)
|
||||
{
|
||||
var cleanPath = OsInfo.IsWindows
|
||||
? PARENT_PATH_END_SLASH_REGEX.Replace(childPath, "")
|
||||
: childPath.TrimEnd(Path.DirectorySeparatorChar);
|
||||
var path = new OsPath(childPath).Directory;
|
||||
|
||||
if (cleanPath.IsNullOrWhiteSpace())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return path == OsPath.Null ? null : path.PathWithoutTrailingSlash;
|
||||
}
|
||||
|
||||
return Directory.GetParent(cleanPath)?.FullName;
|
||||
public static string GetParentName(this string childPath)
|
||||
{
|
||||
var path = new OsPath(childPath).Directory;
|
||||
|
||||
return path == OsPath.Null ? null : path.Name;
|
||||
}
|
||||
|
||||
public static string GetDirectoryName(this string childPath)
|
||||
{
|
||||
var path = new OsPath(childPath);
|
||||
|
||||
return path == OsPath.Null ? null : path.Name;
|
||||
}
|
||||
|
||||
public static string GetCleanPath(this string path)
|
||||
{
|
||||
var cleanPath = OsInfo.IsWindows
|
||||
? PARENT_PATH_END_SLASH_REGEX.Replace(path, "")
|
||||
: path.TrimEnd(Path.DirectorySeparatorChar);
|
||||
var osPath = new OsPath(path);
|
||||
|
||||
return cleanPath;
|
||||
return osPath == OsPath.Null ? null : osPath.PathWithoutTrailingSlash;
|
||||
}
|
||||
|
||||
public static bool IsParentPath(this string parentPath, string childPath)
|
||||
{
|
||||
if (parentPath != "/" && !parentPath.EndsWith(":\\"))
|
||||
{
|
||||
parentPath = parentPath.TrimEnd(Path.DirectorySeparatorChar);
|
||||
}
|
||||
var parent = new OsPath(parentPath);
|
||||
var child = new OsPath(childPath);
|
||||
|
||||
if (childPath != "/" && !parentPath.EndsWith(":\\"))
|
||||
while (child.Directory != OsPath.Null)
|
||||
{
|
||||
childPath = childPath.TrimEnd(Path.DirectorySeparatorChar);
|
||||
}
|
||||
|
||||
var parent = new DirectoryInfo(parentPath);
|
||||
var child = new DirectoryInfo(childPath);
|
||||
|
||||
while (child.Parent != null)
|
||||
{
|
||||
if (child.Parent.FullName.Equals(parent.FullName, DiskProviderBase.PathStringComparison))
|
||||
if (child.Directory.Equals(parent, true))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
child = child.Parent;
|
||||
child = child.Directory;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -150,14 +143,14 @@ namespace NzbDrone.Common.Extensions
|
||||
return false;
|
||||
}
|
||||
|
||||
if (path.Trim() != path)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
// Only check for leading or trailing spaces for path when running on Windows.
|
||||
if (OsInfo.IsWindows)
|
||||
{
|
||||
if (path.Trim() != path)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
var directoryInfo = new DirectoryInfo(path);
|
||||
|
||||
while (directoryInfo != null)
|
||||
|
||||
@@ -6,4 +6,5 @@ public class AuthOptions
|
||||
public bool? Enabled { get; set; }
|
||||
public string Method { get; set; }
|
||||
public string Required { get; set; }
|
||||
public bool? TrustCgnatIpAddresses { get; set; }
|
||||
}
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="DryIoc.dll" Version="5.4.3" />
|
||||
<PackageReference Include="IPAddressRange" Version="6.0.0" />
|
||||
<PackageReference Include="IPAddressRange" Version="6.1.0" />
|
||||
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="6.0.1" />
|
||||
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.2" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="NLog" Version="5.3.3" />
|
||||
<PackageReference Include="NLog.Layouts.ClefJsonLayout" Version="1.0.0" />
|
||||
<PackageReference Include="NLog.Extensions.Logging" Version="5.3.12" />
|
||||
<PackageReference Include="Npgsql" Version="7.0.8" />
|
||||
<PackageReference Include="Npgsql" Version="7.0.9" />
|
||||
<PackageReference Include="Sentry" Version="4.0.2" />
|
||||
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
|
||||
<PackageReference Include="SharpZipLib" Version="1.4.2" />
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
using FluentAssertions;
|
||||
using NUnit.Framework;
|
||||
using NzbDrone.Core.Datastore;
|
||||
|
||||
namespace NzbDrone.Core.Test.Datastore;
|
||||
|
||||
[TestFixture]
|
||||
public class DatabaseVersionParserFixture
|
||||
{
|
||||
[TestCase("3.44.2", 3, 44, 2)]
|
||||
public void should_parse_sqlite_database_version(string serverVersion, int majorVersion, int minorVersion, int buildVersion)
|
||||
{
|
||||
var version = DatabaseVersionParser.ParseServerVersion(serverVersion);
|
||||
|
||||
version.Should().NotBeNull();
|
||||
version.Major.Should().Be(majorVersion);
|
||||
version.Minor.Should().Be(minorVersion);
|
||||
version.Build.Should().Be(buildVersion);
|
||||
}
|
||||
|
||||
[TestCase("14.8 (Debian 14.8-1.pgdg110+1)", 14, 8, null)]
|
||||
[TestCase("16.3 (Debian 16.3-1.pgdg110+1)", 16, 3, null)]
|
||||
[TestCase("16.3 - Percona Distribution", 16, 3, null)]
|
||||
[TestCase("17.0 - Percona Server", 17, 0, null)]
|
||||
public void should_parse_postgres_database_version(string serverVersion, int majorVersion, int minorVersion, int? buildVersion)
|
||||
{
|
||||
var version = DatabaseVersionParser.ParseServerVersion(serverVersion);
|
||||
|
||||
version.Should().NotBeNull();
|
||||
version.Major.Should().Be(majorVersion);
|
||||
version.Minor.Should().Be(minorVersion);
|
||||
|
||||
if (buildVersion.HasValue)
|
||||
{
|
||||
version.Build.Should().Be(buildVersion.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,7 +55,7 @@ namespace NzbDrone.Core.Test.IndexerTests.FileListTests
|
||||
torrentInfo.InfoUrl.Should().Be("https://filelist.io/details.php?id=665873");
|
||||
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
|
||||
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
|
||||
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 19:20:19"));
|
||||
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2020-01-25 20:20:19"));
|
||||
torrentInfo.Size.Should().Be(8300512414);
|
||||
torrentInfo.InfoHash.Should().Be(null);
|
||||
torrentInfo.MagnetUrl.Should().Be(null);
|
||||
|
||||
@@ -46,8 +46,8 @@ namespace NzbDrone.Core.Test.IndexerTests.RedactedTests
|
||||
|
||||
torrentInfo.Title.Should().Be("Red Hot Chili Peppers - Californication (1999) [Album] [US / Reissue 2020] [FLAC 24bit Lossless / Vinyl]");
|
||||
torrentInfo.DownloadProtocol.Should().Be(DownloadProtocol.Torrent);
|
||||
torrentInfo.DownloadUrl.Should().Be("https://redacted.ch/ajax.php?action=download&id=3892313");
|
||||
torrentInfo.InfoUrl.Should().Be("https://redacted.ch/torrents.php?id=16720&torrentid=3892313");
|
||||
torrentInfo.DownloadUrl.Should().Be("https://redacted.sh/ajax.php?action=download&id=3892313");
|
||||
torrentInfo.InfoUrl.Should().Be("https://redacted.sh/torrents.php?id=16720&torrentid=3892313");
|
||||
torrentInfo.CommentUrl.Should().BeNullOrEmpty();
|
||||
torrentInfo.Indexer.Should().Be(Subject.Definition.Name);
|
||||
torrentInfo.PublishDate.Should().Be(DateTime.Parse("2022-12-17 08:02:35"));
|
||||
|
||||
@@ -53,7 +53,7 @@ namespace NzbDrone.Core.Applications
|
||||
|
||||
foreach (var application in applications)
|
||||
{
|
||||
if (blockedApplications.TryGetValue(application.Definition.Id, out var blockedApplicationStatus))
|
||||
if (blockedApplications.TryGetValue(application.Definition.Id, out var blockedApplicationStatus) && blockedApplicationStatus.DisabledTill.HasValue)
|
||||
{
|
||||
_logger.Debug("Temporarily ignoring application {0} till {1} due to recent failures.", application.Definition.Name, blockedApplicationStatus.DisabledTill.Value.ToLocalTime());
|
||||
continue;
|
||||
|
||||
@@ -65,6 +65,7 @@ namespace NzbDrone.Core.Configuration
|
||||
string PostgresPassword { get; }
|
||||
string PostgresMainDb { get; }
|
||||
string PostgresLogDb { get; }
|
||||
bool TrustCgnatIpAddresses { get; }
|
||||
}
|
||||
|
||||
public class ConfigFileProvider : IConfigFileProvider
|
||||
@@ -479,5 +480,7 @@ namespace NzbDrone.Core.Configuration
|
||||
SetValue("ApiKey", GenerateApiKey());
|
||||
_eventAggregator.PublishEvent(new ApiKeyChangedEvent());
|
||||
}
|
||||
|
||||
public bool TrustCgnatIpAddresses => _authOptions.TrustCgnatIpAddresses ?? GetValueBoolean("TrustCgnatIpAddresses", false, persist: false);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -183,6 +183,12 @@ namespace NzbDrone.Core.Configuration
|
||||
|
||||
public string ApplicationUrl => GetValue("ApplicationUrl", string.Empty);
|
||||
|
||||
public bool TrustCgnatIpAddresses
|
||||
{
|
||||
get { return GetValueBoolean("TrustCgnatIpAddresses", false); }
|
||||
set { SetValue("TrustCgnatIpAddresses", value); }
|
||||
}
|
||||
|
||||
private string GetValue(string key)
|
||||
{
|
||||
return GetValue(key, string.Empty);
|
||||
|
||||
@@ -2,7 +2,6 @@ using System;
|
||||
using System.Data;
|
||||
using System.Data.Common;
|
||||
using System.Data.SQLite;
|
||||
using System.Text.RegularExpressions;
|
||||
using Dapper;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Instrumentation;
|
||||
@@ -52,9 +51,8 @@ namespace NzbDrone.Core.Datastore
|
||||
{
|
||||
using var db = _datamapperFactory();
|
||||
var dbConnection = db as DbConnection;
|
||||
var version = Regex.Replace(dbConnection.ServerVersion, @"\(.*?\)", "");
|
||||
|
||||
return new Version(version);
|
||||
return DatabaseVersionParser.ParseServerVersion(dbConnection.ServerVersion);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
16
src/NzbDrone.Core/Datastore/DatabaseVersionParser.cs
Normal file
16
src/NzbDrone.Core/Datastore/DatabaseVersionParser.cs
Normal file
@@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace NzbDrone.Core.Datastore;
|
||||
|
||||
public static class DatabaseVersionParser
|
||||
{
|
||||
private static readonly Regex VersionRegex = new (@"^[^ ]+", RegexOptions.Compiled);
|
||||
|
||||
public static Version ParseServerVersion(string serverVersion)
|
||||
{
|
||||
var match = VersionRegex.Match(serverVersion);
|
||||
|
||||
return match.Success ? new Version(match.Value) : null;
|
||||
}
|
||||
}
|
||||
@@ -25,8 +25,6 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
Dictionary<string, QBittorrentLabel> GetLabels(QBittorrentSettings settings);
|
||||
void SetTorrentSeedingConfiguration(string hash, TorrentSeedConfiguration seedConfiguration, QBittorrentSettings settings);
|
||||
void MoveTorrentToTopInQueue(string hash, QBittorrentSettings settings);
|
||||
void PauseTorrent(string hash, QBittorrentSettings settings);
|
||||
void ResumeTorrent(string hash, QBittorrentSettings settings);
|
||||
void SetForceStart(string hash, bool enabled, QBittorrentSettings settings);
|
||||
}
|
||||
|
||||
|
||||
@@ -146,7 +146,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
{
|
||||
request.AddFormParameter("paused", false);
|
||||
}
|
||||
else if ((QBittorrentState)settings.InitialState == QBittorrentState.Pause)
|
||||
else if ((QBittorrentState)settings.InitialState == QBittorrentState.Stop)
|
||||
{
|
||||
request.AddFormParameter("paused", true);
|
||||
}
|
||||
@@ -176,7 +176,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
{
|
||||
request.AddFormParameter("paused", false);
|
||||
}
|
||||
else if ((QBittorrentState)settings.InitialState == QBittorrentState.Pause)
|
||||
else if ((QBittorrentState)settings.InitialState == QBittorrentState.Stop)
|
||||
{
|
||||
request.AddFormParameter("paused", true);
|
||||
}
|
||||
@@ -212,7 +212,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
catch (DownloadClientException ex)
|
||||
{
|
||||
// if setCategory fails due to method not being found, then try older setLabel command for qBittorrent < v.3.3.5
|
||||
if (ex.InnerException is HttpException && (ex.InnerException as HttpException).Response.StatusCode == HttpStatusCode.NotFound)
|
||||
if (ex.InnerException is HttpException httpException && httpException.Response.StatusCode == HttpStatusCode.NotFound)
|
||||
{
|
||||
var setLabelRequest = BuildRequest(settings).Resource("/command/setLabel")
|
||||
.Post()
|
||||
@@ -254,7 +254,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
catch (DownloadClientException ex)
|
||||
{
|
||||
// qBittorrent rejects all Prio commands with 403: Forbidden if Options -> BitTorrent -> Torrent Queueing is not enabled
|
||||
if (ex.InnerException is HttpException && (ex.InnerException as HttpException).Response.StatusCode == HttpStatusCode.Forbidden)
|
||||
if (ex.InnerException is HttpException httpException && httpException.Response.StatusCode == HttpStatusCode.Forbidden)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -263,22 +263,6 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
}
|
||||
}
|
||||
|
||||
public void PauseTorrent(string hash, QBittorrentSettings settings)
|
||||
{
|
||||
var request = BuildRequest(settings).Resource("/command/pause")
|
||||
.Post()
|
||||
.AddFormParameter("hash", hash);
|
||||
ProcessRequest(request, settings);
|
||||
}
|
||||
|
||||
public void ResumeTorrent(string hash, QBittorrentSettings settings)
|
||||
{
|
||||
var request = BuildRequest(settings).Resource("/command/resume")
|
||||
.Post()
|
||||
.AddFormParameter("hash", hash);
|
||||
ProcessRequest(request, settings);
|
||||
}
|
||||
|
||||
public void SetForceStart(string hash, bool enabled, QBittorrentSettings settings)
|
||||
{
|
||||
var request = BuildRequest(settings).Resource("/command/setForceStart")
|
||||
|
||||
@@ -246,14 +246,20 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
request.AddFormParameter("category", category);
|
||||
}
|
||||
|
||||
// Note: ForceStart is handled by separate api call
|
||||
if ((QBittorrentState)settings.InitialState == QBittorrentState.Start)
|
||||
// Avoid extraneous API version check if initial state is ForceStart
|
||||
if ((QBittorrentState)settings.InitialState is QBittorrentState.Start or QBittorrentState.Stop)
|
||||
{
|
||||
request.AddFormParameter("paused", false);
|
||||
}
|
||||
else if ((QBittorrentState)settings.InitialState == QBittorrentState.Pause)
|
||||
{
|
||||
request.AddFormParameter("paused", true);
|
||||
var stoppedParameterName = GetApiVersion(settings) >= new Version(2, 11, 0) ? "stopped" : "paused";
|
||||
|
||||
// Note: ForceStart is handled by separate api call
|
||||
if ((QBittorrentState)settings.InitialState == QBittorrentState.Start)
|
||||
{
|
||||
request.AddFormParameter(stoppedParameterName, false);
|
||||
}
|
||||
else if ((QBittorrentState)settings.InitialState == QBittorrentState.Stop)
|
||||
{
|
||||
request.AddFormParameter(stoppedParameterName, true);
|
||||
}
|
||||
}
|
||||
|
||||
if (settings.SequentialOrder)
|
||||
@@ -291,7 +297,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
catch (DownloadClientException ex)
|
||||
{
|
||||
// setShareLimits was added in api v2.0.1 so catch it case of the unlikely event that someone has api v2.0
|
||||
if (ex.InnerException is HttpException && (ex.InnerException as HttpException).Response.StatusCode == HttpStatusCode.NotFound)
|
||||
if (ex.InnerException is HttpException httpException && httpException.Response.StatusCode == HttpStatusCode.NotFound)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -313,7 +319,7 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
catch (DownloadClientException ex)
|
||||
{
|
||||
// qBittorrent rejects all Prio commands with 409: Conflict if Options -> BitTorrent -> Torrent Queueing is not enabled
|
||||
if (ex.InnerException is HttpException && (ex.InnerException as HttpException).Response.StatusCode == HttpStatusCode.Conflict)
|
||||
if (ex.InnerException is HttpException httpException && httpException.Response.StatusCode == HttpStatusCode.Conflict)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -322,22 +328,6 @@ namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
}
|
||||
}
|
||||
|
||||
public void PauseTorrent(string hash, QBittorrentSettings settings)
|
||||
{
|
||||
var request = BuildRequest(settings).Resource("/api/v2/torrents/pause")
|
||||
.Post()
|
||||
.AddFormParameter("hashes", hash);
|
||||
ProcessRequest(request, settings);
|
||||
}
|
||||
|
||||
public void ResumeTorrent(string hash, QBittorrentSettings settings)
|
||||
{
|
||||
var request = BuildRequest(settings).Resource("/api/v2/torrents/resume")
|
||||
.Post()
|
||||
.AddFormParameter("hashes", hash);
|
||||
ProcessRequest(request, settings);
|
||||
}
|
||||
|
||||
public void SetForceStart(string hash, bool enabled, QBittorrentSettings settings)
|
||||
{
|
||||
var request = BuildRequest(settings).Resource("/api/v2/torrents/setForceStart")
|
||||
|
||||
@@ -1,9 +1,16 @@
|
||||
using NzbDrone.Core.Annotations;
|
||||
|
||||
namespace NzbDrone.Core.Download.Clients.QBittorrent
|
||||
{
|
||||
public enum QBittorrentState
|
||||
{
|
||||
[FieldOption(Label = "Started")]
|
||||
Start = 0,
|
||||
|
||||
[FieldOption(Label = "Force Started")]
|
||||
ForceStart = 1,
|
||||
Pause = 2
|
||||
|
||||
[FieldOption(Label = "Stopped")]
|
||||
Stop = 2
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ namespace NzbDrone.Core.Download
|
||||
|
||||
foreach (var client in clients)
|
||||
{
|
||||
if (blockedClients.TryGetValue(client.Definition.Id, out var downloadClientStatus))
|
||||
if (blockedClients.TryGetValue(client.Definition.Id, out var downloadClientStatus) && downloadClientStatus.DisabledTill.HasValue)
|
||||
{
|
||||
_logger.Debug("Temporarily ignoring download client {0} till {1} due to recent failures.", client.Definition.Name, downloadClientStatus.DisabledTill.Value.ToLocalTime());
|
||||
continue;
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace NzbDrone.Core.HealthCheck.Checks
|
||||
private readonly IHttpRequestBuilderFactory _cloudRequestBuilder;
|
||||
private readonly Logger _logger;
|
||||
|
||||
public SystemTimeCheck(IHttpClient client, IProwlarrCloudRequestBuilder cloudRequestBuilder, ILocalizationService localizationService, Logger logger)
|
||||
public SystemTimeCheck(IHttpClient client, IProwlarrCloudRequestBuilder cloudRequestBuilder, Logger logger, ILocalizationService localizationService)
|
||||
: base(localizationService)
|
||||
{
|
||||
_client = client;
|
||||
@@ -29,19 +29,26 @@ namespace NzbDrone.Core.HealthCheck.Checks
|
||||
return new HealthCheck(GetType());
|
||||
}
|
||||
|
||||
var request = _cloudRequestBuilder.Create()
|
||||
.Resource("/time")
|
||||
.Build();
|
||||
|
||||
var response = _client.Execute(request);
|
||||
var result = Json.Deserialize<ServiceTimeResponse>(response.Content);
|
||||
var systemTime = DateTime.UtcNow;
|
||||
|
||||
// +/- more than 1 day
|
||||
if (Math.Abs(result.DateTimeUtc.Subtract(systemTime).TotalDays) >= 1)
|
||||
try
|
||||
{
|
||||
_logger.Error("System time mismatch. SystemTime: {0} Expected Time: {1}. Update system time", systemTime, result.DateTimeUtc);
|
||||
return new HealthCheck(GetType(), HealthCheckResult.Error, _localizationService.GetLocalizedString("SystemTimeCheckMessage"));
|
||||
var request = _cloudRequestBuilder.Create()
|
||||
.Resource("/time")
|
||||
.Build();
|
||||
|
||||
var response = _client.Execute(request);
|
||||
var result = Json.Deserialize<ServiceTimeResponse>(response.Content);
|
||||
var systemTime = DateTime.UtcNow;
|
||||
|
||||
// +/- more than 1 day
|
||||
if (Math.Abs(result.DateTimeUtc.Subtract(systemTime).TotalDays) >= 1)
|
||||
{
|
||||
_logger.Error("System time mismatch. SystemTime: {0} Expected Time: {1}. Update system time", systemTime, result.DateTimeUtc);
|
||||
return new HealthCheck(GetType(), HealthCheckResult.Error, _localizationService.GetLocalizedString("SystemTimeHealthCheckMessage"), "#system-time-off");
|
||||
}
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.Warn(e, "Unable to verify system time");
|
||||
}
|
||||
|
||||
return new HealthCheck(GetType());
|
||||
|
||||
@@ -93,7 +93,7 @@ namespace NzbDrone.Core.HealthCheck.Checks
|
||||
if (latestAvailable != null)
|
||||
{
|
||||
return new HealthCheck(GetType(),
|
||||
HealthCheckResult.Warning,
|
||||
BuildInfo.BuildDateTime.Before(DateTime.UtcNow.AddDays(-180)) ? HealthCheckResult.Error : HealthCheckResult.Warning,
|
||||
_localizationService.GetLocalizedString("UpdateAvailableHealthCheckMessage", new Dictionary<string, object>
|
||||
{
|
||||
{ "version", $"v{latestAvailable.Version}" }
|
||||
|
||||
@@ -326,8 +326,8 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
public BeyondHDSettingsValidator()
|
||||
{
|
||||
RuleFor(c => c.ApiKey).NotEmpty();
|
||||
RuleFor(c => c.RssKey).NotEmpty();
|
||||
RuleFor(c => c.ApiKey).NotEmpty().Length(32);
|
||||
RuleFor(c => c.RssKey).NotEmpty().Length(32);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -77,7 +77,7 @@ public class FileListParser : IParseIndexerResponse
|
||||
InfoUrl = GetInfoUrl(id),
|
||||
Seeders = row.Seeders,
|
||||
Peers = row.Leechers + row.Seeders,
|
||||
PublishDate = DateTime.Parse(row.UploadDate + " +0300", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal),
|
||||
PublishDate = DateTime.Parse(row.UploadDate + " +0200", CultureInfo.InvariantCulture, DateTimeStyles.AdjustToUniversal),
|
||||
Description = row.SmallDescription,
|
||||
Genres = row.SmallDescription.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).ToList(),
|
||||
ImdbId = imdbId,
|
||||
|
||||
@@ -189,7 +189,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
var qc = new NameValueCollection();
|
||||
|
||||
foreach (var cat in Capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories))
|
||||
foreach (var cat in Capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories).Distinct())
|
||||
{
|
||||
qc.Add(cat, string.Empty);
|
||||
}
|
||||
@@ -203,10 +203,13 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
// ipt uses sphinx, which supports boolean operators and grouping
|
||||
qc.Add("q", "+(" + imdbId + ")");
|
||||
|
||||
// search in description
|
||||
qc.Add("qf", "all");
|
||||
}
|
||||
|
||||
// changed from else if to if to support searching imdbid + season/episode in the same query
|
||||
if (!string.IsNullOrWhiteSpace(term))
|
||||
// changed from "else if" to "if" to support searching imdbid + season/episode in the same query
|
||||
if (term.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
// similar to above
|
||||
qc.Add("q", "+(" + term + ")");
|
||||
|
||||
@@ -80,7 +80,7 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
|
||||
protected override bool CheckIfLoginNeeded(HttpResponse httpResponse)
|
||||
{
|
||||
return httpResponse.Content.Contains("You do not have permission to access this page.");
|
||||
return !httpResponse.Content.Contains("logout.php");
|
||||
}
|
||||
|
||||
private IndexerCapabilities SetCapabilities()
|
||||
|
||||
348
src/NzbDrone.Core/Indexers/Definitions/Knaben.cs
Normal file
348
src/NzbDrone.Core/Indexers/Definitions/Knaben.cs
Normal file
@@ -0,0 +1,348 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Globalization;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Text.Json.Serialization;
|
||||
using System.Text.RegularExpressions;
|
||||
using NLog;
|
||||
using NzbDrone.Common.Extensions;
|
||||
using NzbDrone.Common.Http;
|
||||
using NzbDrone.Common.Serializer;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Indexers.Exceptions;
|
||||
using NzbDrone.Core.Indexers.Settings;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using static Newtonsoft.Json.Formatting;
|
||||
|
||||
namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
public class Knaben : TorrentIndexerBase<NoAuthTorrentBaseSettings>
|
||||
{
|
||||
public override string Name => "Knaben";
|
||||
public override string[] IndexerUrls => new[] { "https://knaben.eu/" };
|
||||
public override string Description => "Knaben is a Public torrent meta-search engine";
|
||||
public override IndexerPrivacy Privacy => IndexerPrivacy.Public;
|
||||
public override IndexerCapabilities Capabilities => SetCapabilities();
|
||||
|
||||
public Knaben(IIndexerHttpClient httpClient, IEventAggregator eventAggregator, IIndexerStatusService indexerStatusService, IConfigService configService, Logger logger)
|
||||
: base(httpClient, eventAggregator, indexerStatusService, configService, logger)
|
||||
{
|
||||
}
|
||||
|
||||
public override IIndexerRequestGenerator GetRequestGenerator()
|
||||
{
|
||||
return new KnabenRequestGenerator(Capabilities);
|
||||
}
|
||||
|
||||
public override IParseIndexerResponse GetParser()
|
||||
{
|
||||
return new KnabenParser(Capabilities.Categories);
|
||||
}
|
||||
|
||||
private static IndexerCapabilities SetCapabilities()
|
||||
{
|
||||
var caps = new IndexerCapabilities
|
||||
{
|
||||
TvSearchParams = new List<TvSearchParam>
|
||||
{
|
||||
TvSearchParam.Q, TvSearchParam.Season, TvSearchParam.Ep
|
||||
},
|
||||
MovieSearchParams = new List<MovieSearchParam>
|
||||
{
|
||||
MovieSearchParam.Q
|
||||
},
|
||||
MusicSearchParams = new List<MusicSearchParam>
|
||||
{
|
||||
MusicSearchParam.Q
|
||||
},
|
||||
BookSearchParams = new List<BookSearchParam>
|
||||
{
|
||||
BookSearchParam.Q
|
||||
}
|
||||
};
|
||||
|
||||
caps.Categories.AddCategoryMapping(1000000, NewznabStandardCategory.Audio, "Audio");
|
||||
caps.Categories.AddCategoryMapping(1001000, NewznabStandardCategory.AudioMP3, "MP3");
|
||||
caps.Categories.AddCategoryMapping(1002000, NewznabStandardCategory.AudioLossless, "Lossless");
|
||||
caps.Categories.AddCategoryMapping(1003000, NewznabStandardCategory.AudioAudiobook, "Audiobook");
|
||||
caps.Categories.AddCategoryMapping(1004000, NewznabStandardCategory.AudioVideo, "Audio Video");
|
||||
caps.Categories.AddCategoryMapping(1005000, NewznabStandardCategory.AudioOther, "Radio");
|
||||
caps.Categories.AddCategoryMapping(1006000, NewznabStandardCategory.AudioOther, "Audio Other");
|
||||
caps.Categories.AddCategoryMapping(2000000, NewznabStandardCategory.TV, "TV");
|
||||
caps.Categories.AddCategoryMapping(2001000, NewznabStandardCategory.TVHD, "TV HD");
|
||||
caps.Categories.AddCategoryMapping(2002000, NewznabStandardCategory.TVSD, "TV SD");
|
||||
caps.Categories.AddCategoryMapping(2003000, NewznabStandardCategory.TVUHD, "TV UHD");
|
||||
caps.Categories.AddCategoryMapping(2004000, NewznabStandardCategory.TVDocumentary, "Documentary");
|
||||
caps.Categories.AddCategoryMapping(2005000, NewznabStandardCategory.TVForeign, "TV Foreign");
|
||||
caps.Categories.AddCategoryMapping(2006000, NewznabStandardCategory.TVSport, "Sport");
|
||||
caps.Categories.AddCategoryMapping(2007000, NewznabStandardCategory.TVOther, "Cartoon");
|
||||
caps.Categories.AddCategoryMapping(2008000, NewznabStandardCategory.TVOther, "TV Other");
|
||||
caps.Categories.AddCategoryMapping(3000000, NewznabStandardCategory.Movies, "Movies");
|
||||
caps.Categories.AddCategoryMapping(3001000, NewznabStandardCategory.MoviesHD, "Movies HD");
|
||||
caps.Categories.AddCategoryMapping(3002000, NewznabStandardCategory.MoviesSD, "Movies SD");
|
||||
caps.Categories.AddCategoryMapping(3003000, NewznabStandardCategory.MoviesUHD, "Movies UHD");
|
||||
caps.Categories.AddCategoryMapping(3004000, NewznabStandardCategory.MoviesDVD, "Movies DVD");
|
||||
caps.Categories.AddCategoryMapping(3005000, NewznabStandardCategory.MoviesForeign, "Movies Foreign");
|
||||
caps.Categories.AddCategoryMapping(3006000, NewznabStandardCategory.MoviesForeign, "Movies Bollywood");
|
||||
caps.Categories.AddCategoryMapping(3007000, NewznabStandardCategory.Movies3D, "Movies 3D");
|
||||
caps.Categories.AddCategoryMapping(3008000, NewznabStandardCategory.MoviesOther, "Movies Other");
|
||||
caps.Categories.AddCategoryMapping(4000000, NewznabStandardCategory.PC, "PC");
|
||||
caps.Categories.AddCategoryMapping(4001000, NewznabStandardCategory.PCGames, "Games");
|
||||
caps.Categories.AddCategoryMapping(4002000, NewznabStandardCategory.PC0day, "Software");
|
||||
caps.Categories.AddCategoryMapping(4003000, NewznabStandardCategory.PCMac, "Mac");
|
||||
caps.Categories.AddCategoryMapping(4004000, NewznabStandardCategory.PCISO, "Unix");
|
||||
caps.Categories.AddCategoryMapping(5000000, NewznabStandardCategory.XXX, "XXX");
|
||||
caps.Categories.AddCategoryMapping(5001000, NewznabStandardCategory.XXXx264, "XXX Video");
|
||||
caps.Categories.AddCategoryMapping(5002000, NewznabStandardCategory.XXXImageSet, "XXX ImageSet");
|
||||
caps.Categories.AddCategoryMapping(5003000, NewznabStandardCategory.XXXOther, "XXX Games");
|
||||
caps.Categories.AddCategoryMapping(5004000, NewznabStandardCategory.XXXOther, "XXX Hentai");
|
||||
caps.Categories.AddCategoryMapping(5005000, NewznabStandardCategory.XXXOther, "XXX Other");
|
||||
caps.Categories.AddCategoryMapping(6000000, NewznabStandardCategory.TVAnime, "Anime");
|
||||
caps.Categories.AddCategoryMapping(6001000, NewznabStandardCategory.TVAnime, "Anime Subbed");
|
||||
caps.Categories.AddCategoryMapping(6002000, NewznabStandardCategory.TVAnime, "Anime Dubbed");
|
||||
caps.Categories.AddCategoryMapping(6003000, NewznabStandardCategory.TVAnime, "Anime Dual audio");
|
||||
caps.Categories.AddCategoryMapping(6004000, NewznabStandardCategory.TVAnime, "Anime Raw");
|
||||
caps.Categories.AddCategoryMapping(6005000, NewznabStandardCategory.AudioVideo, "Music Video");
|
||||
caps.Categories.AddCategoryMapping(6006000, NewznabStandardCategory.BooksOther, "Literature");
|
||||
caps.Categories.AddCategoryMapping(6007000, NewznabStandardCategory.AudioOther, "Music");
|
||||
caps.Categories.AddCategoryMapping(6008000, NewznabStandardCategory.TVAnime, "Anime non-english translated");
|
||||
caps.Categories.AddCategoryMapping(7000000, NewznabStandardCategory.Console, "Console");
|
||||
caps.Categories.AddCategoryMapping(7001000, NewznabStandardCategory.ConsolePS4, "PS4");
|
||||
caps.Categories.AddCategoryMapping(7002000, NewznabStandardCategory.ConsolePS3, "PS3");
|
||||
caps.Categories.AddCategoryMapping(7003000, NewznabStandardCategory.ConsolePS3, "PS2");
|
||||
caps.Categories.AddCategoryMapping(7004000, NewznabStandardCategory.ConsolePS3, "PS1");
|
||||
caps.Categories.AddCategoryMapping(7005000, NewznabStandardCategory.ConsolePSVita, "PS Vita");
|
||||
caps.Categories.AddCategoryMapping(7006000, NewznabStandardCategory.ConsolePSP, "PSP");
|
||||
caps.Categories.AddCategoryMapping(7007000, NewznabStandardCategory.ConsoleXBox360, "Xbox 360");
|
||||
caps.Categories.AddCategoryMapping(7008000, NewznabStandardCategory.ConsoleXBox, "Xbox");
|
||||
caps.Categories.AddCategoryMapping(7009000, NewznabStandardCategory.ConsoleNDS, "Switch");
|
||||
caps.Categories.AddCategoryMapping(7010000, NewznabStandardCategory.ConsoleNDS, "NDS");
|
||||
caps.Categories.AddCategoryMapping(7011000, NewznabStandardCategory.ConsoleWii, "Wii");
|
||||
caps.Categories.AddCategoryMapping(7012000, NewznabStandardCategory.ConsoleWiiU, "WiiU");
|
||||
caps.Categories.AddCategoryMapping(7013000, NewznabStandardCategory.Console3DS, "3DS");
|
||||
caps.Categories.AddCategoryMapping(7014000, NewznabStandardCategory.ConsoleWii, "GameCube");
|
||||
caps.Categories.AddCategoryMapping(7015000, NewznabStandardCategory.ConsoleOther, "Other");
|
||||
caps.Categories.AddCategoryMapping(8000000, NewznabStandardCategory.PCMobileOther, "Mobile");
|
||||
caps.Categories.AddCategoryMapping(8001000, NewznabStandardCategory.PCMobileAndroid, "Android");
|
||||
caps.Categories.AddCategoryMapping(8002000, NewznabStandardCategory.PCMobileiOS, "IOS");
|
||||
caps.Categories.AddCategoryMapping(8003000, NewznabStandardCategory.PCMobileOther, "PC Other");
|
||||
caps.Categories.AddCategoryMapping(9000000, NewznabStandardCategory.Books, "Books");
|
||||
caps.Categories.AddCategoryMapping(9001000, NewznabStandardCategory.BooksEBook, "EBooks");
|
||||
caps.Categories.AddCategoryMapping(9002000, NewznabStandardCategory.BooksComics, "Comics");
|
||||
caps.Categories.AddCategoryMapping(9003000, NewznabStandardCategory.BooksMags, "Magazines");
|
||||
caps.Categories.AddCategoryMapping(9004000, NewznabStandardCategory.BooksTechnical, "Technical");
|
||||
caps.Categories.AddCategoryMapping(9005000, NewznabStandardCategory.BooksOther, "Books Other");
|
||||
caps.Categories.AddCategoryMapping(10000000, NewznabStandardCategory.Other, "Other");
|
||||
caps.Categories.AddCategoryMapping(10001000, NewznabStandardCategory.OtherMisc, "Other Misc");
|
||||
|
||||
return caps;
|
||||
}
|
||||
}
|
||||
|
||||
public class KnabenRequestGenerator : IIndexerRequestGenerator
|
||||
{
|
||||
private const string API_SEARCH_ENDPOINT = "https://api.knaben.eu/v1";
|
||||
|
||||
private readonly IndexerCapabilities _capabilities;
|
||||
|
||||
public KnabenRequestGenerator(IndexerCapabilities capabilities)
|
||||
{
|
||||
_capabilities = capabilities;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(MovieSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(CreateRequest(searchCriteria, searchCriteria.SanitizedSearchTerm));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(MusicSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(CreateRequest(searchCriteria, searchCriteria.SanitizedSearchTerm));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(TvSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(CreateRequest(searchCriteria, searchCriteria.SanitizedTvSearchString));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(BookSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(CreateRequest(searchCriteria, searchCriteria.SanitizedSearchTerm));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
public IndexerPageableRequestChain GetSearchRequests(BasicSearchCriteria searchCriteria)
|
||||
{
|
||||
var pageableRequests = new IndexerPageableRequestChain();
|
||||
|
||||
pageableRequests.Add(CreateRequest(searchCriteria, searchCriteria.SanitizedSearchTerm));
|
||||
|
||||
return pageableRequests;
|
||||
}
|
||||
|
||||
private IEnumerable<IndexerRequest> CreateRequest(SearchCriteriaBase searchCriteria, string searchTerm)
|
||||
{
|
||||
var body = new Dictionary<string, object>
|
||||
{
|
||||
{ "order_by", "date" },
|
||||
{ "order_direction", "desc" },
|
||||
{ "from", 0 },
|
||||
{ "size", 100 },
|
||||
{ "hide_unsafe", true }
|
||||
};
|
||||
|
||||
var searchQuery = searchTerm.Trim();
|
||||
|
||||
if (searchQuery.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
body.Add("search_type", "100%");
|
||||
body.Add("search_field", "title");
|
||||
body.Add("query", searchQuery);
|
||||
}
|
||||
|
||||
var categories = _capabilities.Categories.MapTorznabCapsToTrackers(searchCriteria.Categories);
|
||||
|
||||
if (categories is { Count: > 0 })
|
||||
{
|
||||
body.Add("categories", categories.Select(int.Parse).Distinct().ToArray());
|
||||
}
|
||||
|
||||
var request = new HttpRequest(API_SEARCH_ENDPOINT, HttpAccept.Json)
|
||||
{
|
||||
Headers =
|
||||
{
|
||||
ContentType = "application/json"
|
||||
},
|
||||
Method = HttpMethod.Post
|
||||
};
|
||||
request.SetContent(body.ToJson());
|
||||
request.ContentSummary = body.ToJson(None);
|
||||
|
||||
yield return new IndexerRequest(request);
|
||||
}
|
||||
|
||||
public Func<IDictionary<string, string>> GetCookies { get; set; }
|
||||
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
|
||||
}
|
||||
|
||||
public class KnabenParser : IParseIndexerResponse
|
||||
{
|
||||
private static readonly Regex DateTimezoneRegex = new (@"[+-]\d{2}:\d{2}$", RegexOptions.Compiled);
|
||||
|
||||
private readonly IndexerCapabilitiesCategories _categories;
|
||||
|
||||
public KnabenParser(IndexerCapabilitiesCategories categories)
|
||||
{
|
||||
_categories = categories;
|
||||
}
|
||||
|
||||
public IList<ReleaseInfo> ParseResponse(IndexerResponse indexerResponse)
|
||||
{
|
||||
var indexerHttpResponse = indexerResponse.HttpResponse;
|
||||
|
||||
if (indexerHttpResponse.StatusCode != HttpStatusCode.OK)
|
||||
{
|
||||
throw new IndexerException(indexerResponse, $"Unexpected response status {indexerHttpResponse.StatusCode} code from indexer request");
|
||||
}
|
||||
|
||||
if (!indexerHttpResponse.Headers.ContentType.Contains(HttpAccept.Json.Value))
|
||||
{
|
||||
throw new IndexerException(indexerResponse, $"Unexpected response header {indexerHttpResponse.Headers.ContentType} from indexer request, expected {HttpAccept.Json.Value}");
|
||||
}
|
||||
|
||||
var releaseInfos = new List<ReleaseInfo>();
|
||||
|
||||
var jsonResponse = STJson.Deserialize<KnabenResponse>(indexerResponse.Content);
|
||||
|
||||
if (jsonResponse?.Hits == null)
|
||||
{
|
||||
return releaseInfos;
|
||||
}
|
||||
|
||||
var rows = jsonResponse.Hits.Where(r => r.Seeders > 0).ToList();
|
||||
|
||||
foreach (var row in rows)
|
||||
{
|
||||
// Not all entries have the TZ in the "date" field
|
||||
var publishDate = row.Date.IsNotNullOrWhiteSpace() && !DateTimezoneRegex.IsMatch(row.Date) ? $"{row.Date}+01:00" : row.Date;
|
||||
|
||||
var releaseInfo = new TorrentInfo
|
||||
{
|
||||
Guid = row.InfoUrl,
|
||||
Title = row.Title,
|
||||
InfoUrl = row.InfoUrl,
|
||||
DownloadUrl = row.DownloadUrl.IsNotNullOrWhiteSpace() ? row.DownloadUrl : null,
|
||||
MagnetUrl = row.MagnetUrl.IsNotNullOrWhiteSpace() ? row.MagnetUrl : null,
|
||||
Categories = row.CategoryIds.SelectMany(cat => _categories.MapTrackerCatToNewznab(cat.ToString())).Distinct().ToList(),
|
||||
InfoHash = row.InfoHash,
|
||||
Size = row.Size,
|
||||
Seeders = row.Seeders,
|
||||
Peers = row.Leechers + row.Seeders,
|
||||
PublishDate = DateTime.Parse(publishDate, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal),
|
||||
DownloadVolumeFactor = 0,
|
||||
UploadVolumeFactor = 1
|
||||
};
|
||||
|
||||
releaseInfos.Add(releaseInfo);
|
||||
}
|
||||
|
||||
// order by date
|
||||
return releaseInfos;
|
||||
}
|
||||
|
||||
public Action<IDictionary<string, string>, DateTime?> CookiesUpdater { get; set; }
|
||||
}
|
||||
|
||||
internal sealed class KnabenResponse
|
||||
{
|
||||
public IReadOnlyCollection<KnabenRelease> Hits { get; init; } = Array.Empty<KnabenRelease>();
|
||||
}
|
||||
|
||||
internal sealed class KnabenRelease
|
||||
{
|
||||
public string Title { get; init; }
|
||||
|
||||
[JsonPropertyName("categoryId")]
|
||||
public IReadOnlyCollection<int> CategoryIds { get; init; } = Array.Empty<int>();
|
||||
|
||||
[JsonPropertyName("hash")]
|
||||
public string InfoHash { get; init; }
|
||||
|
||||
[JsonPropertyName("details")]
|
||||
public string InfoUrl { get; init; }
|
||||
|
||||
[JsonPropertyName("link")]
|
||||
public string DownloadUrl { get; init; }
|
||||
|
||||
public string MagnetUrl { get; init; }
|
||||
|
||||
[JsonPropertyName("bytes")]
|
||||
public long Size { get; init; }
|
||||
|
||||
public int Seeders { get; init; }
|
||||
|
||||
[JsonPropertyName("peers")]
|
||||
public int Leechers { get; init; }
|
||||
|
||||
public string Date { get; init; }
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,6 @@ using NzbDrone.Core.Indexers.Exceptions;
|
||||
using NzbDrone.Core.Indexers.Settings;
|
||||
using NzbDrone.Core.IndexerSearch.Definitions;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
using NzbDrone.Core.Parser;
|
||||
using NzbDrone.Core.Parser.Model;
|
||||
using NzbDrone.Core.Validation;
|
||||
|
||||
@@ -385,11 +384,6 @@ public class MTeamTpParser : IParseIndexerResponse
|
||||
MinimumSeedTime = 172800 // 2 days
|
||||
};
|
||||
|
||||
if (torrent.Imdb.IsNotNullOrWhiteSpace())
|
||||
{
|
||||
release.ImdbId = ParseUtil.GetImdbId(torrent.Imdb.TrimEnd('/').Split('/').LastOrDefault()).GetValueOrDefault();
|
||||
}
|
||||
|
||||
if (torrent.Status?.CreatedDate != null &&
|
||||
DateTime.TryParseExact($"{torrent.Status.CreatedDate} +08:00", "yyyy-MM-dd HH:mm:ss zzz", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out var publishDate))
|
||||
{
|
||||
|
||||
@@ -42,7 +42,8 @@ namespace NzbDrone.Core.Indexers.Newznab
|
||||
|
||||
RuleFor(c => c.VipExpiration).Must(c => c.IsFutureDate())
|
||||
.When(c => c.VipExpiration.IsNotNullOrWhiteSpace())
|
||||
.WithMessage("Must be a future date");
|
||||
.WithMessage("Must be a future date")
|
||||
.AsWarning();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -20,6 +20,7 @@ using NzbDrone.Core.Validation;
|
||||
|
||||
namespace NzbDrone.Core.Indexers.Definitions
|
||||
{
|
||||
[Obsolete("Site has removed API access.")]
|
||||
public class NzbIndex : UsenetIndexerBase<NzbIndexSettings>
|
||||
{
|
||||
public override string Name => "NZBIndex";
|
||||
|
||||
@@ -24,7 +24,8 @@ namespace NzbDrone.Core.Indexers.Definitions
|
||||
public class Redacted : TorrentIndexerBase<RedactedSettings>
|
||||
{
|
||||
public override string Name => "Redacted";
|
||||
public override string[] IndexerUrls => new[] { "https://redacted.ch/" };
|
||||
public override string[] IndexerUrls => new[] { "https://redacted.sh/" };
|
||||
public override string[] LegacyUrls => new[] { "https://redacted.ch/" };
|
||||
public override string Description => "REDActed (Aka.PassTheHeadPhones) is one of the most well-known music trackers.";
|
||||
public override IndexerPrivacy Privacy => IndexerPrivacy.Private;
|
||||
public override IndexerCapabilities Capabilities => SetCapabilities();
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
using FluentValidation.Results;
|
||||
using NLog;
|
||||
using NzbDrone.Core.Configuration;
|
||||
using NzbDrone.Core.Messaging.Events;
|
||||
@@ -44,6 +46,13 @@ namespace NzbDrone.Core.Indexers.Definitions.TorrentRss
|
||||
}
|
||||
}
|
||||
|
||||
protected override Task<ValidationFailure> TestConnection()
|
||||
{
|
||||
UpdateCookies(null, null);
|
||||
|
||||
return base.TestConnection();
|
||||
}
|
||||
|
||||
private IndexerDefinition GetDefinition(string name, string description, TorrentRssIndexerSettings settings)
|
||||
{
|
||||
return new IndexerDefinition
|
||||
|
||||
@@ -650,7 +650,7 @@ namespace NzbDrone.Core.Indexers
|
||||
{
|
||||
foreach (var cookie in Cookies)
|
||||
{
|
||||
request.HttpRequest.Cookies.Add(cookie.Key, cookie.Value);
|
||||
request.HttpRequest.Cookies[cookie.Key] = cookie.Value;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -761,7 +761,7 @@ namespace NzbDrone.Core.Indexers
|
||||
|
||||
if (releases.Releases.Empty())
|
||||
{
|
||||
return new ValidationFailure(string.Empty, "Query successful, but no results were returned from your indexer. This may be an issue with the indexer, your indexer category settings, or other indexer settings such as search freeleech only etc.");
|
||||
return new ValidationFailure(string.Empty, "Query successful, but no results were returned from your indexer. This may be an issue with the indexer, your indexer category settings, or other indexer settings such as search freeleech only etc. See the FAQ for details.");
|
||||
}
|
||||
}
|
||||
catch (IndexerAuthException ex)
|
||||
|
||||
@@ -242,7 +242,7 @@ namespace NzbDrone.Core.Indexers
|
||||
|
||||
foreach (var indexer in indexers)
|
||||
{
|
||||
if (blockedIndexers.TryGetValue(indexer.Definition.Id, out var blockedIndexerStatus))
|
||||
if (blockedIndexers.TryGetValue(indexer.Definition.Id, out var blockedIndexerStatus) && blockedIndexerStatus.DisabledTill.HasValue)
|
||||
{
|
||||
_logger.Debug("Temporarily ignoring indexer {0} till {1} due to recent failures.", indexer.Definition.Name, blockedIndexerStatus.DisabledTill.Value.ToLocalTime());
|
||||
continue;
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using MonoTorrent;
|
||||
using NLog;
|
||||
@@ -22,10 +23,10 @@ namespace NzbDrone.Core.Indexers
|
||||
{
|
||||
Torrent.Load(fileData);
|
||||
}
|
||||
catch
|
||||
catch (Exception ex)
|
||||
{
|
||||
_logger.Debug("Invalid torrent file contents: {0}", Encoding.ASCII.GetString(fileData));
|
||||
throw;
|
||||
throw new NotSupportedException($"Invalid torrent file contents. Reason: {ex.Message}", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -60,33 +60,36 @@ namespace NzbDrone.Core.Instrumentation
|
||||
{
|
||||
try
|
||||
{
|
||||
var log = new Log();
|
||||
log.Time = logEvent.TimeStamp;
|
||||
log.Message = CleanseLogMessage.Cleanse(logEvent.FormattedMessage);
|
||||
|
||||
log.Logger = logEvent.LoggerName;
|
||||
var log = new Log
|
||||
{
|
||||
Time = logEvent.TimeStamp,
|
||||
Logger = logEvent.LoggerName,
|
||||
Level = logEvent.Level.Name
|
||||
};
|
||||
|
||||
if (log.Logger.StartsWith("NzbDrone."))
|
||||
{
|
||||
log.Logger = log.Logger.Remove(0, 9);
|
||||
}
|
||||
|
||||
var message = logEvent.FormattedMessage;
|
||||
|
||||
if (logEvent.Exception != null)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(log.Message))
|
||||
if (string.IsNullOrWhiteSpace(message))
|
||||
{
|
||||
log.Message = logEvent.Exception.Message;
|
||||
message = logEvent.Exception.Message;
|
||||
}
|
||||
else
|
||||
{
|
||||
log.Message += ": " + logEvent.Exception.Message;
|
||||
message += ": " + logEvent.Exception.Message;
|
||||
}
|
||||
|
||||
log.Exception = logEvent.Exception.ToString();
|
||||
log.Exception = CleanseLogMessage.Cleanse(logEvent.Exception.ToString());
|
||||
log.ExceptionType = logEvent.Exception.GetType().ToString();
|
||||
}
|
||||
|
||||
log.Level = logEvent.Level.Name;
|
||||
log.Message = CleanseLogMessage.Cleanse(message);
|
||||
|
||||
var connectionInfo = _connectionStringFactory.LogDbConnection;
|
||||
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
"SelectAll": "اختر الكل",
|
||||
"SendAnonymousUsageData": "إرسال بيانات الاستخدام المجهولة",
|
||||
"Style": "أسلوب",
|
||||
"SystemTimeCheckMessage": "توقف وقت النظام بأكثر من يوم واحد. قد لا تعمل المهام المجدولة بشكل صحيح حتى يتم تصحيح الوقت",
|
||||
"SystemTimeHealthCheckMessage": "توقف وقت النظام بأكثر من يوم واحد. قد لا تعمل المهام المجدولة بشكل صحيح حتى يتم تصحيح الوقت",
|
||||
"TableOptionsColumnsMessage": "اختر الأعمدة المرئية والترتيب الذي تظهر به",
|
||||
"TagCannotBeDeletedWhileInUse": "لا يمكن حذفه أثناء الاستخدام",
|
||||
"Tasks": "مهام",
|
||||
@@ -370,5 +370,10 @@
|
||||
"ErrorRestoringBackup": "خطأ في استعادة النسخة الاحتياطية",
|
||||
"ExternalUpdater": "تم تكوين {appName} لاستخدام آلية تحديث خارجية",
|
||||
"InstallLatest": "تثبيت الأحدث",
|
||||
"AptUpdater": "استخدم apt لتثبيت التحديث"
|
||||
"AptUpdater": "استخدم apt لتثبيت التحديث",
|
||||
"Clone": "قريب",
|
||||
"Stats": "الحالة",
|
||||
"CurrentlyInstalled": "مثبتة حاليا",
|
||||
"Season": "السبب",
|
||||
"Mixed": "ثابت"
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
"SSLPort": "SSL порт",
|
||||
"Status": "Състояние",
|
||||
"System": "Система",
|
||||
"SystemTimeCheckMessage": "Системното време е изключено с повече от 1 ден. Планираните задачи може да не се изпълняват правилно, докато времето не бъде коригирано",
|
||||
"SystemTimeHealthCheckMessage": "Системното време е изключено с повече от 1 ден. Планираните задачи може да не се изпълняват правилно, докато времето не бъде коригирано",
|
||||
"TestAll": "Тествайте всички",
|
||||
"Title": "Заглавие",
|
||||
"Today": "Днес",
|
||||
@@ -370,5 +370,9 @@
|
||||
"RestartReloadNote": "Забележка: {appName} автоматично ще рестартира и презареди потребителския интерфейс по време на процеса на възстановяване.",
|
||||
"UpdateAppDirectlyLoadError": "Не може да се актуализира {appName} директно,",
|
||||
"AptUpdater": "Използвайте apt, за да инсталирате актуализацията",
|
||||
"InstallLatest": "Инсталирайте най-новите"
|
||||
"InstallLatest": "Инсталирайте най-новите",
|
||||
"Clone": "Близо",
|
||||
"ActiveApps": "Активни приложения",
|
||||
"ActiveIndexers": "Активни индиксатори",
|
||||
"AddApplication": "добави приложение"
|
||||
}
|
||||
|
||||
@@ -136,7 +136,7 @@
|
||||
"Priority": "Prioritat",
|
||||
"SendAnonymousUsageData": "Envia dades d'ús anònimes",
|
||||
"SetTags": "Estableix etiquetes",
|
||||
"SystemTimeCheckMessage": "L'hora del sistema està apagada durant més d'1 dia. És possible que les tasques programades no s'executin correctament fins que no es corregeixi l'hora",
|
||||
"SystemTimeHealthCheckMessage": "L'hora del sistema està apagada durant més d'1 dia. És possible que les tasques programades no s'executin correctament fins que no es corregeixi l'hora",
|
||||
"TableOptions": "Opcions de taula",
|
||||
"TableOptionsColumnsMessage": "Trieu quines columnes són visibles i en quin ordre apareixen",
|
||||
"Columns": "Columnes",
|
||||
|
||||
@@ -221,7 +221,7 @@
|
||||
"Restore": "Obnovit",
|
||||
"SettingsShowRelativeDates": "Zobrazit relativní data",
|
||||
"SettingsShowRelativeDatesHelpText": "Zobrazit relativní (dnes / včera / atd.) Nebo absolutní data",
|
||||
"SystemTimeCheckMessage": "Systémový čas je vypnutý o více než 1 den. Naplánované úlohy nemusí fungovat správně, dokud nebude čas opraven",
|
||||
"SystemTimeHealthCheckMessage": "Systémový čas je vypnutý o více než 1 den. Naplánované úlohy nemusí fungovat správně, dokud nebude čas opraven",
|
||||
"AddingTag": "Přidání značky",
|
||||
"Age": "Stáří",
|
||||
"All": "Vše",
|
||||
@@ -433,5 +433,8 @@
|
||||
"RestartReloadNote": "Poznámka: {appName} se během procesu obnovy automaticky restartuje a znovu načte uživatelské rozhraní.",
|
||||
"UpdateAppDirectlyLoadError": "{appName} nelze aktualizovat přímo,",
|
||||
"AptUpdater": "K instalaci aktualizace použijte apt",
|
||||
"InstallLatest": "Nainstalujte nejnovější"
|
||||
"InstallLatest": "Nainstalujte nejnovější",
|
||||
"Stats": "Postavení",
|
||||
"CurrentlyInstalled": "Aktuálně nainstalováno",
|
||||
"Mixed": "Pevný"
|
||||
}
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
"MIA": "MIA",
|
||||
"ResetAPIKey": "Nulstil API-nøgle",
|
||||
"SettingsTimeFormat": "Tidsformat",
|
||||
"SystemTimeCheckMessage": "Systemtiden er slukket mere end 1 dag. Planlagte opgaver kører muligvis ikke korrekt, før tiden er rettet",
|
||||
"SystemTimeHealthCheckMessage": "Systemtiden er slukket mere end 1 dag. Planlagte opgaver kører muligvis ikke korrekt, før tiden er rettet",
|
||||
"UnsavedChanges": "Ugemte ændringer",
|
||||
"Updates": "Opdateringer",
|
||||
"MoreInfo": "Mere info",
|
||||
@@ -410,5 +410,9 @@
|
||||
"ExternalUpdater": "{appName} er konfigureret til at bruge en ekstern opdateringsmekanisme",
|
||||
"RestartReloadNote": "Bemærk: {appName} genstarter automatisk og genindlæser brugergrænsefladen under gendannelsesprocessen.",
|
||||
"UpdateAppDirectlyLoadError": "Kan ikke opdatere {appName} direkte,",
|
||||
"InstallLatest": "Installer senest"
|
||||
"InstallLatest": "Installer senest",
|
||||
"Clone": "Luk",
|
||||
"CurrentlyInstalled": "Aktuelt installeret",
|
||||
"Stats": "Status",
|
||||
"Mixed": "Fast"
|
||||
}
|
||||
|
||||
@@ -179,7 +179,7 @@
|
||||
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Alle Indexer sind wegen über 6 Stunden langen bestehender Fehler nicht verfügbar",
|
||||
"IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexer wegen über 6 Stunden langen bestehenden Fehlern nicht verfügbar: {indexerNames}",
|
||||
"IndexerName": "Indexer-Name",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Indexer haben keine Definition und werden nicht funktionieren: {0}. Bitte entferne und (oder) füge diese neu zu {appName} hinzu",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Indexer haben keine Definition und werden nicht funktionieren: {indexerNames}. Bitte entferne und (oder) füge diese neu zu {appName} hinzu",
|
||||
"IndexerObsoleteCheckMessage": "Indexer sind nicht mehr verfügbar oder wurden aktualiiert: {0}. Bitte enfernen und (oder) neu zu {appName} hinzufügen",
|
||||
"IndexerPriority": "Priorität",
|
||||
"IndexerPriorityHelpText": "Indexer Priorität von 1 (höchste) bis 50 (niedrigste). Standard: 25.",
|
||||
@@ -379,7 +379,7 @@
|
||||
"SyncProfile": "Sync-Profile",
|
||||
"SyncProfiles": "Sync-Profile",
|
||||
"System": "System",
|
||||
"SystemTimeCheckMessage": "Die Systemzeit ist um einen Tag versetzt. Bis die Zeit korrigiert wurde, könnten die geplanten Aufgaben nicht korrekt ausgeführt werden",
|
||||
"SystemTimeHealthCheckMessage": "Die Systemzeit ist um einen Tag versetzt. Bis die Zeit korrigiert wurde, könnten die geplanten Aufgaben nicht korrekt ausgeführt werden",
|
||||
"TVSearchTypes": "Suchtyp",
|
||||
"TableOptions": "Tabellen Optionen",
|
||||
"TableOptionsColumnsMessage": "Wähle aus welche Spalten angezeigt werden und in welcher Reihenfolge",
|
||||
@@ -624,5 +624,7 @@
|
||||
"UpdaterLogFiles": "Updater-Protokolldateien",
|
||||
"WouldYouLikeToRestoreBackup": "Willst du das Backup '{name}' wiederherstellen?",
|
||||
"AptUpdater": "Verwenden Sie apt, um das Update zu installieren",
|
||||
"InstallLatest": "Jetzt updaten"
|
||||
"InstallLatest": "Jetzt updaten",
|
||||
"CurrentlyInstalled": "Derzeit installiert",
|
||||
"Mixed": "Behoben"
|
||||
}
|
||||
|
||||
@@ -196,7 +196,7 @@
|
||||
"SSLCertPath": "Διαδρομή πιστοποίησης SSL",
|
||||
"StartTypingOrSelectAPathBelow": "Ξεκινήστε να πληκτρολογείτε ή επιλέξτε μια διαδρομή παρακάτω",
|
||||
"Style": "Στυλ",
|
||||
"SystemTimeCheckMessage": "Ο χρόνος συστήματος είναι απενεργοποιημένος για περισσότερο από 1 ημέρα. Οι προγραμματισμένες εργασίες ενδέχεται να μην εκτελούνται σωστά έως ότου διορθωθεί η ώρα",
|
||||
"SystemTimeHealthCheckMessage": "Ο χρόνος συστήματος είναι απενεργοποιημένος για περισσότερο από 1 ημέρα. Οι προγραμματισμένες εργασίες ενδέχεται να μην εκτελούνται σωστά έως ότου διορθωθεί η ώρα",
|
||||
"TableOptions": "Επιλογές πίνακα",
|
||||
"TableOptionsColumnsMessage": "Επιλέξτε ποιες στήλες είναι ορατές και με ποια σειρά εμφανίζονται",
|
||||
"TagIsNotUsedAndCanBeDeleted": "Η ετικέτα δεν χρησιμοποιείται και μπορεί να διαγραφεί",
|
||||
@@ -431,7 +431,7 @@
|
||||
"IndexerInfo": "Πληροφορίες ευρετηρίου",
|
||||
"IndexerName": "Όνομα ευρετηρίου",
|
||||
"IndexerProxies": "Proxer Indexer",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Τα ευρετήρια δεν έχουν ορισμό και δεν θα λειτουργήσουν: {0}. Αφαιρέστε και (ή) προσθέστε ξανά στο {appName}",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Τα ευρετήρια δεν έχουν ορισμό και δεν θα λειτουργήσουν: {indexerNames}. Αφαιρέστε και (ή) προσθέστε ξανά στο {appName}",
|
||||
"SemiPrivate": "Ημι-ιδιωτικό",
|
||||
"SettingsIndexerLoggingHelpText": "Καταγραφή πρόσθετων δεδομένων ευρετηρίου συμπεριλαμβανομένης της απόκρισης",
|
||||
"SearchTypes": "Τύποι αναζήτησης",
|
||||
@@ -538,5 +538,7 @@
|
||||
"UpdateAppDirectlyLoadError": "Δεν είναι δυνατή η απευθείας ενημέρωση του {appName},",
|
||||
"DockerUpdater": "ενημερώστε το κοντέινερ για να λάβετε την ενημέρωση",
|
||||
"AptUpdater": "Χρησιμοποιήστε το apt για να εγκαταστήσετε την ενημέρωση",
|
||||
"InstallLatest": "Εγκατάσταση πιο πρόσφατου"
|
||||
"InstallLatest": "Εγκατάσταση πιο πρόσφατου",
|
||||
"CurrentlyInstalled": "Εγκατεστημένο αυτήν τη στιγμή",
|
||||
"Mixed": "Σταθερός"
|
||||
}
|
||||
|
||||
@@ -143,6 +143,7 @@
|
||||
"CountDownloadClientsSelected": "{count} download client(s) selected",
|
||||
"CountIndexersAvailable": "{count} indexer(s) available",
|
||||
"CountIndexersSelected": "{count} indexer(s) selected",
|
||||
"CurrentlyInstalled": "Currently Installed",
|
||||
"Custom": "Custom",
|
||||
"CustomFilter": "Custom Filter",
|
||||
"CustomFilters": "Custom Filters",
|
||||
@@ -281,6 +282,7 @@
|
||||
"External": "External",
|
||||
"ExternalUpdater": "{appName} is configured to use an external update mechanism",
|
||||
"Failed": "Failed",
|
||||
"FailedToFetchSettings": "Failed to fetch settings",
|
||||
"FailedToFetchUpdates": "Failed to fetch updates",
|
||||
"FeatureRequests": "Feature Requests",
|
||||
"Filename": "Filename",
|
||||
@@ -569,6 +571,7 @@
|
||||
"PreferMagnetUrl": "Prefer Magnet URL",
|
||||
"PreferMagnetUrlHelpText": "When enabled, this indexer will prefer the use of magnet URLs for grabs with fallback to torrent links",
|
||||
"Presets": "Presets",
|
||||
"PreviouslyInstalled": "Previously Installed",
|
||||
"Priority": "Priority",
|
||||
"PrioritySettings": "Priority: {priority}",
|
||||
"Privacy": "Privacy",
|
||||
@@ -705,7 +708,7 @@
|
||||
"SyncProfile": "Sync Profile",
|
||||
"SyncProfiles": "Sync Profiles",
|
||||
"System": "System",
|
||||
"SystemTimeCheckMessage": "System time is off by more than 1 day. Scheduled tasks may not run correctly until the time is corrected",
|
||||
"SystemTimeHealthCheckMessage": "System time is off by more than 1 day. Scheduled tasks may not run correctly until the time is corrected",
|
||||
"TVSearchTypes": "TV Search Types",
|
||||
"TableOptions": "Table Options",
|
||||
"TableOptionsColumnsMessage": "Choose which columns are visible and which order they appear in",
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
"Scheduled": "Programado",
|
||||
"SaveChanges": "Guardar cambios",
|
||||
"RestoreBackup": "Restaurar copia de seguridad",
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "Las versión {0} no es una versión válida de {appName}, no recibirás actualizaciones",
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "La rama {0} no es una rama de lanzamiento válida de {appName}, no recibirás actualizaciones",
|
||||
"Refresh": "Actualizar",
|
||||
"Queue": "Cola",
|
||||
"ProxyResolveIpHealthCheckMessage": "No se pudo resolver la dirección IP del Host Proxy configurado {proxyHostName}",
|
||||
@@ -73,7 +73,7 @@
|
||||
"LastWriteTime": "Última Fecha de Escritura",
|
||||
"IndexerStatusUnavailableHealthCheckMessage": "Indexadores no disponibles debido a errores: {indexerNames}",
|
||||
"Indexer": "Indexador",
|
||||
"Grabbed": "Añadido",
|
||||
"Grabbed": "Capturado",
|
||||
"GeneralSettingsSummary": "Puerto, SSL, nombre de usuario/contraseña , proxy, analíticas, y actualizaciones",
|
||||
"Filename": "Nombre de archivo",
|
||||
"Failed": "Fallido",
|
||||
@@ -99,7 +99,7 @@
|
||||
"Peers": "Pares",
|
||||
"PageSize": "Tamaño de Página",
|
||||
"Ok": "Ok",
|
||||
"OAuthPopupMessage": "Pop-ups bloqueados por su navegador",
|
||||
"OAuthPopupMessage": "Los elementos emergentes están siendo bloqueados por tu navegador",
|
||||
"Name": "Nombre",
|
||||
"Message": "Mensaje",
|
||||
"Level": "Nivel",
|
||||
@@ -114,7 +114,7 @@
|
||||
"Cancel": "Cancelar",
|
||||
"Apply": "Aplicar",
|
||||
"Age": "Antigüedad",
|
||||
"SystemTimeCheckMessage": "El reloj del sistema está retrasado más de un día. Las tareas de mantenimiento no se ejecutarán correctamente hasta que se haya corregido",
|
||||
"SystemTimeHealthCheckMessage": "El reloj del sistema está retrasado más de un día. Las tareas de mantenimiento no se ejecutarán correctamente hasta que se haya corregido",
|
||||
"UnsavedChanges": "Cambios sin guardar",
|
||||
"ShowSearchHelpText": "Muestra el botón de búsqueda al pasar por encima",
|
||||
"ShowSearch": "Mostrar búsqueda",
|
||||
@@ -135,7 +135,7 @@
|
||||
"DownloadClientSettings": "Opciones del cliente de descarga",
|
||||
"Docker": "Docker",
|
||||
"DeleteTag": "Eliminar Etiqueta",
|
||||
"DeleteNotification": "Borrar Notificacion",
|
||||
"DeleteNotification": "Eliminar Notificación",
|
||||
"DeleteDownloadClient": "Borrar cliente de descarga",
|
||||
"DeleteBackup": "Eliminar copia de seguridad",
|
||||
"DatabaseMigration": "Migración de la base de datos",
|
||||
@@ -143,7 +143,7 @@
|
||||
"ClientPriority": "Prioridad del Cliente",
|
||||
"ChangeHasNotBeenSavedYet": "El cambio aún no se ha guardado",
|
||||
"CertificateValidationHelpText": "Cambiar la rigidez de la validación de la certificación HTTPS",
|
||||
"CertificateValidation": "Validacion de certificado",
|
||||
"CertificateValidation": "Validación de certificado",
|
||||
"BypassProxyForLocalAddresses": "Omitir Proxy para Direcciones Locales",
|
||||
"Branch": "Rama",
|
||||
"BindAddressHelpText": "Dirección IP4 válida, localhost o '*' para todas las interfaces",
|
||||
@@ -171,7 +171,7 @@
|
||||
"UpdateAutomaticallyHelpText": "Descargar e instalar actualizaciones automáticamente. Todavía puedes instalar desde Sistema: Actualizaciones",
|
||||
"UnableToLoadTags": "No se pueden cargar las Etiquetas",
|
||||
"UnableToLoadNotifications": "No se pueden cargar las Notificaciones",
|
||||
"DownloadClientsLoadError": "No se puden cargar los gestores de descargas",
|
||||
"DownloadClientsLoadError": "No se pudieron cargar los clientes de descargas",
|
||||
"UISettings": "Ajustes del UI",
|
||||
"Torrents": "Torrents",
|
||||
"TestAllClients": "Probar todos los clientes",
|
||||
@@ -212,7 +212,7 @@
|
||||
"Mechanism": "Mecanismo",
|
||||
"Logs": "Registros",
|
||||
"LogLevel": "Nivel de Registro",
|
||||
"LaunchBrowserHelpText": " Abrir un navegador web e ir a la página de inicio de {appName} al arrancar la app.",
|
||||
"LaunchBrowserHelpText": " Abre un navegador web y navega a la página de inicio de {appName} al iniciarse la aplicación.",
|
||||
"Interval": "Intervalo",
|
||||
"IndexerFlags": "Indicadores del indexador",
|
||||
"IncludeHealthWarningsHelpText": "Incluir Alertas de Salud",
|
||||
@@ -236,12 +236,12 @@
|
||||
"ExistingTag": "Etiquetas existentes",
|
||||
"EnableInteractiveSearchHelpText": "Se usará cuando se utilice la búsqueda interactiva",
|
||||
"EnableAutomaticSearchHelpText": "Será usado cuando las búsquedas automáticas sean realizadas por la interfaz de usuario o por {appName}",
|
||||
"DeleteTagMessageText": "¿Está seguro de querer eliminar la etiqueta '{label}'?",
|
||||
"DeleteNotificationMessageText": "¿Seguro que quieres eliminar la notificación '{name}'?",
|
||||
"DeleteBackupMessageText": "Seguro que quieres eliminar la copia de seguridad '{name}'?",
|
||||
"DeleteDownloadClientMessageText": "Seguro que quieres eliminar el gestor de descargas '{name}'?",
|
||||
"CancelPendingTask": "Estas seguro de que deseas cancelar esta tarea pendiente?",
|
||||
"BranchUpdateMechanism": "La rama se uso por un mecanisco de actualizacion externo",
|
||||
"DeleteTagMessageText": "¿Estás seguro que quieres eliminar la etiqueta '{label}'?",
|
||||
"DeleteNotificationMessageText": "¿Estás seguro que quieres eliminar la notificación '{name}'?",
|
||||
"DeleteBackupMessageText": "¿Estás seguro que quieres eliminar la copia de seguridad '{name}'?",
|
||||
"DeleteDownloadClientMessageText": "¿Estás seguro que quieres eliminar el cliente de descarga '{name}'?",
|
||||
"CancelPendingTask": "¿Estás seguro que quieres cancelar esta tarea pendiente?",
|
||||
"BranchUpdateMechanism": "Rama usada por un mecanismo de actualización externo",
|
||||
"BranchUpdate": "Rama a usar para actualizar {appName}",
|
||||
"BeforeUpdate": "Antes de actualizar",
|
||||
"AddingTag": "Añadir etiqueta",
|
||||
@@ -261,7 +261,7 @@
|
||||
"NoTagsHaveBeenAddedYet": "Ninguna etiqueta ha sido añadida aún",
|
||||
"NoLogFiles": "No hay archivos de registro",
|
||||
"NoBackupsAreAvailable": "No hay copias de seguridad disponibles",
|
||||
"MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver historial de commits de Github para mas detalle",
|
||||
"MaintenanceRelease": "Lanzamiento de mantenimiento: Corrección de errores y otras mejoras. Ver el historial de commits de Github para más detalles",
|
||||
"ForMoreInformationOnTheIndividualDownloadClients": "Para más información individual de los gestores de descarga, haz clic en lls botones de información.",
|
||||
"FilterPlaceHolder": "Buscar Indexadores",
|
||||
"Exception": "Excepción",
|
||||
@@ -280,8 +280,8 @@
|
||||
"FocusSearchBox": "Enfocar Campo de Búsqueda",
|
||||
"SaveSettings": "Guardar ajustes",
|
||||
"OpenThisModal": "Abrir esta Ventana Modal",
|
||||
"MovieIndexScrollTop": "Indice de Películas: Desplazar hacia arriba",
|
||||
"MovieIndexScrollBottom": "Indice de Películas: Desplazar hacia abajo",
|
||||
"MovieIndexScrollTop": "Índice de Películas: Desplazar hacia arriba",
|
||||
"MovieIndexScrollBottom": "Índice de Películas: Desplazar hacia abajo",
|
||||
"CloseCurrentModal": "Cerrar esta Ventana Modal",
|
||||
"AcceptConfirmationModal": "Aceptar Confirmación de esta Ventana Modal",
|
||||
"IndexerLongTermStatusUnavailableHealthCheckMessage": "Indexadores no disponibles debido a errores durante más de 6 horas: {indexerNames}",
|
||||
@@ -398,7 +398,7 @@
|
||||
"EditSelectedDownloadClients": "Editar Clientes de Descarga Seleccionados",
|
||||
"EditSelectedIndexers": "Editar Indexadores Seleccionados",
|
||||
"Implementation": "Implementación",
|
||||
"ManageDownloadClients": "Gestionar Clientes de Descarga",
|
||||
"ManageDownloadClients": "Administrar Clientes de Descarga",
|
||||
"ApiKeyValidationHealthCheckMessage": "Actualice su clave de API para que tenga al menos {length} carácteres. Puede hacerlo en los ajustes o en el archivo de configuración",
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexadores con clientes de descarga inválidos: {indexerNames}.",
|
||||
"Episode": "Episodio",
|
||||
@@ -425,7 +425,7 @@
|
||||
"ResetAPIKeyMessageText": "¿Estás seguro que quieres restablecer tu clave API?",
|
||||
"EditIndexerProxyImplementation": "Editar proxy de indexador - {implementationName}",
|
||||
"AppUpdated": "{appName} Actualizado",
|
||||
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes, necesitará recargar {appName}",
|
||||
"AppUpdatedVersion": "{appName} ha sido actualizado a la versión `{version}`, para obtener los cambios más recientes tendrás que recargar {appName}",
|
||||
"AddApplicationImplementation": "Agregar aplicación - {implementationName}",
|
||||
"AddConnectionImplementation": "Añadir Conexión - {implementationName}",
|
||||
"AddIndexerImplementation": "Agregar Indexador - {implementationName}",
|
||||
@@ -493,9 +493,9 @@
|
||||
"EditCategory": "Editar categoría",
|
||||
"EditSyncProfile": "Editar perfil de sincronización",
|
||||
"EnableIndexer": "Habilitar indexador",
|
||||
"InvalidUILanguage": "Su interfaz de usuario está configurada en un idioma no válido, corríjalo y guarde la configuración",
|
||||
"InvalidUILanguage": "Tu interfaz de usuario está configurada en un idioma inválido, corrígelo y guarda la configuración",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Diseño del contenido",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si usar el diseño de contenido configurado de qBittorrent, el diseño original del torrent o siempre crear una subcarpeta (qBittorrent 4.3.2+)",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Si usa el diseño de contenido configurado de qBittorrent, el diseño original del torrent o siempre crea una subcarpeta (qBittorrent 4.3.2+)",
|
||||
"EnableRssHelpText": "Habilitar canal RSS para el Indexador",
|
||||
"days": "días",
|
||||
"ElapsedTime": "Tiempo transcurrido",
|
||||
@@ -517,7 +517,7 @@
|
||||
"IndexerTagsHelpTextWarning": "Las etiquetas deben utilizarse con precaución, ya que pueden tener efectos no deseados. Un indexador con una etiqueta solo se sincronizará con aplicaciones que tengan la misma etiqueta.",
|
||||
"TVSearchTypes": "Tipos de búsqueda de TV",
|
||||
"DownloadClientAriaSettingsDirectoryHelpText": "Ubicación opcional en la que poner las descargas, dejar en blanco para usar la ubicación de Aria2 predeterminada",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Los indexadores no tienen definición y no funcionarán: {0}. Por favor elimínelos y (o) vuelva a añadirlos a {appName}.",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Los indexadores no tienen definición y no funcionarán: {indexerNames}. Por favor elimínalos y (o) vuelve a añadirlos a {appName}.",
|
||||
"IndexerProxy": "Proxy del Indexador",
|
||||
"IndexerObsoleteCheckMessage": "Los indexadores están obsoletos o se han actualizado: {0}. Por favor elimínelos y (o) vuelva a añadirlos a {appName}",
|
||||
"IncludeManualGrabsHelpText": "Incluir las Capturas Manuales realizadas en {appName}",
|
||||
@@ -537,7 +537,7 @@
|
||||
"IndexerTagsHelpText": "Utilice etiquetas para especificar los Proxies del Indexador o las aplicaciones con las que se sincroniza el indexador.",
|
||||
"MassEditor": "Editor Masivo",
|
||||
"ApplicationsLoadError": "No se puede cargar la lista de aplicaciones",
|
||||
"ManageClients": "Gestionar Clientes",
|
||||
"ManageClients": "Administrar Clientes",
|
||||
"ManageApplications": "Gestionar Aplicaciones",
|
||||
"IndexerId": "ID del Indexador",
|
||||
"IndexerInfo": "Información del Indexador",
|
||||
@@ -609,10 +609,10 @@
|
||||
"Url": "Url",
|
||||
"VipExpiration": "Expiración VIP",
|
||||
"TotalIndexerSuccessfulGrabs": "Capturas con Éxito Totales por Indexador",
|
||||
"NotificationsEmailSettingsUseEncryptionHelpText": "Si prefiere utilizar el cifrado si está configurado en el servidor, utilizar siempre el cifrado mediante SSL (sólo puerto 465) o StartTLS (cualquier otro puerto) o no utilizar nunca el cifrado",
|
||||
"NotificationsEmailSettingsUseEncryptionHelpText": "Si prefiere utilizar el cifrado si está configurado en el servidor, utilizar siempre el cifrado mediante SSL (sólo puerto 465) o StartTLS (cualquier otro puerto), o no utilizar nunca el cifrado",
|
||||
"IndexerHDBitsSettingsPasskeyHelpText": "Clave de acceso desde los Detalles de Usuario",
|
||||
"IndexerSettingsPasskey": "Clave de Acceso",
|
||||
"BlackholeFolderHelpText": "La carpeta en donde {appName} se almacenaran los {extension} file",
|
||||
"BlackholeFolderHelpText": "La carpeta donde {appName} almacenará los archivos {extension}",
|
||||
"CustomFilter": "Filtro personalizado",
|
||||
"LabelIsRequired": "Se requiere etiqueta",
|
||||
"TorrentBlackholeSaveMagnetFiles": "Guardar archivos magnet",
|
||||
@@ -771,7 +771,7 @@
|
||||
"AverageGrabs": "Promedio de capturas",
|
||||
"AllSearchResultsHiddenByFilter": "Todos los resultados están ocultos por el filtro aplicado.",
|
||||
"PackageVersionInfo": "{packageVersion} por {packageAuthor}",
|
||||
"HealthMessagesInfoBox": "Puedes encontrar más información sobre la causa de estos mensajes de comprobación de salud haciendo clic en el enlace wiki (icono de libro) al final de la fila, o comprobando tus [registros]({link}). Si tienes dificultades para interpretar estos mensajes, puedes ponerte en contacto con nuestro soporte en los enlaces que aparecen a continuación.",
|
||||
"HealthMessagesInfoBox": "Puedes encontrar más información sobre la causa de estos mensajes de comprobación de salud haciendo clic en el enlace wiki (icono de libro) al final de la fila, o comprobando tus [registros]({link}). Si tienes dificultades para interpretar estos mensajes, puedes ponerte en contacto con nuestro soporte en los enlaces que aparecen abajo.",
|
||||
"LogSizeLimit": "Límite de tamaño de registro",
|
||||
"LogSizeLimitHelpText": "Máximo tamaño de archivo de registro en MB antes de archivarlo. Predeterminado es 1MB.",
|
||||
"PreferMagnetUrl": "Preferir URL magnet",
|
||||
@@ -798,10 +798,13 @@
|
||||
"UpdateAppDirectlyLoadError": "No se pudo actualizar {appName} directamente,",
|
||||
"UpdaterLogFiles": "Actualizador de archivos de registro",
|
||||
"WouldYouLikeToRestoreBackup": "Te gustaria restaurar la copia de seguridad '{name}'?",
|
||||
"AptUpdater": "Use apt para instalar la actualización",
|
||||
"AptUpdater": "Usa apt para instalar la actualización",
|
||||
"Install": "Instalar",
|
||||
"InstallLatest": "Instala el último",
|
||||
"InstallMajorVersionUpdateMessage": "Esta actualización instalará una nueva versión principal y podría no ser compatible con tu sistema. ¿Estás seguro que quieres instalar esta actualización?",
|
||||
"InstallMajorVersionUpdate": "Instalar actualización",
|
||||
"InstallMajorVersionUpdateMessageLink": "Por favor revisa [{domain}]({url}) para más información."
|
||||
"InstallMajorVersionUpdateMessageLink": "Por favor revisa [{domain}]({url}) para más información.",
|
||||
"FailedToFetchSettings": "Error al recuperar la configuración",
|
||||
"CurrentlyInstalled": "Actualmente instalado",
|
||||
"PreviouslyInstalled": "Previamente instalado"
|
||||
}
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
"Security": "Suojaus",
|
||||
"SuggestTranslationChange": "Ehdota käännösmuutosta",
|
||||
"System": "Järjestelmä",
|
||||
"SystemTimeCheckMessage": "Järjestelmän ajassa on ainakin vuorokauden heitto eivätkä ajoitetut tehtävät tämän vuoksi toimi oikein ennen kuin se on korjattu.",
|
||||
"SystemTimeHealthCheckMessage": "Järjestelmän ajassa on ainakin vuorokauden heitto eivätkä ajoitetut tehtävät tämän vuoksi toimi oikein ennen kuin se on korjattu.",
|
||||
"TagCannotBeDeletedWhileInUse": "Tunnistetta ei voi poistaa, koska se on käytössä",
|
||||
"TagIsNotUsedAndCanBeDeleted": "Tunnistetta ei ole määritetty millekään kohteelle, joten sen voi poistaa.",
|
||||
"TagsSettingsSummary": "Täältä näet kaikki tunnisteet käyttökohteineen ja voit poistaa käyttämättömät tunnisteet.",
|
||||
@@ -405,7 +405,7 @@
|
||||
"ApplicationsLoadError": "Sovelluslistausta ei voitu ladata",
|
||||
"Url": "URL",
|
||||
"Website": "Verkkosivusto",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Tietolähteillä ei ole määritystä, eivätkä ne toimi: {0}. Poista ja/tai lisää {appName}iin uudelleen",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Tietolähteillä ei ole määritystä, eivätkä ne toimi: {indexerNames}. Poista ja/tai lisää {appName}iin uudelleen",
|
||||
"Private": "Yksityinen",
|
||||
"QueryResults": "Kyselyn tulokset",
|
||||
"Application": "Sovellus",
|
||||
@@ -714,5 +714,8 @@
|
||||
"UpdateAppDirectlyLoadError": "{appName}ia ei voida päivittää suoraan,",
|
||||
"UpdaterLogFiles": "Päivittäjän lokitiedostot",
|
||||
"WouldYouLikeToRestoreBackup": "Haluatko palauttaa varmuuskopion \"{name}\"?",
|
||||
"InstallLatest": "Asenna uusin"
|
||||
"InstallLatest": "Asenna uusin",
|
||||
"CurrentlyInstalled": "Nykyinen asennettu versio",
|
||||
"PreviouslyInstalled": "Edellinen asennettu versio",
|
||||
"Mixed": "Korjattu"
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
"Level": "Niveau",
|
||||
"KeyboardShortcuts": "Raccourcis clavier",
|
||||
"NoIssuesWithYourConfiguration": "Aucun problème avec votre configuration",
|
||||
"SystemTimeCheckMessage": "L'heure du système est décalée de plus d'un jour. Les tâches planifiées peuvent ne pas s'exécuter correctement tant que l'heure ne sera pas corrigée",
|
||||
"SystemTimeHealthCheckMessage": "L'heure du système est décalée de plus d'un jour. Les tâches planifiées peuvent ne pas s'exécuter correctement tant que l'heure ne sera pas corrigée",
|
||||
"SettingsShowRelativeDates": "Afficher les dates relatives",
|
||||
"UnsavedChanges": "Modifications non enregistrées",
|
||||
"ShowSearchHelpText": "Afficher le bouton de recherche au survol",
|
||||
@@ -794,5 +794,13 @@
|
||||
"InstallLatest": "Installer la dernière",
|
||||
"InstallMajorVersionUpdateMessageLink": "Veuillez consulter [{domain}]({url}) pour plus d'informations.",
|
||||
"InstallMajorVersionUpdate": "Installer la mise à jour",
|
||||
"InstallMajorVersionUpdateMessage": "Cette mise à jour installera une nouvelle version majeure et pourrait ne pas être compatible avec votre système. Êtes-vous sûr de vouloir installer cette mise à jour ?"
|
||||
"InstallMajorVersionUpdateMessage": "Cette mise à jour installera une nouvelle version majeure et pourrait ne pas être compatible avec votre système. Êtes-vous sûr de vouloir installer cette mise à jour ?",
|
||||
"FailedToFetchSettings": "Échec de la récupération des paramètres",
|
||||
"IndexerSettingsPreferMagnetUrlHelpText": "Si activé, cet indexeur privilégiera si possible l'usage de liens de type magnet aux liens torrent",
|
||||
"PreferMagnetUrl": "Privilégier les liens de type magnet",
|
||||
"IndexerAvistazSettingsPidHelpText": "PID de la page Mon compte ou Mon profil",
|
||||
"IndexerAvistazSettingsPasswordHelpText": "Mot de passe du site",
|
||||
"PreferMagnetUrlHelpText": "Si activé, cet indexeur privilégiera si possible l'usage de liens de type magnet aux liens torrent",
|
||||
"PreviouslyInstalled": "Installé précédemment",
|
||||
"CurrentlyInstalled": "Actuellement installé"
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
"SettingsShowRelativeDates": "הצג תאריכים יחסית",
|
||||
"SuggestTranslationChange": "הצע שינוי בתרגום",
|
||||
"System": "מערכת",
|
||||
"SystemTimeCheckMessage": "זמן המערכת אינו פעיל יותר מיום אחד. משימות מתוזמנות עשויות שלא לפעול כראוי עד לתיקון הזמן",
|
||||
"SystemTimeHealthCheckMessage": "זמן המערכת אינו פעיל יותר מיום אחד. משימות מתוזמנות עשויות שלא לפעול כראוי עד לתיקון הזמן",
|
||||
"TableOptionsColumnsMessage": "בחר אילו עמודות גלויות ובאיזה סדר הן יופיעו",
|
||||
"TagCannotBeDeletedWhileInUse": "לא ניתן למחוק בזמן השימוש",
|
||||
"TagIsNotUsedAndCanBeDeleted": "לא משתמשים בתג וניתן למחוק אותו",
|
||||
@@ -427,5 +427,10 @@
|
||||
"ExternalUpdater": "{appName} מוגדר להשתמש במנגנון עדכון חיצוני",
|
||||
"RestartReloadNote": "הערה: {appName} יופעל מחדש אוטומטית וטען מחדש את ממשק המשתמש במהלך תהליך השחזור.",
|
||||
"UpdateAppDirectlyLoadError": "לא ניתן לעדכן את {appName} ישירות,",
|
||||
"AptUpdater": "השתמש ב- apt כדי להתקין את העדכון"
|
||||
"AptUpdater": "השתמש ב- apt כדי להתקין את העדכון",
|
||||
"Clone": "סגור",
|
||||
"CurrentlyInstalled": "מותקן כעת",
|
||||
"Stats": "סטָטוּס",
|
||||
"Season": "סיבה",
|
||||
"Mixed": "תוקן"
|
||||
}
|
||||
|
||||
@@ -154,7 +154,7 @@
|
||||
"Source": "स्रोत",
|
||||
"StartupDirectory": "स्टार्टअप निर्देशिका",
|
||||
"SuggestTranslationChange": "अनुवाद परिवर्तन का सुझाव दें",
|
||||
"SystemTimeCheckMessage": "सिस्टम का समय 1 दिन से अधिक बंद है। जब तक समय सही नहीं होगा तब तक शेड्यूल किए गए कार्य सही तरीके से नहीं चल सकते हैं",
|
||||
"SystemTimeHealthCheckMessage": "सिस्टम का समय 1 दिन से अधिक बंद है। जब तक समय सही नहीं होगा तब तक शेड्यूल किए गए कार्य सही तरीके से नहीं चल सकते हैं",
|
||||
"TableOptionsColumnsMessage": "चुनें कि कौन से कॉलम दिखाई दे रहे हैं और वे किस क्रम में दिखाई देते हैं",
|
||||
"TagsSettingsSummary": "सभी टैग देखें और उनका उपयोग कैसे किया जाता है। अप्रयुक्त टैग को हटाया जा सकता है",
|
||||
"TestAll": "सभी का परीक्षण करें",
|
||||
@@ -368,5 +368,10 @@
|
||||
"NoEventsFound": "कोई घटना नहीं मिली",
|
||||
"RestartReloadNote": "नोट: रैडियर स्वचालित रूप से पुनः आरंभ करेगा और पुनर्स्थापना प्रक्रिया के दौरान UI को फिर से लोड करेगा।",
|
||||
"UpdateAppDirectlyLoadError": "सीधे {appName} अद्यतन करने में असमर्थ,",
|
||||
"InstallLatest": "नवीनतम स्थापित करें"
|
||||
"InstallLatest": "नवीनतम स्थापित करें",
|
||||
"Clone": "बंद करे",
|
||||
"CurrentlyInstalled": "वर्तमान में स्थापित है",
|
||||
"Mixed": "फिक्स्ड",
|
||||
"Season": "कारण",
|
||||
"Stats": "स्थिति"
|
||||
}
|
||||
|
||||
@@ -211,5 +211,6 @@
|
||||
"UnableToAddANewApplicationPleaseTryAgain": "Neuspješno dodavanje nove obavijesti, molimo pokušaj ponovno.",
|
||||
"EditApplicationImplementation": "Dodaj Vezu - {implementationName}",
|
||||
"AptUpdater": "Koristi apt kako bi instalirao ažuriranje",
|
||||
"EditIndexerProxyImplementation": "Dodaj Indexer - {implementationName}"
|
||||
"EditIndexerProxyImplementation": "Dodaj Indexer - {implementationName}",
|
||||
"Clone": "Zatvori"
|
||||
}
|
||||
|
||||
@@ -248,7 +248,7 @@
|
||||
"TagIsNotUsedAndCanBeDeleted": "A címke nincs használatban, törölhető",
|
||||
"TagCannotBeDeletedWhileInUse": "Használat közben nem törölhető",
|
||||
"TableOptionsColumnsMessage": "Válasszd ki, mely oszlopok legyenek láthatóak, és milyen sorrendben jelenjenek meg",
|
||||
"SystemTimeCheckMessage": "A rendszeridő több mint 1 napja nem frissült. Előfordulhat, hogy az ütemezett feladatok az idő kijavításáig nem futnak megfelelően",
|
||||
"SystemTimeHealthCheckMessage": "A rendszeridő több mint 1 napja nem frissült. Előfordulhat, hogy az ütemezett feladatok az idő kijavításáig nem futnak megfelelően",
|
||||
"IndexerStatusAllUnavailableHealthCheckMessage": "Az összes indexer elérhetetlen hiba miatt",
|
||||
"Indexers": "Indexerek",
|
||||
"IndexerPriorityHelpText": "Indexelő prioritás 1-től (legmagasabb) 50-ig (legalacsonyabb). Alapértelmezés: 25.",
|
||||
@@ -393,7 +393,7 @@
|
||||
"HistoryCleanupDaysHelpTextWarning": "A kiválasztott napszámnál régebbi előzmények automatikusan törlődnek",
|
||||
"IndexerAlreadySetup": "Az indexelő legalább egy példánya már be van állítva",
|
||||
"IndexerInfo": "Indexer információ",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Az indexereknek nincs definíciójuk, és nem működnek: {0}. Kérjük, távolítsa el és (vagy) adja hozzá újra a {appName}hoz",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Az indexereknek nincs definíciójuk, és nem működnek: {indexerNames}. Kérjük, távolítsa el és (vagy) adja hozzá újra a {appName}hoz",
|
||||
"MassEditor": "Tömeges szerkesztő",
|
||||
"OnApplicationUpdate": "Alkalmazásfrissítésről",
|
||||
"OnApplicationUpdateHelpText": "Alkalmazásfrissítésről",
|
||||
@@ -595,5 +595,7 @@
|
||||
"RestartReloadNote": "Megjegyzés: A {appName} automatikusan újraindítja és újratölti a felületet a visszaállítási folyamatban.",
|
||||
"UpdateAppDirectlyLoadError": "Nem lehetséges közvetlenül frissíteni a {appName}-t",
|
||||
"WouldYouLikeToRestoreBackup": "Szeretné visszaállítani a(z) „{name}” biztonsági másolatot?",
|
||||
"InstallLatest": "Legfrissebb telepítése"
|
||||
"InstallLatest": "Legfrissebb telepítése",
|
||||
"CurrentlyInstalled": "Jelenleg telepítve",
|
||||
"PreviouslyInstalled": "Korábban telepítve"
|
||||
}
|
||||
|
||||
@@ -86,5 +86,8 @@
|
||||
"IndexerHDBitsSettingsCodecs": "Codec",
|
||||
"ProxyValidationBadRequest": "Gagal menguji proxy. Kode Status: {statusCode}",
|
||||
"AllSearchResultsHiddenByFilter": "Seluruh hasil disembunyikan karena penyaringan yang diterapkan",
|
||||
"AptUpdater": "Gunakan apt untuk memasang pembaruan"
|
||||
"AptUpdater": "Gunakan apt untuk memasang pembaruan",
|
||||
"Clone": "Tutup",
|
||||
"EnableSSL": "Aktifkan RSS",
|
||||
"CurrentlyInstalled": "Saat Ini Terpasang"
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@
|
||||
"Details": "Upplýsingar",
|
||||
"PortNumber": "Portnúmer",
|
||||
"Uptime": "Spenntur",
|
||||
"SystemTimeCheckMessage": "Slökkt er á tíma kerfisins meira en 1 dag. Skipulögð verkefni ganga kannski ekki rétt fyrr en tíminn er leiðréttur",
|
||||
"SystemTimeHealthCheckMessage": "Slökkt er á tíma kerfisins meira en 1 dag. Skipulögð verkefni ganga kannski ekki rétt fyrr en tíminn er leiðréttur",
|
||||
"TableOptions": "Borðvalkostir",
|
||||
"TableOptionsColumnsMessage": "Veldu hvaða dálkar eru sýnilegir og í hvaða röð þeir birtast",
|
||||
"TagCannotBeDeletedWhileInUse": "Ekki er hægt að eyða meðan hún er í notkun",
|
||||
@@ -370,5 +370,10 @@
|
||||
"RestartReloadNote": "Athugið: {appName} mun sjálfkrafa endurræsa og endurhlaða notendaviðmiðið meðan á endurreisnarferlinu stendur.",
|
||||
"UpdateAppDirectlyLoadError": "Ekki er hægt að uppfæra {appName} beint,",
|
||||
"NoEventsFound": "Engir viðburðir fundust",
|
||||
"InstallLatest": "Settu upp nýjustu"
|
||||
"InstallLatest": "Settu upp nýjustu",
|
||||
"Clone": "Lokaðu",
|
||||
"CurrentlyInstalled": "Nú sett upp",
|
||||
"Stats": "Staða",
|
||||
"Mixed": "Fastur",
|
||||
"Season": "Ástæða"
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
"Test": "Prova",
|
||||
"TableOptionsColumnsMessage": "Scegli quali colonne rendere visibili ed il loro ordine",
|
||||
"TableOptions": "Opzioni Tabella",
|
||||
"SystemTimeCheckMessage": "L'orario di sistema è sbagliato di più di un giorno. Le attività pianificate potrebbero non essere eseguite correttamente fino alla correzione",
|
||||
"SystemTimeHealthCheckMessage": "L'orario di sistema è sbagliato di più di un giorno. Le attività pianificate potrebbero non essere eseguite correttamente fino alla correzione",
|
||||
"Source": "Fonte",
|
||||
"Shutdown": "Spegnimento",
|
||||
"Seeders": "Seeders",
|
||||
@@ -658,5 +658,8 @@
|
||||
"WouldYouLikeToRestoreBackup": "Vuoi ripristinare il backup '{name}'?",
|
||||
"UpdateAppDirectlyLoadError": "Impossibile aggiornare {appName} direttamente,",
|
||||
"AptUpdater": "Usa apt per installare l'aggiornamento",
|
||||
"InstallLatest": "Installa il più recente"
|
||||
"InstallLatest": "Installa il più recente",
|
||||
"CurrentlyInstalled": "Attualmente Installato",
|
||||
"PreviouslyInstalled": "Precedentemente Installato",
|
||||
"Mixed": "Fissato"
|
||||
}
|
||||
|
||||
@@ -195,7 +195,7 @@
|
||||
"Size": "サイズ",
|
||||
"Sort": "ソート",
|
||||
"SSLCertPath": "SSL証明書パス",
|
||||
"SystemTimeCheckMessage": "システム時刻が1日以上ずれています。スケジュールされたタスクは、時間が修正されるまで正しく実行されない場合があります",
|
||||
"SystemTimeHealthCheckMessage": "システム時刻が1日以上ずれています。スケジュールされたタスクは、時間が修正されるまで正しく実行されない場合があります",
|
||||
"Tags": "タグ",
|
||||
"TestAllClients": "すべてのクライアントをテストする",
|
||||
"Torrents": "トレント",
|
||||
@@ -370,5 +370,10 @@
|
||||
"RestartReloadNote": "注:{appName}は、復元プロセス中にUIを自動的に再起動して再読み込みします。",
|
||||
"UpdateAppDirectlyLoadError": "{appName}を直接更新できません。",
|
||||
"AptUpdater": "aptを使用してアップデートをインストールします",
|
||||
"InstallLatest": "最新のインストール"
|
||||
"InstallLatest": "最新のインストール",
|
||||
"Clone": "閉じる",
|
||||
"Mixed": "修繕",
|
||||
"CurrentlyInstalled": "現在インストール中",
|
||||
"Stats": "状態",
|
||||
"Season": "理由"
|
||||
}
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
"UpdateAutomaticallyHelpText": "업데이트를 자동으로 다운로드하고 설치합니다. 시스템 : 업데이트에서 계속 설치할 수 있습니다.",
|
||||
"RemoveFilter": "필터 제거",
|
||||
"Size": "크기",
|
||||
"AllIndexersHiddenDueToFilter": "적용된 필터로 인해 모든 영화가 숨겨집니다.",
|
||||
"AllIndexersHiddenDueToFilter": "적용된 필터로 인해 모든 인덱서가 숨겨집니다.",
|
||||
"Reset": "초기화",
|
||||
"Enable": "활성화",
|
||||
"Enabled": "활성화",
|
||||
@@ -310,7 +310,7 @@
|
||||
"Seeders": "시더",
|
||||
"SelectAll": "모두 선택",
|
||||
"ShowAdvanced": "고급보기",
|
||||
"SystemTimeCheckMessage": "시스템 시간이 1 일 이상 꺼져 있습니다. 예약 된 작업은 시간이 수정 될 때까지 올바르게 실행되지 않을 수 있습니다.",
|
||||
"SystemTimeHealthCheckMessage": "시스템 시간이 1 일 이상 꺼져 있습니다. 예약 된 작업은 시간이 수정 될 때까지 올바르게 실행되지 않을 수 있습니다.",
|
||||
"TableOptions": "테이블 옵션",
|
||||
"TableOptionsColumnsMessage": "표시되는 열과 표시되는 순서 선택",
|
||||
"TagsHelpText": "일치하는 태그가 하나 이상있는 영화에 적용됩니다.",
|
||||
@@ -322,7 +322,7 @@
|
||||
"GrabReleases": "그랩 릴리스",
|
||||
"NextExecution": "다음 실행",
|
||||
"ApplicationLongTermStatusCheckSingleClientMessage": "6 시간 이상 오류로 인해 인덱서를 사용할 수 없음 : {0}",
|
||||
"ApplicationLongTermStatusCheckAllClientMessage": "6 시간 이상 오류로 인해 모든 인덱서를 사용할 수 없습니다.",
|
||||
"ApplicationLongTermStatusCheckAllClientMessage": "6 시간 이상 오류로 인해 모든 어플리케이션을 사용할 수 없습니다.",
|
||||
"Ended": "종료",
|
||||
"LastDuration": "lastDuration",
|
||||
"LastExecution": "마지막 실행",
|
||||
@@ -367,5 +367,48 @@
|
||||
"ExternalUpdater": "{appName}는 외부 업데이트 메커니즘을 사용하도록 구성됩니다.",
|
||||
"RestartReloadNote": "참고 : {appName}는 복원 프로세스 중에 UI를 자동으로 다시 시작하고 다시로드합니다.",
|
||||
"UpdateAppDirectlyLoadError": "{appName}를 직접 업데이트 할 수 없습니다.",
|
||||
"AptUpdater": "apt를 사용하여 업데이트 설치"
|
||||
"AptUpdater": "apt를 사용하여 업데이트 설치",
|
||||
"ActiveIndexers": "활성 인덱서",
|
||||
"AddConnectionImplementation": "연결 추가 - {implementationName}",
|
||||
"AddIndexerImplementation": "인덱서 추가 - {implementationName}",
|
||||
"AddIndexerProxyImplementation": "인덱서 프록시 추가 - {implementationName}",
|
||||
"Any": "모두",
|
||||
"AppUpdatedVersion": "{appName}이 버전 `{version}`으로 업데이트되었습니다. 최신 변경 사항을 받으려면 {appName}을 다시 로드해야 합니다",
|
||||
"AddRemoveOnly": "추가 및 제거만",
|
||||
"AddToDownloadClient": "다운로드 클라이언트에 릴리스 추가",
|
||||
"AddedToDownloadClient": "클라이언트에 릴리스 추가됨",
|
||||
"AdvancedSettingsHiddenClickToShow": "고급 설정은 숨겨져 있으며, 표시하려면 클릭하세요",
|
||||
"AdvancedSettingsShownClickToHide": "고급 설정 표시, 숨기려면 클릭",
|
||||
"AddDownloadClientToProwlarr": "다운로드 클라이언트를 추가하면 {appName}이 수동 검색을 수행하는 동안 UI에서 직접 릴리스를 보낼 수 있습니다.",
|
||||
"AddApplication": "애플리케이션 추가",
|
||||
"AddCustomFilter": "커스텀 필터 추가",
|
||||
"AddIndexerProxy": "인덱서 프록시 추가",
|
||||
"AppUpdated": "{appName} 업데이트",
|
||||
"Application": "어플리케이션",
|
||||
"AppProfileInUse": "사용중인 앱 프로필",
|
||||
"AppSettingsSummary": "{appName}이 PVR 프로그램과 상호 작용하는 방식을 구성하기 위한 애플리케이션 및 설정",
|
||||
"AddNewIndexer": "새로운 인덱서 추가",
|
||||
"AddSyncProfile": "동기화 프로필 추가",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "동기화 중 차단 목록에 있는 토렌트 해시 거부",
|
||||
"AddApplicationImplementation": "애플리케이션 추가 - {implementationName}",
|
||||
"AddCategory": "카테고리 추가",
|
||||
"AddConnection": "연결 추가",
|
||||
"ActiveApps": "활성 앱",
|
||||
"AddDownloadClientImplementation": "다운로드 클라이언트 추가 - {implementationName}",
|
||||
"Album": "앨범",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "해시에 의해 토렌트가 차단된 경우 일부 인덱서의 RSS/검색 중에 토렌트가 제대로 거부되지 않을 수 있습니다. 이 기능을 활성화하면 토렌트를 가져온 후 클라이언트로 전송하기 전에 토렌트를 거부할 수 있습니다.",
|
||||
"ApiKeyValidationHealthCheckMessage": "API 키를 {length}자 이상으로 업데이트하세요. 설정 또는 구성 파일을 통해 이 작업을 수행할 수 있습니다.",
|
||||
"AppProfileSelectHelpText": "앱 프로필은 애플리케이션 동기화에서 RSS, 자동 검색 및 대화형 검색 설정을 제어하는 데 사용됩니다",
|
||||
"EditIndexerImplementation": "인덱서 추가 - {implementationName}",
|
||||
"EditDownloadClientImplementation": "다운로드 클라이언트 추가 - {implementationName}",
|
||||
"Clone": "닫기",
|
||||
"EditApplicationImplementation": "애플리케이션 추가 - {implementationName}",
|
||||
"Season": "이유",
|
||||
"EditConnectionImplementation": "연결 추가 - {implementationName}",
|
||||
"EditSyncProfile": "동기화 프로필 추가",
|
||||
"CurrentlyInstalled": "현재 설치됨",
|
||||
"Mixed": "결정된",
|
||||
"Stats": "상태",
|
||||
"Applications": "어플리케이션",
|
||||
"EditIndexerProxyImplementation": "인덱서 프록시 추가 - {implementationName}"
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@
|
||||
"ConnectionLostReconnect": "Radarr vil forsøke å koble til automatisk, eller du kan klikke oppdater nedenfor.",
|
||||
"ConnectionLostToBackend": "Radarr har mistet tilkoblingen til baksystemet og må lastes inn på nytt for å gjenopprette funksjonalitet.",
|
||||
"DeleteAppProfileMessageText": "Er du sikker på at du vil slette denne forsinkelsesprofilen?",
|
||||
"AddConnection": "Legg til kobling",
|
||||
"AddConnection": "Legg til tilkobling",
|
||||
"AuthBasic": "Grunnleggende (nettleser -popup)",
|
||||
"AuthForm": "Skjemaer (påloggingsside)",
|
||||
"DisabledForLocalAddresses": "Deaktivert for lokale adresser",
|
||||
@@ -158,5 +158,7 @@
|
||||
"BuiltIn": "Bygget inn",
|
||||
"AllSearchResultsHiddenByFilter": "Alle resultatene er skjult av det anvendte filteret",
|
||||
"AptUpdater": "Bruk apt til å installere oppdateringen",
|
||||
"Discord": "Discord"
|
||||
"Discord": "Discord",
|
||||
"AddCustomFilter": "Legg til eget filter",
|
||||
"Clone": "Lukk"
|
||||
}
|
||||
|
||||
@@ -350,7 +350,7 @@
|
||||
"SyncLevelAddRemove": "Alleen toevoegen en verwijderen: wanneer het wordt toegevoegd of verwijderd uit {appName}, wordt deze externe app bijgewerkt.",
|
||||
"SyncLevelFull": "Volledige synchronisatie: houdt deze app volledig gesynchroniseerd. Wijzigingen in {appName} worden vervolgens gesynchroniseerd met deze app. Elke wijziging die op afstand wordt aangebracht, wordt bij de volgende synchronisatie overschreven door {appName}.",
|
||||
"System": "Systeem",
|
||||
"SystemTimeCheckMessage": "De systeemtijd loopt verkeerd met meer dan 1 dag. Geplande taken worden mogelijk niet goed uitgevoerd tot dit is opgelost",
|
||||
"SystemTimeHealthCheckMessage": "De systeemtijd loopt verkeerd met meer dan 1 dag. Geplande taken worden mogelijk niet goed uitgevoerd tot dit is opgelost",
|
||||
"TableOptions": "Tabel Opties",
|
||||
"TableOptionsColumnsMessage": "Kies welke kolommen zichtbaar zijn en in welke volgorde",
|
||||
"TagCannotBeDeletedWhileInUse": "Kan niet verwijderd worden terwijl in gebruik",
|
||||
@@ -510,5 +510,7 @@
|
||||
"UpdateAppDirectlyLoadError": "Kan {appName} niet rechtstreeks updaten,",
|
||||
"WouldYouLikeToRestoreBackup": "Wilt u de back-up {name} herstellen?",
|
||||
"Download": "Downloaden",
|
||||
"InstallLatest": "Installeer Nieuwste Versie"
|
||||
"InstallLatest": "Installeer Nieuwste Versie",
|
||||
"CurrentlyInstalled": "Momenteel Geïnstalleerd",
|
||||
"Mixed": "Opgelost"
|
||||
}
|
||||
|
||||
@@ -240,7 +240,7 @@
|
||||
"StartupDirectory": "Katalog Startowy",
|
||||
"Status": "Status",
|
||||
"SuggestTranslationChange": "Zaproponuj zmianę tłumaczenia",
|
||||
"SystemTimeCheckMessage": "Czas systemowy jest wyłączony o więcej niż 1 dzień. Zaplanowane zadania mogą nie działać poprawnie, dopóki czas nie zostanie skorygowany",
|
||||
"SystemTimeHealthCheckMessage": "Czas systemowy jest wyłączony o więcej niż 1 dzień. Zaplanowane zadania mogą nie działać poprawnie, dopóki czas nie zostanie skorygowany",
|
||||
"Tags": "Tagi",
|
||||
"TagsHelpText": "Dotyczy filmów z co najmniej jednym pasującym tagiem",
|
||||
"TagsSettingsSummary": "Zobacz wszystkie tagi i sposób ich używania. Nieużywane tagi można usunąć",
|
||||
@@ -424,5 +424,9 @@
|
||||
"UpdateAppDirectlyLoadError": "Nie można bezpośrednio zaktualizować {appName},",
|
||||
"AptUpdater": "Użyj apt, aby zainstalować aktualizację",
|
||||
"DockerUpdater": "zaktualizuj kontener Dockera, aby otrzymać aktualizację",
|
||||
"InstallLatest": "Zainstaluj najnowsze"
|
||||
"InstallLatest": "Zainstaluj najnowsze",
|
||||
"Clone": "Zamknij",
|
||||
"Stats": "Status",
|
||||
"CurrentlyInstalled": "Aktualnie zainstalowane",
|
||||
"Mixed": "Naprawiony"
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
"Tags": "Etiquetas",
|
||||
"TableOptionsColumnsMessage": "Escolha quais colunas são visíveis e em qual ordem aparecem",
|
||||
"TableOptions": "Opções da tabela",
|
||||
"SystemTimeCheckMessage": "A hora do sistema está atrasada em mais de 1 dia. As tarefas agendadas podem não ocorrer corretamente até a hora ser corrigida",
|
||||
"SystemTimeHealthCheckMessage": "A hora do sistema está atrasada em mais de 1 dia. As tarefas agendadas podem não ocorrer corretamente até a hora ser corrigida",
|
||||
"System": "Sistema",
|
||||
"Style": "Estilo",
|
||||
"Status": "Estado",
|
||||
@@ -501,5 +501,7 @@
|
||||
"NoEventsFound": "Nenhum evento encontrado",
|
||||
"RestartReloadNote": "Nota: o {appName} reiniciará e recarregará automaticamente a IU durante o processo de restauração.",
|
||||
"UpdateAppDirectlyLoadError": "Não foi possível atualizar o {appName} diretamente,",
|
||||
"InstallLatest": "Instalar o mais recente"
|
||||
"InstallLatest": "Instalar o mais recente",
|
||||
"CurrentlyInstalled": "Atualmente instalado",
|
||||
"Mixed": "Corrigido"
|
||||
}
|
||||
|
||||
@@ -15,17 +15,17 @@
|
||||
"AddToDownloadClient": "Adicionar lançamento ao cliente de download",
|
||||
"Added": "Adicionado",
|
||||
"AddedToDownloadClient": "Lançamento adicionado ao cliente",
|
||||
"AddingTag": "Adicionar tag",
|
||||
"AddingTag": "Adicionar etiqueta",
|
||||
"Age": "Tempo de vida",
|
||||
"Album": "Álbum",
|
||||
"All": "Todos",
|
||||
"AllIndexersHiddenDueToFilter": "Todos os indexadores estão ocultos devido ao filtro aplicado.",
|
||||
"Analytics": "Análises",
|
||||
"AnalyticsEnabledHelpText": "Envie informações anônimas de uso e erro para os servidores do {appName}. Isso inclui informações sobre seu navegador, quais páginas da interface Web do {appName} você usa, relatórios de erros, e a versão do sistema operacional e do tempo de execução. Usaremos essas informações para priorizar recursos e correções de bugs.",
|
||||
"AnalyticsEnabledHelpText": "Envie informações anônimas de uso e erro para os servidores do {appName}. Isso inclui informações sobre seu navegador, quais páginas da interface Web do {appName} você usa, relatórios de erros, a versão do sistema operacional e do tempo de execução. Usaremos essas informações para priorizar recursos e correções de bugs.",
|
||||
"ApiKey": "Chave da API",
|
||||
"ApiKeyValidationHealthCheckMessage": "Atualize sua chave de API para ter pelo menos {length} caracteres. Você pode fazer isso através das configurações ou do arquivo de configuração",
|
||||
"AppDataDirectory": "Diretório AppData",
|
||||
"AppDataLocationHealthCheckMessage": "A atualização não será possível para evitar a exclusão de AppData na atualização",
|
||||
"AppDataLocationHealthCheckMessage": "A atualização não será possível para evitar a exclusão de AppData na Atualização",
|
||||
"AppProfileInUse": "Perfil de aplicativo em uso",
|
||||
"AppProfileSelectHelpText": "Os perfis de aplicativos são usados para controlar as configurações de RSS, Pesquisa automática e Pesquisa interativa ao sincronizar o aplicativo",
|
||||
"AppSettingsSummary": "Aplicativos e configurações para configurar como {appName} interage com seus programas PVR",
|
||||
@@ -38,7 +38,7 @@
|
||||
"ApplicationUrlHelpText": "A URL externa deste aplicativo, incluindo http(s)://, porta e URL base",
|
||||
"Applications": "Aplicativos",
|
||||
"Apply": "Aplicar",
|
||||
"ApplyTags": "Aplicar Tags",
|
||||
"ApplyTags": "Aplicar etiquetas",
|
||||
"Apps": "Aplicativos",
|
||||
"AreYouSureYouWantToDeleteCategory": "Tem certeza de que deseja excluir a categoria mapeada?",
|
||||
"Artist": "Artista",
|
||||
@@ -48,33 +48,33 @@
|
||||
"AuthenticationMethodHelpText": "Exigir nome de usuário e senha para acessar o {appName}",
|
||||
"AuthenticationRequired": "Autenticação exigida",
|
||||
"AuthenticationRequiredHelpText": "Altere para quais solicitações a autenticação é necessária. Não mude a menos que você entenda os riscos.",
|
||||
"AuthenticationRequiredWarning": "Para evitar o acesso remoto sem autenticação, {appName} agora exige que a autenticação esteja habilitada. Opcionalmente, você pode desabilitar a autenticação de endereços locais.",
|
||||
"AuthenticationRequiredWarning": "Para evitar o acesso remoto sem autenticação, o {appName} agora exige que a autenticação esteja habilitada. Opcionalmente, você pode desabilitar a autenticação para endereços locais.",
|
||||
"Author": "Autor",
|
||||
"Automatic": "Automático",
|
||||
"AutomaticSearch": "Pesquisa Automática",
|
||||
"AutomaticSearch": "Pesquisa automática",
|
||||
"AverageResponseTimesMs": "Tempos Médios de Resposta do Indexador (ms)",
|
||||
"Backup": "Backup",
|
||||
"BackupFolderHelpText": "Os caminhos relativos estarão no diretório AppData do {appName}",
|
||||
"BackupIntervalHelpText": "Intervalo entre backups automáticos",
|
||||
"BackupNow": "Fazer backup agora",
|
||||
"BackupRetentionHelpText": "Backups automáticos anteriores ao período de retenção serão limpos automaticamente",
|
||||
"BackupRetentionHelpText": "Backups automáticos anteriores ao período de retenção serão excluídos automaticamente",
|
||||
"Backups": "Backups",
|
||||
"BeforeUpdate": "Antes da atualização",
|
||||
"BindAddress": "Fixar endereço",
|
||||
"BindAddress": "Vincular endereço",
|
||||
"BindAddressHelpText": "Endereço IP válido, localhost ou '*' para todas as interfaces",
|
||||
"Book": "Livro",
|
||||
"BookSearch": "Pesquisar Livro",
|
||||
"BookSearchTypes": "Tipos de Pesquisa de Livros",
|
||||
"Branch": "Ramificação",
|
||||
"BranchUpdate": "Ramificação para atualização do {appName}",
|
||||
"BranchUpdate": "Ramificação para atualizar o {appName}",
|
||||
"BranchUpdateMechanism": "Ramificação usada pelo mecanismo externo de atualização",
|
||||
"BypassProxyForLocalAddresses": "Ignorar proxy para endereços locais",
|
||||
"Cancel": "Cancelar",
|
||||
"CancelPendingTask": "Tem certeza de que deseja cancelar essa tarefa pendente?",
|
||||
"CancelPendingTask": "Tem certeza de que deseja cancelar esta tarefa pendente?",
|
||||
"Categories": "Categorias",
|
||||
"Category": "Categoria",
|
||||
"CertificateValidation": "Validação de certificado",
|
||||
"CertificateValidationHelpText": "Alterar o quão estrita é a validação da certificação HTTPS",
|
||||
"CertificateValidationHelpText": "Alterar a rigidez da validação da certificação HTTPS",
|
||||
"ChangeHasNotBeenSavedYet": "A alteração ainda não foi salva",
|
||||
"Clear": "Limpar",
|
||||
"ClearHistory": "Limpar histórico",
|
||||
@@ -101,7 +101,7 @@
|
||||
"DeleteAppProfile": "Excluir perfil do aplicativo",
|
||||
"DeleteApplication": "Excluir aplicativo",
|
||||
"DeleteApplicationMessageText": "Tem certeza de que deseja excluir o aplicativo '{name}'?",
|
||||
"DeleteBackup": "Excluir Backup",
|
||||
"DeleteBackup": "Excluir backup",
|
||||
"DeleteBackupMessageText": "Tem certeza de que deseja excluir o backup '{name}'?",
|
||||
"DeleteClientCategory": "Excluir Categoria de Cliente de Download",
|
||||
"DeleteDownloadClient": "Excluir cliente de download",
|
||||
@@ -110,8 +110,8 @@
|
||||
"DeleteIndexerProxyMessageText": "Tem certeza de que deseja excluir o proxy do indexador '{name}'?",
|
||||
"DeleteNotification": "Excluir notificação",
|
||||
"DeleteNotificationMessageText": "Tem certeza de que deseja excluir a notificação '{name}'?",
|
||||
"DeleteTag": "Excluir Etiqueta",
|
||||
"DeleteTagMessageText": "Tem certeza de que deseja excluir a tag '{label}'?",
|
||||
"DeleteTag": "Excluir etiqueta",
|
||||
"DeleteTagMessageText": "Tem certeza de que deseja excluir a etiqueta '{label}'?",
|
||||
"Description": "Descrição",
|
||||
"Details": "Detalhes",
|
||||
"DevelopmentSettings": "Configurações de desenvolvimento",
|
||||
@@ -139,7 +139,7 @@
|
||||
"EnableInteractiveSearch": "Ativar pesquisa interativa",
|
||||
"EnableInteractiveSearchHelpText": "Será usado com a pesquisa interativa",
|
||||
"EnableRss": "Habilitar RSS",
|
||||
"EnableRssHelpText": "Habilitar feed RSS para indexador",
|
||||
"EnableRssHelpText": "Habilitar feed RSS para o indexador",
|
||||
"EnableSSL": "Habilitar SSL",
|
||||
"EnableSslHelpText": " Requer a reinicialização com a execução como administrador para fazer efeito",
|
||||
"Enabled": "Habilitado",
|
||||
@@ -163,7 +163,7 @@
|
||||
"Fixed": "Corrigido",
|
||||
"FocusSearchBox": "Selecionar a caixa de pesquisa",
|
||||
"Folder": "Pasta",
|
||||
"ForMoreInformationOnTheIndividualDownloadClients": "Para saber mais sobre cada cliente de download, clique nos botões de informações.",
|
||||
"ForMoreInformationOnTheIndividualDownloadClients": "Para saber mais sobre os clientes de download individuais, clique nos botões de informações.",
|
||||
"FullSync": "Sincronização completa",
|
||||
"General": "Geral",
|
||||
"GeneralSettings": "Configurações gerais",
|
||||
@@ -173,7 +173,7 @@
|
||||
"GrabTitle": "Obter Título",
|
||||
"Grabbed": "Obtido",
|
||||
"Grabs": "Obtenções",
|
||||
"Health": "Saúde",
|
||||
"Health": "Integridade",
|
||||
"NoIssuesWithYourConfiguration": "Nenhum problema com sua configuração",
|
||||
"HideAdvanced": "Ocultar opções avançadas",
|
||||
"History": "Histórico",
|
||||
@@ -195,7 +195,7 @@
|
||||
"IndexerDetails": "Detalhes do Indexador",
|
||||
"IndexerDisabled": "Indexador Desabilitado",
|
||||
"IndexerFailureRate": "Taxa de falha do indexador",
|
||||
"IndexerFlags": "Sinalizadores do Indexador",
|
||||
"IndexerFlags": "Sinalizadores do indexador",
|
||||
"IndexerHealthCheckNoIndexers": "Não há indexadores habilitados, o {appName} não retornará resultados para a pesquisa",
|
||||
"IndexerInfo": "Info do Indexador",
|
||||
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "Todos os indexadores estão indisponíveis devido a falhas por mais de 6 horas",
|
||||
@@ -204,7 +204,7 @@
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Os indexadores não têm definição e não funcionarão: {indexerNames}. Remova e (ou) adicione novamente ao {appName}.",
|
||||
"IndexerObsoleteCheckMessage": "Os seguintes indexadores são obsoletos ou foram atualizados: {0}. Remova-os e/ou adicione-os novamente ao {appName}",
|
||||
"IndexerPriority": "Prioridade do indexador",
|
||||
"IndexerPriorityHelpText": "Prioridade do Indexador de 1 (Mais Alta) a 50 (Mais Baixa). Padrão: 25.",
|
||||
"IndexerPriorityHelpText": "Prioridade do Indexador de 1 (mais alta) a 50 (mais baixa). Padrão: 25.",
|
||||
"IndexerProxies": "Proxies do Indexador",
|
||||
"IndexerProxy": "Proxy do Indexador",
|
||||
"IndexerProxyStatusAllUnavailableHealthCheckMessage": "Todos os proxies estão indisponíveis devido a falhas",
|
||||
@@ -225,23 +225,23 @@
|
||||
"InstanceNameHelpText": "Nome da instância na aba e para o nome do aplicativo Syslog",
|
||||
"InteractiveSearch": "Pesquisa interativa",
|
||||
"Interval": "Intervalo",
|
||||
"KeyboardShortcuts": "Atalhos do Teclado",
|
||||
"KeyboardShortcuts": "Atalhos do teclado",
|
||||
"Label": "Rótulo",
|
||||
"Language": "Idioma",
|
||||
"LastDuration": "Última Duração",
|
||||
"LastExecution": "Última Execução",
|
||||
"LastDuration": "Última duração",
|
||||
"LastExecution": "Última execução",
|
||||
"LastFailure": "Última Falha",
|
||||
"LastWriteTime": "Hora da Última Gravação",
|
||||
"LaunchBrowserHelpText": " Abrir o navegador Web e navegar até a página inicial do {appName} ao iniciar o aplicativo.",
|
||||
"LastWriteTime": "Hora da última gravação",
|
||||
"LaunchBrowserHelpText": " Abrir um navegador e navegar até a página inicial do {appName} ao iniciar o aplicativo.",
|
||||
"Level": "Nível",
|
||||
"Link": "Link",
|
||||
"LogFiles": "Arquivos de registro",
|
||||
"LogLevel": "Nível de registro",
|
||||
"LogLevelTraceHelpTextWarning": "O registro em log deve ser habilitado apenas temporariamente",
|
||||
"LogFiles": "Arquivos de log",
|
||||
"LogLevel": "Nível de registro em log",
|
||||
"LogLevelTraceHelpTextWarning": "O registro em log para rastreamento deve ser habilitado apenas temporariamente",
|
||||
"Logging": "Registro em log",
|
||||
"Logs": "Registros",
|
||||
"Logs": "Logs",
|
||||
"MIA": "Ausentes",
|
||||
"MaintenanceRelease": "Versão de manutenção: correções de bugs e outros aprimoramentos. Consulte o Histórico de Commit do Github para obter mais detalhes",
|
||||
"MaintenanceRelease": "Versão de manutenção: correções de bugs e outras melhorias. Consulte o Histórico de commit do Github para saber mais",
|
||||
"Manual": "Manual",
|
||||
"MappedCategories": "Categorias Mapeadas",
|
||||
"MappedDrivesRunningAsService": "As unidades de rede mapeadas não estão disponíveis quando executadas como um serviço do Windows. Consulte as Perguntas frequentes para saber mais",
|
||||
@@ -414,7 +414,7 @@
|
||||
"SyncProfile": "Perfil de Sincronização",
|
||||
"SyncProfiles": "Perfis de Sincronização",
|
||||
"System": "Sistema",
|
||||
"SystemTimeCheckMessage": "A hora do sistema está desligada por mais de 1 dia. Tarefas agendadas podem não ser executadas corretamente até que o horário seja corrigido",
|
||||
"SystemTimeHealthCheckMessage": "A hora do sistema está desligada por mais de 1 dia. Tarefas agendadas podem não ser executadas corretamente até que o horário seja corrigido",
|
||||
"TVSearchTypes": "Tipos de Pesquisa de Seriados",
|
||||
"TableOptions": "Opções de Tabela",
|
||||
"TableOptionsColumnsMessage": "Escolha quais colunas são visíveis e em que ordem aparecem",
|
||||
@@ -499,20 +499,20 @@
|
||||
"Yes": "Sim",
|
||||
"YesCancel": "Sim, Cancelar",
|
||||
"Yesterday": "Ontem",
|
||||
"ApplyChanges": "Aplicar Mudanças",
|
||||
"ApplyChanges": "Aplicar mudanças",
|
||||
"ApplyTagsHelpTextAdd": "Adicionar: adicione as etiquetas à lista existente de etiquetas",
|
||||
"Implementation": "Implementação",
|
||||
"SelectIndexers": "Pesquisar indexadores",
|
||||
"ApplyTagsHelpTextHowToApplyApplications": "Como aplicar tags ao autor selecionado",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Como aplicar tags aos indexadores selecionados",
|
||||
"ApplyTagsHelpTextHowToApplyIndexers": "Como aplicar etiquetas aos indexadores selecionados",
|
||||
"ApplyTagsHelpTextRemove": "Remover: remove as etiquetas inseridas",
|
||||
"ApplyTagsHelpTextReplace": "Substituir: Substitua as etiquetas pelas etiquetas inseridas (não digite nenhuma etiqueta para limpar todas as etiquetas)",
|
||||
"ApplyTagsHelpTextReplace": "Substituir: substitui as etiquetas atuais pelas inseridas (deixe em branco para limpar todas as etiquetas)",
|
||||
"CountDownloadClientsSelected": "{count} cliente(s) de download selecionado(s)",
|
||||
"CountIndexersSelected": "{count} indexador(es) selecionado(s)",
|
||||
"DeleteSelectedApplicationsMessageText": "Tem certeza de que deseja excluir {count} aplicativos selecionados?",
|
||||
"DeleteSelectedDownloadClients": "Excluir cliente(s) de download",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Tem certeza de que deseja excluir {count} cliente(s) de download selecionado(s)?",
|
||||
"DeleteSelectedIndexersMessageText": "Tem certeza de que deseja excluir {count} indexadores selecionados?",
|
||||
"DeleteSelectedDownloadClientsMessageText": "Tem certeza de que deseja excluir o(s) {count} cliente(s) de download selecionado(s)?",
|
||||
"DeleteSelectedIndexersMessageText": "Tem certeza de que deseja excluir o(s) {count} indexador(es) selecionado(s)?",
|
||||
"DownloadClientPriorityHelpText": "Priorizar vários clientes de download. Usamos um rodízio para clientes com a mesma prioridade.",
|
||||
"EditSelectedDownloadClients": "Editar clientes de download selecionados",
|
||||
"EditSelectedIndexers": "Editar indexadores selecionados",
|
||||
@@ -531,7 +531,7 @@
|
||||
"FoundCountReleases": "Encontrou {itemCount} lançamentos",
|
||||
"DeleteSelectedIndexer": "Excluir indexador selecionado",
|
||||
"IndexerCategories": "Categorias do indexador",
|
||||
"IndexerDownloadClientHelpText": "Especifique qual cliente de download é usado para capturas feitas no {appName} a partir deste indexador",
|
||||
"IndexerDownloadClientHelpText": "Especifique qual cliente de download é usado para baixar deste indexador no {appName}",
|
||||
"IndexerStatus": "Status do indexador",
|
||||
"ManageApplications": "Gerenciar aplicativos",
|
||||
"NoHistoryFound": "Nenhum histórico encontrado",
|
||||
@@ -557,11 +557,11 @@
|
||||
"IndexerDownloadClientHealthCheckMessage": "Indexadores com clientes de download inválidos: {indexerNames}.",
|
||||
"DeleteAppProfileMessageText": "Tem certeza de que deseja excluir o perfil do aplicativo '{name}'?",
|
||||
"AppUpdated": "{appName} atualizado",
|
||||
"AppUpdatedVersion": "{appName} foi atualizado para a versão `{version}`, para obter as alterações mais recentes, você precisará recarregar {appName}",
|
||||
"ConnectionLostToBackend": "{appName} perdeu a conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.",
|
||||
"AppUpdatedVersion": "O {appName} foi atualizado para a versão `{version}`. Para obter as alterações mais recentes, recarregue o {appName}",
|
||||
"ConnectionLostToBackend": "O {appName} perdeu a conexão com o backend e precisará ser recarregado para restaurar a funcionalidade.",
|
||||
"RecentChanges": "Mudanças Recentes",
|
||||
"WhatsNew": "O que há de novo?",
|
||||
"ConnectionLostReconnect": "{appName} tentará se conectar automaticamente ou você pode clicar em recarregar abaixo.",
|
||||
"ConnectionLostReconnect": "O {appName} tentará se conectar automaticamente ou você pode clicar em Recarregar abaixo.",
|
||||
"AddApplicationImplementation": "Adicionar Aplicativo - {implementationName}",
|
||||
"AddConnectionImplementation": "Adicionar conexão - {implementationName}",
|
||||
"EditApplicationImplementation": "Editar Aplicativo - {implementationName}",
|
||||
@@ -601,12 +601,12 @@
|
||||
"NoIndexerCategories": "Nenhuma categoria encontrada para este indexador",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Confirme a nova senha",
|
||||
"PasswordConfirmation": "Confirmação Da Senha",
|
||||
"InvalidUILanguage": "Sua UI está definida com um idioma inválido, corrija-a e salve suas configurações",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Seja para usar o layout de conteúdo configurado do qBittorrent, o layout original do torrent ou sempre criar uma subpasta (qBittorrent 4.3.2+)",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Layout de Conteúdo",
|
||||
"InvalidUILanguage": "Sua interface está definida com um idioma inválido, corrija-o e salve suas configurações",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "Se devemos usar o layout de conteúdo configurado do qBittorrent, o layout original do torrent ou sempre criar uma subpasta (qBittorrent 4.3.2+)",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "Layout de conteúdo",
|
||||
"IndexerId": "ID do Indexador",
|
||||
"DownloadClientAriaSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local padrão do Aria2",
|
||||
"ManageClients": "Gerenciar Clientes",
|
||||
"ManageClients": "Gerenciar clientes",
|
||||
"NoApplicationsFound": "Nenhum aplicativo encontrado",
|
||||
"NotificationsEmailSettingsUseEncryptionHelpText": "Se preferir usar criptografia se configurado no servidor, usar sempre criptografia via SSL (somente porta 465) ou StartTLS (qualquer outra porta) ou nunca usar criptografia",
|
||||
"NotificationsEmailSettingsUseEncryption": "Usar Criptografia",
|
||||
@@ -683,54 +683,54 @@
|
||||
"IndexerSettingsQueryLimitHelpText": "O número máximo de consultas especificadas pela respectiva unidade que {appName} permitirá ao site",
|
||||
"IndexerSettingsSeedRatioHelpText": "A proporção que um torrent deve atingir antes de parar, vazio usa o padrão do cliente de download. A proporção deve ser de pelo menos 1,0 e seguir as regras dos indexadores",
|
||||
"DefaultCategory": "Categoria Padrão",
|
||||
"Destination": "Destinação",
|
||||
"Destination": "Destino",
|
||||
"Directory": "Diretório",
|
||||
"DownloadClientDelugeSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL json do deluge, consulte {url}",
|
||||
"DownloadClientFloodSettingsAdditionalTags": "Etiquetas Adicionais",
|
||||
"DownloadClientDelugeSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL do JSON do Deluge, consulte {url}",
|
||||
"DownloadClientFloodSettingsAdditionalTags": "Etiquetas adicionais",
|
||||
"DownloadClientFloodSettingsAdditionalTagsHelpText": "Adiciona propriedades de mídia como etiquetas. As dicas são exemplos.",
|
||||
"DownloadClientFloodSettingsUrlBaseHelpText": "Adiciona um prefixo à API Flood, como {url}",
|
||||
"DownloadClientFloodSettingsUrlBaseHelpText": "Adiciona um prefixo à API do Flood, como {url}",
|
||||
"DownloadClientFreeboxSettingsApiUrl": "URL da API",
|
||||
"DownloadClientFreeboxSettingsApiUrlHelpText": "Defina o URL base da API Freebox com a versão da API, por exemplo, '{url}', o padrão é '{defaultApiUrl}'",
|
||||
"DownloadClientFreeboxSettingsAppId": "ID do App",
|
||||
"DownloadClientFreeboxSettingsAppIdHelpText": "ID do aplicativo fornecido ao criar acesso à API Freebox (ou seja, 'app_id')",
|
||||
"DownloadClientFreeboxSettingsAppToken": "Token do App",
|
||||
"DownloadClientFreeboxSettingsPortHelpText": "Porta usada para acessar a interface do Freebox, o padrão é '{port}'",
|
||||
"DownloadClientNzbgetSettingsAddPausedHelpText": "Esta opção requer pelo menos NzbGet versão 16.0",
|
||||
"DownloadClientFreeboxSettingsApiUrlHelpText": "Defina o URL base da API do Freebox com a versão da API, por exemplo, \"{url}\", o padrão é \"{defaultApiUrl}\"",
|
||||
"DownloadClientFreeboxSettingsAppId": "ID do aplicativo",
|
||||
"DownloadClientFreeboxSettingsAppIdHelpText": "ID do aplicativo fornecida ao criar acesso à API do Freebox (ou seja, \"app_id\")",
|
||||
"DownloadClientFreeboxSettingsAppToken": "Token do aplicativo",
|
||||
"DownloadClientFreeboxSettingsPortHelpText": "Porta usada para acessar a interface do Freebox, o padrão é \"{port}\"",
|
||||
"DownloadClientNzbgetSettingsAddPausedHelpText": "Esta opção requer pelo menos a versão 16.0 do NzbGet",
|
||||
"DownloadClientPneumaticSettingsStrmFolder": "Pasta Strm",
|
||||
"DownloadClientPneumaticSettingsStrmFolderHelpText": "Os arquivos .strm nesta pasta serão importados pelo drone",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Primeiro e Último Primeiro",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrder": "Ordem Sequencial",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Baixe em ordem sequencial (qBittorrent 4.1.0+)",
|
||||
"DownloadClientQbittorrentSettingsUseSslHelpText": "Use uma conexão segura. Consulte Opções - UI da Web - 'Usar HTTPS em vez de HTTP' em qBittorrent.",
|
||||
"DownloadClientRTorrentSettingsAddStopped": "Adicionar Parado",
|
||||
"DownloadClientRTorrentSettingsAddStoppedHelpText": "Habilitando, irá adicionar torrents e magnets ao rTorrent em um estado parado. Isso pode quebrar os arquivos magnéticos.",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "Priorizar o primeiro e o último",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrder": "Ordem sequencial",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "Baixar em ordem sequencial (qBittorrent 4.1.0+)",
|
||||
"DownloadClientQbittorrentSettingsUseSslHelpText": "Usar uma conexão segura. Consulte Opções -> Interface de Usuário da Web -> \"Usar HTTPS ao invés do HTTP\" no qBittorrent.",
|
||||
"DownloadClientRTorrentSettingsAddStopped": "Adicionar parado",
|
||||
"DownloadClientRTorrentSettingsAddStoppedHelpText": "Habilitar esta opção adicionará os torrents e links magnéticos ao rTorrent em um estado parado. Isso pode quebrar os arquivos magnéticos.",
|
||||
"DownloadClientRTorrentSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local padrão do rTorrent",
|
||||
"DownloadClientRTorrentSettingsUrlPath": "Caminho da URL",
|
||||
"DownloadClientSettingsAddPaused": "Adicionar Pausado",
|
||||
"DownloadClientSettingsInitialState": "Estado Inicial",
|
||||
"DownloadClientSettingsInitialStateHelpText": "Estado inicial dos torrents adicionados a {clientName}",
|
||||
"DownloadClientRTorrentSettingsUrlPath": "Caminho do URL",
|
||||
"DownloadClientSettingsAddPaused": "Adicionar pausado",
|
||||
"DownloadClientSettingsInitialState": "Estado inicial",
|
||||
"DownloadClientSettingsInitialStateHelpText": "Estado inicial dos torrents adicionados ao {clientName}",
|
||||
"DownloadClientSettingsPriorityItemHelpText": "Prioridade de uso ao pegar itens",
|
||||
"DownloadClientSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL {clientName}, como {url}",
|
||||
"DownloadClientSettingsUseSslHelpText": "Use conexão segura ao conectar-se a {clientName}",
|
||||
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL rpc {clientName}, por exemplo, {url}, o padrão é '{defaultUrl}'",
|
||||
"DownloadClientSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL do {clientName}, como {url}",
|
||||
"DownloadClientSettingsUseSslHelpText": "Usar conexão segura ao conectar-se ao {clientName}",
|
||||
"DownloadClientTransmissionSettingsUrlBaseHelpText": "Adiciona um prefixo ao URL de chamada remota do {clientName}, por exemplo, {url}. O padrão é \"{defaultUrl}\"",
|
||||
"TorrentBlackholeSaveMagnetFilesExtension": "Salvar Arquivos Magnet com Extensão",
|
||||
"TorrentBlackholeTorrentFolder": "Pasta do Torrent",
|
||||
"UsenetBlackholeNzbFolder": "Pasta Nzb",
|
||||
"XmlRpcPath": "Caminho RPC XML",
|
||||
"BlackholeFolderHelpText": "Pasta na qual {appName} armazenará o arquivo {extension}",
|
||||
"BlackholeFolderHelpText": "Pasta na qual o {appName} armazenará o arquivo {extension}",
|
||||
"DownloadClientDownloadStationSettingsDirectoryHelpText": "Pasta compartilhada opcional para colocar downloads, deixe em branco para usar o local padrão do Download Station",
|
||||
"DownloadClientFloodSettingsTagsHelpText": "Etiquetas iniciais de um download. Para ser reconhecido, um download deve ter todas as etiquetas iniciais. Isso evita conflitos com downloads não relacionados.",
|
||||
"DownloadClientFreeboxSettingsAppTokenHelpText": "Token do aplicativo recuperado ao criar acesso à API Freebox (ou seja, 'app_token')",
|
||||
"DownloadClientFreeboxSettingsHostHelpText": "Nome do host ou endereço IP do host do Freebox, o padrão é '{url}' (só funcionará se estiver na mesma rede)",
|
||||
"DownloadClientFreeboxSettingsAppTokenHelpText": "Token do aplicativo recuperado ao criar acesso à API do Freebox (ou seja, \"app_token\")",
|
||||
"DownloadClientFreeboxSettingsHostHelpText": "Nome ou endereço IP do host do Freebox, o padrão é \"{url}\" (só funcionará se estiver na mesma rede)",
|
||||
"DownloadClientPneumaticSettingsNzbFolder": "Pasta Nzb",
|
||||
"DownloadClientPneumaticSettingsNzbFolderHelpText": "Esta pasta precisará estar acessível no XBMC",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Baixe a primeira e a última peças primeiro (qBittorrent 4.1.0+)",
|
||||
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Estado inicial para torrents adicionados ao qBittorrent. Observe que os Torrents Forçados não obedecem às restrições de semeação",
|
||||
"DownloadClientRTorrentSettingsUrlPathHelpText": "Caminho para o endpoint XMLRPC, consulte {url}. Geralmente é RPC2 ou [caminho para ruTorrent]{url2} ao usar o ruTorrent.",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "Baixe a primeira e a última partes antes (qBittorrent 4.1.0+)",
|
||||
"DownloadClientQbittorrentSettingsInitialStateHelpText": "Estado inicial para torrents adicionados ao qBittorrent. Observe que torrents forçados não obedecem às restrições de semeadura",
|
||||
"DownloadClientRTorrentSettingsUrlPathHelpText": "Caminho para o ponto de extremidade do XMLRPC, consulte {url}. Geralmente é RPC2 ou [caminho para ruTorrent]{url2} ao usar o ruTorrent.",
|
||||
"DownloadClientSettingsDefaultCategorySubFolderHelpText": "Categoria de reserva padrão se não existir nenhuma categoria mapeada para um lançamento. Adicionar uma categoria específica para {appName} evita conflitos com downloads não relacionados que não sejam de {appName}. Usar uma categoria é opcional, mas altamente recomendado. Cria um subdiretório [categoria] no diretório de saída.",
|
||||
"DownloadClientSettingsDefaultCategoryHelpText": "Categoria de reserva padrão se não existir nenhuma categoria mapeada para um lançamento. Adicionar uma categoria específica para {appName} evita conflitos com downloads não relacionados que não sejam de {appName}. Usar uma categoria é opcional, mas altamente recomendado.",
|
||||
"DownloadClientSettingsDestinationHelpText": "Especifica manualmente o destino do download, deixe em branco para usar o padrão",
|
||||
"DownloadClientTransmissionSettingsDirectoryHelpText": "Local opcional para colocar downloads, deixe em branco para usar o local de transmissão padrão",
|
||||
"DownloadClientTransmissionSettingsDirectoryHelpText": "Local opcional para colocar os downloads, deixe em branco para usar o local padrão do Transmission",
|
||||
"SecretToken": "Token Secreto",
|
||||
"TorrentBlackholeSaveMagnetFiles": "Salvar Arquivos Magnets",
|
||||
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "Extensão a ser usada para links magnet, o padrão é '.magnet'",
|
||||
@@ -744,7 +744,7 @@
|
||||
"Mixed": "Misturado",
|
||||
"Donate": "Doar",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "Sincronizar Lista de Bloqueio de Hashes de Torrents Rejeitados Enquanto Baixando",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "se um torrent for bloqueado por hash, ele pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "Se um torrent for bloqueado por hash, pode não ser rejeitado corretamente durante o RSS/Pesquisa de alguns indexadores. Ativar isso permitirá que ele seja rejeitado após o torrent ser capturado, mas antes de ser enviado ao cliente.",
|
||||
"ClickToChangeQueryOptions": "Clique para alterar as opções de consulta",
|
||||
"IndexerMTeamTpSettingsApiKeyHelpText": "Chave API do Site (Encontrada no Painel de Controle do Usuário => Segurança => Laboratório)",
|
||||
"IndexerMTeamTpSettingsFreeleechOnlyHelpText": "Pesquise apenas lançamentos freeleech",
|
||||
@@ -754,17 +754,17 @@
|
||||
"ProxyValidationBadRequest": "Falha ao testar o proxy. Código de status: {statusCode}",
|
||||
"ProxyValidationUnableToConnect": "Não foi possível conectar-se ao proxy: {exceptionMessage}. Verifique o log em torno deste erro para obter detalhes",
|
||||
"Default": "Padrão",
|
||||
"ManualGrab": "Baixar Manualmente",
|
||||
"ManualGrab": "Baixar manualmente",
|
||||
"Open": "Abrir",
|
||||
"OverrideAndAddToDownloadClient": "Substituir e adicionar ao cliente de download",
|
||||
"OverrideGrabModalTitle": "Substituir e Baixar - {title}",
|
||||
"PrioritySettings": "Prioridade: {priority}",
|
||||
"GrabRelease": "Baixar Lançamento",
|
||||
"GrabRelease": "Baixar lançamento",
|
||||
"SelectDownloadClientModalTitle": "{modalTitle} - Selecionar Cliente de Download",
|
||||
"Any": "Quaisquer",
|
||||
"Script": "Script",
|
||||
"BuiltIn": "Embutido",
|
||||
"InfoUrl": "URL da info",
|
||||
"InfoUrl": "URL de informações",
|
||||
"PublishedDate": "Data de Publicação",
|
||||
"Redirected": "Redirecionar",
|
||||
"AverageQueries": "Média de Consultas",
|
||||
@@ -786,7 +786,7 @@
|
||||
"IndexerAvistazSettingsPidHelpText": "PID da página Minha Conta ou Meu Perfil",
|
||||
"IndexerAvistazSettingsUsernameHelpTextWarning": "Somente membros com rank e acima podem usar a API neste indexador.",
|
||||
"RestartReloadNote": "Observação: o {appName} reiniciará automaticamente e recarregará a interface durante o processo de restauração.",
|
||||
"DockerUpdater": "Atualize o contêiner docker para receber a atualização",
|
||||
"DockerUpdater": "Atualize o contêiner do Docker para receber a atualização",
|
||||
"Download": "Baixar",
|
||||
"ErrorRestoringBackup": "Erro ao restaurar o backup",
|
||||
"ExternalUpdater": "O {appName} está configurado para usar um mecanismo de atualização externo",
|
||||
@@ -803,5 +803,8 @@
|
||||
"InstallLatest": "Instalar o mais recente",
|
||||
"InstallMajorVersionUpdate": "Instalar Atualização",
|
||||
"InstallMajorVersionUpdateMessage": "Esta atualização instalará uma nova versão principal e pode não ser compatível com o seu sistema. Tem certeza de que deseja instalar esta atualização?",
|
||||
"InstallMajorVersionUpdateMessageLink": "Verifique [{domain}]({url}) para obter mais informações."
|
||||
"InstallMajorVersionUpdateMessageLink": "Verifique [{domain}]({url}) para obter mais informações.",
|
||||
"FailedToFetchSettings": "Falha ao obter configurações",
|
||||
"CurrentlyInstalled": "Atualmente instalado",
|
||||
"PreviouslyInstalled": "Instalado anteriormente"
|
||||
}
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
"Tags": "Etichete",
|
||||
"TableOptionsColumnsMessage": "Alege ce coloane sunt vizibile și în ce ordine apar",
|
||||
"TableOptions": "Opțiuni tabel",
|
||||
"SystemTimeCheckMessage": "Ora sistemului este diferită cu mai mult de 1 zi. Operațiunile programate s-ar putea să nu funcționeze corect până când ora nu este corectată",
|
||||
"SystemTimeHealthCheckMessage": "Ora sistemului este diferită cu mai mult de 1 zi. Operațiunile programate s-ar putea să nu funcționeze corect până când ora nu este corectată",
|
||||
"System": "Sistem",
|
||||
"Style": "Stil",
|
||||
"Status": "Status",
|
||||
@@ -226,7 +226,7 @@
|
||||
"BackupRetentionHelpText": "Copiile de rezervă automate mai vechi decât perioada de păstrare vor fi curățate automat",
|
||||
"BindAddress": "Adresa de legare",
|
||||
"ChangeHasNotBeenSavedYet": "Modificarea nu a fost încă salvată",
|
||||
"CloneProfile": "Clonați profil",
|
||||
"CloneProfile": "Clonează Profil",
|
||||
"NoLeaveIt": "Nu, lasă-l",
|
||||
"DatabaseMigration": "Migrarea BD",
|
||||
"DeleteBackupMessageText": "Sigur doriți să ștergeți copia de siguranță „{0}”?",
|
||||
@@ -329,7 +329,7 @@
|
||||
"IndexerHealthCheckNoIndexers": "Niciun indexator nu este activat, {appName} nu va returna rezultate la căutare.",
|
||||
"IndexerProxy": "Proxy indexator",
|
||||
"IndexerVipExpiredHealthCheckMessage": "Beneficiile VIP pentru indexator au expirat: {indexerNames}",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Indexatorii nu au definiție și nu vor funcționa: {0}. Vă rugăm să-i ștergeți și (sau) să-i adăugați din nou în {appName}",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "Indexatorii nu au definiție și nu vor funcționa: {indexerNames}. Vă rugăm să-i ștergeți și (sau) să-i adăugați din nou în {appName}",
|
||||
"IndexerRss": "RSS indexator",
|
||||
"EnabledRedirected": "Activat, Redirecționat",
|
||||
"Ended": "Încheiat",
|
||||
@@ -486,5 +486,10 @@
|
||||
"NoEventsFound": "Nu s-au găsit evenimente",
|
||||
"RestartReloadNote": "Notă: {appName} va reporni și reîncărca automat interfața de utilizare în timpul procesului de restaurare.",
|
||||
"AptUpdater": "Utilizați apt pentru a instala actualizarea",
|
||||
"InstallLatest": "Instalați cel mai recent"
|
||||
"InstallLatest": "Instalați cel mai recent",
|
||||
"Clone": "Clonează",
|
||||
"Stats": "Status",
|
||||
"CurrentlyInstalled": "În prezent instalat",
|
||||
"Mixed": "Fix",
|
||||
"Season": "Motiv"
|
||||
}
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
"Level": "Уровень",
|
||||
"Ok": "Ок",
|
||||
"AddDownloadClient": "Добавить клиент загрузки",
|
||||
"UpdateMechanismHelpText": "Использовать встроенный инструмент обновления {appName} или скрипт.",
|
||||
"UpdateMechanismHelpText": "Использовать встроенный инструмент обновления {appName} или скрипт",
|
||||
"IndexerStatusUnavailableHealthCheckMessage": "Индексаторы недоступны из-за ошибок: {indexerNames}",
|
||||
"NoTagsHaveBeenAddedYet": "Теги ещё не добавлены",
|
||||
"UnableToLoadTags": "Не удалось загрузить теги",
|
||||
@@ -230,7 +230,7 @@
|
||||
"Status": "Статус",
|
||||
"Style": "Стиль",
|
||||
"SuggestTranslationChange": "Предложить изменение перевода",
|
||||
"SystemTimeCheckMessage": "Системное время отклонилось более чем на 1 день. Запланированные задания могут не работать правильно, пока время не будет исправлено",
|
||||
"SystemTimeHealthCheckMessage": "Системное время отклонилось более чем на 1 день. Запланированные задания могут не работать правильно, пока время не будет исправлено",
|
||||
"TableOptionsColumnsMessage": "Выберите видимые столбцы и порядок их отображения",
|
||||
"TagIsNotUsedAndCanBeDeleted": "Тег не используется и может быть удалён",
|
||||
"TagsHelpText": "Применяется к индексаторам, имеющим хотя бы один совпадающий тег",
|
||||
@@ -662,7 +662,7 @@
|
||||
"IndexerDetails": "Подробности индексатора",
|
||||
"EditCategory": "Редактировать категорию",
|
||||
"FoundCountReleases": "Найдено релизов: {itemCount}",
|
||||
"IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Искать только релизы freeleech",
|
||||
"IndexerAlphaRatioSettingsFreeleechOnlyHelpText": "Искать только релизы с freeleech",
|
||||
"IndexerBeyondHDSettingsLimitedOnly": "Только лимитированные",
|
||||
"IndexerBeyondHDSettingsRefundOnlyHelpText": "Искать только возвраты",
|
||||
"IndexerBeyondHDSettingsRewindOnlyHelpText": "Искать только повторы",
|
||||
@@ -677,7 +677,7 @@
|
||||
"NoIndexerCategories": "Нет категорий для этого индексатора",
|
||||
"IndexerVipExpiredHealthCheckMessage": "Привилегии VIP для индексатора истекли: {indexerNames}",
|
||||
"DefaultCategory": "Категория по умолчанию",
|
||||
"IndexerHDBitsSettingsFreeleechOnlyHelpText": "Показать только релизы freeleech",
|
||||
"IndexerHDBitsSettingsFreeleechOnlyHelpText": "Показать только релизы с freeleech",
|
||||
"IndexerHDBitsSettingsOrigins": "Источники",
|
||||
"IndexerNzbIndexSettingsApiKeyHelpText": "Ключ API сайта",
|
||||
"IndexerOrpheusSettingsApiKeyHelpText": "API ключ сайта (Находится в Настройки => Настройки доступа)",
|
||||
@@ -694,7 +694,7 @@
|
||||
"IndexerHDBitsSettingsUseFilenamesHelpText": "Выберите этот вариант, если хотите использовать имена файлов торрента в качестве названий релизов",
|
||||
"IndexerHDBitsSettingsUsernameHelpText": "Имя пользователя сайта",
|
||||
"IndexerSettingsCookieHelpText": "Cookie сайта",
|
||||
"IndexerSettingsFreeleechOnly": "Только Freeleech",
|
||||
"IndexerSettingsFreeleechOnly": "Только с freeleech",
|
||||
"IndexerSettingsPasskey": "Pass Key",
|
||||
"IndexerId": "ID индексатора",
|
||||
"DeleteSelectedIndexers": "Удалить выбранные индексаторы",
|
||||
@@ -748,7 +748,7 @@
|
||||
"DownloadClientSettingsPriorityItemHelpText": "Приоритет, используемый при захвате элементов",
|
||||
"GrabTitle": "Захватить название",
|
||||
"IndexerBeyondHDSettingsFreeleechOnlyHelpText": "Искать только релизы с freeleech",
|
||||
"IndexerBeyondHDSettingsLimitedOnlyHelpText": "Искать только freeleech (Лимитированная отдача)",
|
||||
"IndexerBeyondHDSettingsLimitedOnlyHelpText": "Искать только с freeleech (Лимитированная отдача)",
|
||||
"IndexerBeyondHDSettingsRefundOnly": "Только возврат",
|
||||
"IndexerBeyondHDSettingsRssKeyHelpText": "Ключ RSS с сайта (Находится в Моя безопасность => Ключ RSS)",
|
||||
"IndexerDownloadClientHelpText": "Определите клиент загрузки, используемый для загрузки из этого индексатора в {appName}.",
|
||||
@@ -787,7 +787,7 @@
|
||||
"IndexerAvistazSettingsUsernameHelpText": "Имя пользователя сайта",
|
||||
"AptUpdater": "Использовать apt для установки обновления",
|
||||
"Download": "Загрузить",
|
||||
"ErrorRestoringBackup": "Восстановить резервную копию",
|
||||
"ErrorRestoringBackup": "Ошибка восстановления резервной копии",
|
||||
"FailedToFetchUpdates": "Не удалось загрузить обновления",
|
||||
"LogFilesLocation": "Файлы журнала расположены в: {location}",
|
||||
"Logout": "Завершить сеанс",
|
||||
@@ -800,8 +800,11 @@
|
||||
"UpdaterLogFiles": "Файлы журнала обновления",
|
||||
"WouldYouLikeToRestoreBackup": "Хотите восстановить резервную копию '{name}'?",
|
||||
"Install": "Установить",
|
||||
"InstallLatest": "Установить последнюю версию",
|
||||
"InstallMajorVersionUpdateMessageLink": "Пожалуйста, проверьте [{domain}]({url}) для получения дополнительной информации.",
|
||||
"InstallLatest": "Установить последнюю",
|
||||
"InstallMajorVersionUpdateMessageLink": "Для получения дополнительной информации посетите [{domain}]({url}).",
|
||||
"InstallMajorVersionUpdate": "Установить обновление",
|
||||
"InstallMajorVersionUpdateMessage": "Это обновление установит новую основную версию и может быть несовместимо с вашей системой. Вы уверены, что хотите установить это обновление?"
|
||||
"InstallMajorVersionUpdateMessage": "Это обновление установит новую версию, которая может не поддерживаться вашей системой. Вы уверены, что хотите установить это обновление?",
|
||||
"FailedToFetchSettings": "Не удалось загрузить настройки",
|
||||
"CurrentlyInstalled": "Установлено",
|
||||
"PreviouslyInstalled": "Ранее установленный"
|
||||
}
|
||||
|
||||
@@ -147,5 +147,6 @@
|
||||
"BuiltIn": "Vstavaný",
|
||||
"AllSearchResultsHiddenByFilter": "Použitý filter skryje všetky výsledky",
|
||||
"AptUpdater": "Použiť apt pre inštaláciu aktualizácie",
|
||||
"Discord": "Discord"
|
||||
"Discord": "Discord",
|
||||
"Clone": "Zatvoriť"
|
||||
}
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
"Cancel": "Avbryt",
|
||||
"Apply": "TIllämpa",
|
||||
"Age": "Ålder",
|
||||
"SystemTimeCheckMessage": "Systemklockan går fel med mer än en dag. Schemalagda uppgifter kan få problem att köras innan tiden är korrigerad",
|
||||
"SystemTimeHealthCheckMessage": "Systemklockan går fel med mer än en dag. Schemalagda uppgifter kan få problem att köras innan tiden är korrigerad",
|
||||
"HomePage": "Hemsida",
|
||||
"IndexerPriority": "Indexerprioritet",
|
||||
"Reddit": "Reddit",
|
||||
@@ -458,5 +458,8 @@
|
||||
"AptUpdater": "Använd apt för att installera uppdateringen",
|
||||
"Download": "Ladda ner",
|
||||
"ExternalUpdater": "{appName} är konfigurerad för att använda en extern uppdateringsmekanism",
|
||||
"InstallLatest": "Installera senaste"
|
||||
"InstallLatest": "Installera senaste",
|
||||
"Clone": "Avsluta",
|
||||
"Mixed": "Fast",
|
||||
"CurrentlyInstalled": "För närvarande installerad"
|
||||
}
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
"ScriptPath": "เส้นทางสคริปต์",
|
||||
"Seeders": "Seeders",
|
||||
"SelectAll": "เลือกทั้งหมด",
|
||||
"SystemTimeCheckMessage": "เวลาของระบบปิดมากกว่า 1 วัน งานที่ตั้งเวลาไว้อาจทำงานไม่ถูกต้องจนกว่าจะมีการแก้ไขเวลา",
|
||||
"SystemTimeHealthCheckMessage": "เวลาของระบบปิดมากกว่า 1 วัน งานที่ตั้งเวลาไว้อาจทำงานไม่ถูกต้องจนกว่าจะมีการแก้ไขเวลา",
|
||||
"UnableToAddANewNotificationPleaseTryAgain": "ไม่สามารถเพิ่มการแจ้งเตือนใหม่โปรดลองอีกครั้ง",
|
||||
"BackupsLoadError": "ไม่สามารถโหลดข้อมูลสำรอง",
|
||||
"UnableToLoadNotifications": "ไม่สามารถโหลดการแจ้งเตือน",
|
||||
@@ -373,5 +373,10 @@
|
||||
"NoEventsFound": "ไม่พบกิจกรรม",
|
||||
"RestartReloadNote": "หมายเหตุ: {appName} จะรีสตาร์ทและโหลด UI ใหม่โดยอัตโนมัติในระหว่างกระบวนการกู้คืน",
|
||||
"UpdateAppDirectlyLoadError": "ไม่สามารถอัปเดต {appName} ได้โดยตรง",
|
||||
"InstallLatest": "ติดตั้งล่าสุด"
|
||||
"InstallLatest": "ติดตั้งล่าสุด",
|
||||
"Clone": "ปิด",
|
||||
"Mixed": "แก้ไขแล้ว",
|
||||
"Stats": "สถานะ",
|
||||
"CurrentlyInstalled": "ติดตั้งแล้ว",
|
||||
"Season": "เหตุผล"
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
"ReleaseStatus": "Yayın Durumu",
|
||||
"ReleaseBranchCheckOfficialBranchMessage": "{0} şubesi geçerli bir {appName} sürüm dalı değil; güncelleme almayacaksınız",
|
||||
"Refresh": "Yenile",
|
||||
"Queue": "Sırada",
|
||||
"Queue": "Kuyruk",
|
||||
"Protocol": "Protokol",
|
||||
"Options": "Seçenekler",
|
||||
"NoChanges": "Değişiklikler yok",
|
||||
@@ -226,7 +226,7 @@
|
||||
"StartTypingOrSelectAPathBelow": "Yazmaya başlayın veya aşağıdan bir yol seçin",
|
||||
"StartupDirectory": "Başlangıç Dizini",
|
||||
"SuggestTranslationChange": "Çeviri değişikliği önerin",
|
||||
"SystemTimeCheckMessage": "Sistem saati 1 günden fazla kapalı. Zamanlanan görevler, saat düzeltilene kadar doğru çalışmayabilir",
|
||||
"SystemTimeHealthCheckMessage": "Sistem saati 1 günden fazla kapalı. Zamanlanan görevler, saat düzeltilene kadar doğru çalışmayabilir",
|
||||
"TableOptionsColumnsMessage": "Hangi sütunların görünür olduğunu ve hangi sırada görüneceklerini seçin",
|
||||
"Title": "Başlık",
|
||||
"Today": "Bugün",
|
||||
@@ -259,7 +259,7 @@
|
||||
"Indexer": "Dizinleyici",
|
||||
"DownloadClientStatusAllClientHealthCheckMessage": "Hatalar nedeniyle tüm indirme istemcileri kullanılamıyor",
|
||||
"EditIndexer": "Dizinleyiciyi Düzenle",
|
||||
"Enable": "etkinleştirme",
|
||||
"Enable": "Etkinleştir",
|
||||
"EnableInteractiveSearch": "Etkileşimli Aramayı Etkinleştir",
|
||||
"EnableRss": "RSS'yi etkinleştir",
|
||||
"EnableSSL": "SSL'yi etkinleştir",
|
||||
@@ -537,7 +537,7 @@
|
||||
"PackageVersionInfo": "{packageAuthor} tarafından {packageVersion}",
|
||||
"LogSizeLimit": "Log Boyutu Sınırı",
|
||||
"LogSizeLimitHelpText": "Arşivlemeden önce MB cinsinden maksimum log dosya boyutu. Varsayılan 1 MB'tır.",
|
||||
"AptUpdater": "Güncellemeyi yüklemek için apt kullanın",
|
||||
"AptUpdater": "Güncellemeyi yüklemek için apt'ı kullanın",
|
||||
"Download": "İndir",
|
||||
"ErrorRestoringBackup": "Yedeği geri yüklerken hata",
|
||||
"ExternalUpdater": "{appName}, harici bir güncelleme mekanizması kullanacak şekilde yapılandırıldı",
|
||||
@@ -551,5 +551,15 @@
|
||||
"Logout": "Çıkış",
|
||||
"UpdaterLogFiles": "Güncelleme Günlük Dosyaları",
|
||||
"WouldYouLikeToRestoreBackup": "'{name}' yedeğini geri yüklemek ister misiniz?",
|
||||
"InstallLatest": "En Sonu Yükle"
|
||||
"InstallLatest": "En Sonu Yükle",
|
||||
"Install": "Kur",
|
||||
"InstallMajorVersionUpdate": "Güncellemeyi Kur",
|
||||
"InstallMajorVersionUpdateMessage": "Bu güncelleştirme yeni bir ana sürüm yükleyecek ve sisteminizle uyumlu olmayabilir. Bu güncelleştirmeyi yüklemek istediğinizden emin misiniz?",
|
||||
"InstallMajorVersionUpdateMessageLink": "Daha fazla bilgi için lütfen [{domain}]({url}) adresini kontrol edin.",
|
||||
"Season": "Sezon",
|
||||
"Artist": "sanatçı",
|
||||
"Mixed": "Sabit",
|
||||
"Stats": "Durum",
|
||||
"CurrentlyInstalled": "Şu anda Yüklü",
|
||||
"PreviouslyInstalled": "Önceden Yüklenmiş"
|
||||
}
|
||||
|
||||
@@ -292,7 +292,7 @@
|
||||
"Style": "Стиль",
|
||||
"SuggestTranslationChange": "Запропонуйте зміну перекладу",
|
||||
"TableOptionsColumnsMessage": "Виберіть, які стовпці відображаються та в якому порядку вони відображаються",
|
||||
"SystemTimeCheckMessage": "Системний час вимкнено більш ніж на 1 день. Заплановані завдання можуть не працювати належним чином, доки час не буде виправлено",
|
||||
"SystemTimeHealthCheckMessage": "Системний час вимкнено більш ніж на 1 день. Заплановані завдання можуть не працювати належним чином, доки час не буде виправлено",
|
||||
"OnGrab": "При захопленні",
|
||||
"SSLCertPath": "Шлях сертифіката SSL",
|
||||
"UI": "Інтерфейс користувача",
|
||||
@@ -436,5 +436,9 @@
|
||||
"ExternalUpdater": "{appName} налаштовано на використання зовнішнього механізму оновлення",
|
||||
"NoEventsFound": "Подій не знайдено",
|
||||
"RestartReloadNote": "Примітка: {appName} автоматично перезапуститься та перезавантажить інтерфейс під час процесу відновлення.",
|
||||
"InstallLatest": "Встановити останній"
|
||||
"InstallLatest": "Встановити останній",
|
||||
"Mixed": "Виправлено",
|
||||
"CurrentlyInstalled": "В даний час встановлено",
|
||||
"Season": "Причина",
|
||||
"Stats": "Статус"
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
"SSLPort": "Cổng SSL",
|
||||
"Style": "Phong cách",
|
||||
"SuggestTranslationChange": "Đề xuất thay đổi bản dịch",
|
||||
"SystemTimeCheckMessage": "Thời gian hệ thống tắt hơn 1 ngày. Các tác vụ đã lên lịch có thể không chạy chính xác cho đến khi thời gian được sửa",
|
||||
"SystemTimeHealthCheckMessage": "Thời gian hệ thống tắt hơn 1 ngày. Các tác vụ đã lên lịch có thể không chạy chính xác cho đến khi thời gian được sửa",
|
||||
"TableOptions": "Tùy chọn bảng",
|
||||
"TableOptionsColumnsMessage": "Chọn cột nào hiển thị và chúng xuất hiện theo thứ tự nào",
|
||||
"TagCannotBeDeletedWhileInUse": "Không thể bị xóa khi đang sử dụng",
|
||||
@@ -372,5 +372,30 @@
|
||||
"ExternalUpdater": "{appName} được định cấu hình để sử dụng cơ chế cập nhật bên ngoài",
|
||||
"RestartReloadNote": "Lưu ý: {appName} sẽ tự động khởi động lại và tải lại giao diện người dùng trong quá trình khôi phục.",
|
||||
"UpdateAppDirectlyLoadError": "Không thể cập nhật {appName} trực tiếp,",
|
||||
"InstallLatest": "Cài đặt mới nhất"
|
||||
"InstallLatest": "Cài đặt mới nhất",
|
||||
"AuthenticationMethodHelpTextWarning": "Vui lòng chọn một phương thức xác thực hợp lệ",
|
||||
"AuthenticationRequiredPasswordHelpTextWarning": "Nhập mật khẩu mới",
|
||||
"AuthenticationRequiredUsernameHelpTextWarning": "Nhập tên người dùng mới",
|
||||
"UpdaterLogFiles": "Tệp nhật ký của trình cập nhật",
|
||||
"UseSsl": "Dùng SSL",
|
||||
"AppUpdatedVersion": "{appName} đã được cập nhật lên phiên bản `{version}`, để nhận được những thay đổi mới nhất, bạn cần tải lại {appName}",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "Xác nhận mật khẩu mới",
|
||||
"UpdateAvailableHealthCheckMessage": "Có cập nhật mới: {version}",
|
||||
"AuthenticationRequiredWarning": "Để ngăn truy cập từ xa mà không cần xác thực, {appName} hiện yêu cầu bật xác thực. Bạn có thể tùy ý tắt xác thực từ các địa chỉ cục bộ.",
|
||||
"AuthenticationRequired": "Bắt buộc phải xác thực",
|
||||
"AuthenticationMethod": "Phương thức xác thực",
|
||||
"AddDownloadClientImplementation": "Thêm trình tải xuống - {implementationName}",
|
||||
"AddIndexerImplementation": "Thêm trình lập chỉ mục - {implementationName}",
|
||||
"AddConnection": "Thêm kết nối",
|
||||
"AddConnectionImplementation": "Thêm điều kiện - {implementationName}",
|
||||
"AppUpdated": "{appName} đã cập nhật",
|
||||
"Clone": "Đóng",
|
||||
"EditIndexerImplementation": "Thêm điều kiện - {implementationName}",
|
||||
"CurrentlyInstalled": "Mới cài đặt",
|
||||
"EditApplicationImplementation": "Thêm điều kiện - {implementationName}",
|
||||
"Stats": "Trạng thái",
|
||||
"Season": "Lý do",
|
||||
"Mixed": "đã sửa",
|
||||
"EditConnectionImplementation": "Thêm điều kiện - {implementationName}",
|
||||
"AddApplicationImplementation": "Thêm điều kiện - {implementationName}"
|
||||
}
|
||||
|
||||
@@ -13,14 +13,14 @@
|
||||
"AddRemoveOnly": "仅添加和删除",
|
||||
"AddSyncProfile": "添加同步配置文件",
|
||||
"AddToDownloadClient": "添加发布到下载客户端",
|
||||
"Added": "已添加",
|
||||
"Added": "添加日期",
|
||||
"AddedToDownloadClient": "发布已添加档案到客户端",
|
||||
"AddingTag": "添加标签",
|
||||
"Age": "年龄",
|
||||
"All": "全部",
|
||||
"AllIndexersHiddenDueToFilter": "由于应用了筛选器,所有索引器都被隐藏。",
|
||||
"Analytics": "分析",
|
||||
"AnalyticsEnabledHelpText": "将匿名使用情况和错误信息发送到{appName}的服务器。这包括有关您的浏览器的信息、您使用的{appName} WebUI页面、错误报告以及操作系统和运行时版本。我们将使用此信息来确定功能和错误修复的优先级。",
|
||||
"AnalyticsEnabledHelpText": "将匿名使用情况和错误信息发送到 {appName} 的服务器。这包括有关您的浏览器信息、您使用的 {appName} WebUI页面、错误报告以及操作系统和运行时版本。我们将使用此信息来确定功能和错误修复的优先级。",
|
||||
"ApiKey": "API 密钥",
|
||||
"ApiKeyValidationHealthCheckMessage": "请将API密钥更新为至少 {length} 个字符长。您可以通过设置或配置文件完成此操作",
|
||||
"AppDataDirectory": "AppData 目录",
|
||||
@@ -89,7 +89,7 @@
|
||||
"ConnectSettingsSummary": "通知和自定义脚本",
|
||||
"ConnectionLost": "连接丢失",
|
||||
"Connections": "连接",
|
||||
"CouldNotConnectSignalR": "无法连接至SignalR,不会升级UI",
|
||||
"CouldNotConnectSignalR": "无法连接至 SignalR,UI 将不会更新",
|
||||
"Custom": "自定义",
|
||||
"CustomFilters": "自定义过滤器",
|
||||
"DatabaseMigration": "数据库迁移版本",
|
||||
@@ -101,14 +101,14 @@
|
||||
"DeleteApplication": "删除应用程序",
|
||||
"DeleteApplicationMessageText": "您确定要删除应用程序“{name}”吗?",
|
||||
"DeleteBackup": "删除备份",
|
||||
"DeleteBackupMessageText": "您确定要删除备份“{name}”吗?",
|
||||
"DeleteBackupMessageText": "您确定要删除备份 “{name}” 吗?",
|
||||
"DeleteClientCategory": "删除下载客户端分类",
|
||||
"DeleteDownloadClient": "删除下载客户端",
|
||||
"DeleteDownloadClientMessageText": "你确定要删除下载客户端 “{name}” 吗?",
|
||||
"DeleteDownloadClientMessageText": "您确定要删除下载客户端 “{name}” 吗?",
|
||||
"DeleteIndexerProxy": "删除搜刮器代理",
|
||||
"DeleteIndexerProxyMessageText": "您确定要删除索引器代理“{name}”吗?",
|
||||
"DeleteNotification": "删除消息推送",
|
||||
"DeleteNotificationMessageText": "您确定要删除通知“{name}”吗?",
|
||||
"DeleteNotificationMessageText": "您确定要删除通知 “{name}” 吗?",
|
||||
"DeleteTag": "删除标签",
|
||||
"DeleteTagMessageText": "您确定要删除标签 '{label}' 吗?",
|
||||
"Description": "描述",
|
||||
@@ -133,7 +133,7 @@
|
||||
"ElapsedTime": "运行时间",
|
||||
"Enable": "启用",
|
||||
"EnableAutomaticSearch": "启用自动搜索",
|
||||
"EnableAutomaticSearchHelpText": "当自动搜索通过UI或{appName}执行时将被使用",
|
||||
"EnableAutomaticSearchHelpText": "当自动搜索通过 UI 或 {appName} 执行时将被使用",
|
||||
"EnableIndexer": "启用搜刮器",
|
||||
"EnableInteractiveSearch": "启用手动搜索",
|
||||
"EnableInteractiveSearchHelpText": "当手动搜索启用时使用",
|
||||
@@ -200,7 +200,7 @@
|
||||
"IndexerLongTermStatusAllUnavailableHealthCheckMessage": "由于故障超过6小时,所有搜刮器均不可用",
|
||||
"IndexerLongTermStatusUnavailableHealthCheckMessage": "由于故障6小时,下列搜刮器都已不可用:{indexerNames}",
|
||||
"IndexerName": "索引名字",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "索引器没有定义,将无法工作: {0}. 请删除或重新添加到{appName}",
|
||||
"IndexerNoDefinitionCheckHealthCheckMessage": "索引器没有定义,将无法工作: {indexerNames}. 请删除或重新添加到{appName}",
|
||||
"IndexerObsoleteCheckMessage": "搜刮器已过弃用或已更新:{0}。请将其删除和(或)重新添加到 {appName}",
|
||||
"IndexerPriority": "搜刮器优先级",
|
||||
"IndexerPriorityHelpText": "索引器优先级从1(最高)到50(最低),默认25。",
|
||||
@@ -307,7 +307,7 @@
|
||||
"ProwlarrSupportsAnyIndexer": "{appName}支持多种搜刮器,包括任何使用Newznab/Torznab标准的搜刮器(“通用Newznab”对应Usenet,“Generic Torznab”对应Torrents)。从以下搜索并选择你的搜刮器。",
|
||||
"Proxies": "代理",
|
||||
"Proxy": "代理",
|
||||
"ProxyBypassFilterHelpText": "使用“ , ”作为分隔符,和“ *. ”作为二级域名的通配符",
|
||||
"ProxyBypassFilterHelpText": "使用 “ , ” 作为分隔符,并使用 “ *. ” 作为二级域名的通配符",
|
||||
"ProxyBadRequestHealthCheckMessage": "测试代理失败。状态码:{statusCode}",
|
||||
"ProxyFailedToTestHealthCheckMessage": "测试代理失败: {url}",
|
||||
"ProxyResolveIpHealthCheckMessage": "无法解析已设置的代理服务器主机{proxyHostName}的IP地址",
|
||||
@@ -411,7 +411,7 @@
|
||||
"SyncProfile": "同步配置文件",
|
||||
"SyncProfiles": "同步配置文件",
|
||||
"System": "系统",
|
||||
"SystemTimeCheckMessage": "系统时间相差超过1天。在纠正时间之前,计划的任务可能无法正确运行",
|
||||
"SystemTimeHealthCheckMessage": "系统时间相差超过1天。在纠正时间之前,计划的任务可能无法正确运行",
|
||||
"TVSearchTypes": "电视搜索类型",
|
||||
"TableOptions": "表格选项",
|
||||
"TableOptionsColumnsMessage": "选择显示哪些列并排序",
|
||||
@@ -463,7 +463,7 @@
|
||||
"UnableToLoadUISettings": "无法加载UI设置",
|
||||
"UnsavedChanges": "未保存更改",
|
||||
"UnselectAll": "取消全选",
|
||||
"UpdateAutomaticallyHelpText": "自动下载并安装更新。你还可以在“系统:更新”中安装",
|
||||
"UpdateAutomaticallyHelpText": "自动下载并安装更新。您还可以在「“系统”->“更新”」中安装",
|
||||
"UpdateAvailableHealthCheckMessage": "有新的更新可用",
|
||||
"UpdateStartupNotWritableHealthCheckMessage": "无法安装更新,因为用户“{userName}”对于启动文件夹“{startupFolder}”没有写入权限。",
|
||||
"UpdateStartupTranslocationHealthCheckMessage": "无法安装更新,因为启动文件夹“{0}”在一个应用程序迁移文件夹。Cannot install update because startup folder '{startupFolder}' is in an App Translocation folder.",
|
||||
@@ -599,7 +599,7 @@
|
||||
"PackSeedTime": "做种时间",
|
||||
"PasswordConfirmation": "确认密码",
|
||||
"AuthenticationRequiredPasswordConfirmationHelpTextWarning": "确认新密码",
|
||||
"InvalidUILanguage": "您的UI设置为无效语言,请纠正并保存设置",
|
||||
"InvalidUILanguage": "您的 UI 设置为无效语言,请纠正并保存设置",
|
||||
"NoIndexerCategories": "没有找到此索引器的分类",
|
||||
"DownloadClientQbittorrentSettingsContentLayout": "内容布局",
|
||||
"DownloadClientQbittorrentSettingsContentLayoutHelpText": "是否使用 qBittorrent 配置的内容布局,使用种子的原始布局或始终创建子文件夹(qBittorrent 4.3.2+)",
|
||||
@@ -609,7 +609,7 @@
|
||||
"BlackholeFolderHelpText": "{appName} 将在其中存储 {extension} 文件的文件夹",
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashes": "在抓取时不会同步黑名单种子",
|
||||
"UsenetBlackholeNzbFolder": "NZB文件夹",
|
||||
"DownloadClientFreeboxSettingsAppIdHelpText": "创建访问 Freebox API 所需的 App ID(即“app_id”)",
|
||||
"DownloadClientFreeboxSettingsAppIdHelpText": "创建访问 Freebox API 所需的 App ID(即 “app_id”)",
|
||||
"DownloadClientNzbgetSettingsAddPausedHelpText": "此选项至少需要 NzbGet 版本 16.0",
|
||||
"DownloadClientQbittorrentSettingsSequentialOrderHelpText": "按顺序下载文件(qBittorrent 4.1.0+)",
|
||||
"TorrentBlackholeSaveMagnetFilesHelpText": "如果没有可用的 .torrent 文件,请保存磁力链接(仅当下载客户端支持保存到文件的磁力连接时才有用)",
|
||||
@@ -619,7 +619,7 @@
|
||||
"DownloadClientDelugeSettingsUrlBaseHelpText": "向 Deluge JSON URL 添加前缀,请参阅 {url}",
|
||||
"DownloadClientFloodSettingsUrlBaseHelpText": "为 Flood API 添加前缀,例如 {url}",
|
||||
"DownloadClientFreeboxSettingsAppToken": "App Token",
|
||||
"DownloadClientFreeboxSettingsAppTokenHelpText": "创建访问 Freebox API 所需的 App token(即“ app_token”)",
|
||||
"DownloadClientFreeboxSettingsAppTokenHelpText": "创建访问 Freebox API 所需的 App token(即 “ app_token”)",
|
||||
"DownloadClientQbittorrentSettingsInitialStateHelpText": "添加到 qBittorrent 的种子的初始状态。 请注意,强制做种不遵守种子限制",
|
||||
"GrabRelease": "抓取版本",
|
||||
"ManualGrab": "手动抓取",
|
||||
@@ -641,7 +641,7 @@
|
||||
"ApplicationSettingsSyncRejectBlocklistedTorrentHashesHelpText": "如果 torrent 的哈希被屏蔽了,某些索引器在使用RSS或者搜索期间可能无法正确拒绝它,启用此功能将允许在抓取 torrent 之后但在将其发送到客户端之前拒绝它。",
|
||||
"DownloadClientDownloadStationSettingsDirectoryHelpText": "用于存放下载内容的共享文件夹可选择,留空使用默认的 Download Station 位置",
|
||||
"DownloadClientFloodSettingsAdditionalTagsHelpText": "添加媒体属性作为标签。 提示是示例。",
|
||||
"DownloadClientFreeboxSettingsApiUrlHelpText": "使用 API 版本定义 Freebox API 基本 URL,例如“{url}”,默认为“{defaultApiUrl}”",
|
||||
"DownloadClientFreeboxSettingsApiUrlHelpText": "使用 API 版本定义 Freebox API 基本 URL,例如 “{url}”,默认为 “{defaultApiUrl}”",
|
||||
"DownloadClientPneumaticSettingsStrmFolder": "Strm 文件夹",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirstHelpText": "首先下载第一个和最后一个片段(qBittorrent 4.1.0+)",
|
||||
"DownloadClientQbittorrentSettingsUseSslHelpText": "使用安全连接。 请参阅 qBittorrent 中的「选项 -> Web UI -> “使用 HTTPS 而不是 HTTP”」。",
|
||||
@@ -654,7 +654,7 @@
|
||||
"IndexerSettingsAppsMinimumSeeders": "应用程序最少种子数",
|
||||
"IndexerSettingsPackSeedTimeIndexerHelpText": "种子下载的时间(季或专辑)应在停止前保持上传状态,应用程序默认设定为empty",
|
||||
"IndexerHDBitsSettingsOriginsHelpText": "如果未指定,则使用所有选项。",
|
||||
"DownloadClientFreeboxSettingsHostHelpText": "Freebox 的主机名或主机 IP 地址,默认为“{url}”(仅在同一网络上有效)",
|
||||
"DownloadClientFreeboxSettingsHostHelpText": "Freebox 的主机名或主机 IP 地址,默认为 “{url}”(仅在同一网络上有效)",
|
||||
"DownloadClientFreeboxSettingsPortHelpText": "用于访问 Freebox 接口的端口,默认为 '{port}'",
|
||||
"DownloadClientQbittorrentSettingsFirstAndLastFirst": "先下载首尾文件块",
|
||||
"DownloadClientSettingsAddPaused": "添加并暂停",
|
||||
@@ -670,7 +670,7 @@
|
||||
"Menu": "菜单",
|
||||
"Mixed": "混合",
|
||||
"TorrentBlackholeSaveMagnetFilesExtension": "保存磁力链接文件扩展名",
|
||||
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "用于磁力链接的扩展名,默认为“.magnet”",
|
||||
"TorrentBlackholeSaveMagnetFilesExtensionHelpText": "用于磁力链接的扩展名,默认为 “.magnet”",
|
||||
"Destination": "目标",
|
||||
"Directory": "目录",
|
||||
"IndexerHDBitsSettingsCodecs": "编解码器",
|
||||
@@ -714,7 +714,7 @@
|
||||
"DownloadClientSettingsDefaultCategorySubFolderHelpText": "默认的备用分类,当发布资源没有匹配的分类时将使用此分类。为 {appName} 添加一个特定的分类,可以避免与非 {appName} 的无关下载发生冲突。分类是可选的,但强烈建议使用。启用分类后,会在输出目录中创建一个 [分类] 子目录。",
|
||||
"ErrorRestoringBackup": "恢复备份错误",
|
||||
"UpdaterLogFiles": "更新器日志文件",
|
||||
"WouldYouLikeToRestoreBackup": "是否要还原备份“{name}”?",
|
||||
"WouldYouLikeToRestoreBackup": "是否要还原备份 “{name}”?",
|
||||
"AptUpdater": "使用apt安装更新",
|
||||
"DockerUpdater": "更新Docker容器以更新应用",
|
||||
"Download": "下载",
|
||||
@@ -726,5 +726,14 @@
|
||||
"RestartReloadNote": "注意:{appName}将在恢复过程中自动重启并重新加载UI。",
|
||||
"TheLogLevelDefault": "默认的日志等级为 \"Info\",可以在 [常规设置] 中修改 (/settings/general)",
|
||||
"UpdateAppDirectlyLoadError": "无法直接更新{appName},",
|
||||
"InstallLatest": "安装最新版"
|
||||
"InstallLatest": "安装最新版",
|
||||
"Install": "安装",
|
||||
"InstallMajorVersionUpdate": "安装更新",
|
||||
"InstallMajorVersionUpdateMessage": "此更新将安装新的主要版本,这可能与您的系统不兼容。您确定要安装此更新吗?",
|
||||
"InstallMajorVersionUpdateMessageLink": "请查看 [{domain}]({url}) 以获取更多信息。",
|
||||
"CurrentlyInstalled": "已安装",
|
||||
"PreviouslyInstalled": "上次安装",
|
||||
"FailedToFetchSettings": "设置同步失败",
|
||||
"DownloadClientSettingsPriorityItemHelpText": "抓取内容时优先使用",
|
||||
"IndexerAlphaRatioSettingsExcludeScene": "排除场景"
|
||||
}
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
"Queued": "佇列",
|
||||
"Replace": "替換",
|
||||
"Scheduled": "已排程",
|
||||
"UI": "UI",
|
||||
"UI": "使用者介面",
|
||||
"Apply": "套用",
|
||||
"Connections": "連接",
|
||||
"Reset": "重置",
|
||||
@@ -112,7 +112,7 @@
|
||||
"UnableToAddANewAppProfilePleaseTryAgain": "無法加入新的條件,請重新嘗試。",
|
||||
"UnableToAddANewApplicationPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
|
||||
"UnableToAddANewDownloadClientPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
|
||||
"UnableToAddANewIndexerPleaseTryAgain": "無法加入新的索引器,請重新嘗試。",
|
||||
"UnableToAddANewIndexerProxyPleaseTryAgain": "無法加入新的條件,請重新嘗試。",
|
||||
"AddApplicationImplementation": "新增連接 - {implementationName}",
|
||||
"AddIndexerProxyImplementation": "新增索引 - {implementationName}",
|
||||
@@ -137,5 +137,24 @@
|
||||
"BuiltIn": "內建的",
|
||||
"AllSearchResultsHiddenByFilter": "根據所使用的篩選器已將所有結果隱藏",
|
||||
"AptUpdater": "使用apt安裝更新",
|
||||
"Discord": "Discord"
|
||||
"Discord": "Discord",
|
||||
"Any": "任何",
|
||||
"UpdateAppDirectlyLoadError": "無法直接更新 {appName},",
|
||||
"UnselectAll": "取消全選",
|
||||
"Uptime": "上線時間",
|
||||
"AdvancedSettingsHiddenClickToShow": "進階設定已隱藏,點擊以顯示",
|
||||
"UnableToLoadIndexers": "無法載入索引器",
|
||||
"UnableToLoadHistory": "無法載入歷史記錄",
|
||||
"UnableToLoadTags": "無法載入標籤",
|
||||
"UILanguage": "使用者介面語言",
|
||||
"UILanguageHelpText": "{appName} 介面所使用的語言",
|
||||
"UISettings": "使用者介面設定",
|
||||
"UnableToLoadUISettings": "無法載入 UI 設定",
|
||||
"AddCustomFilter": "新增自定義過濾器",
|
||||
"AddApplication": "新增應用程式",
|
||||
"AddDownloadClientToProwlarr": "新增一個下載客戶端以允許 {appName} 從 UI 直接傳送手動搜尋結果。",
|
||||
"AddCategory": "新增類別",
|
||||
"AdvancedSettingsShownClickToHide": "進階設定已顯示,點擊以隱藏",
|
||||
"Version": "版本",
|
||||
"UpdateAvailableHealthCheckMessage": "可用的新版本: {version}"
|
||||
}
|
||||
|
||||
@@ -105,6 +105,8 @@ namespace NzbDrone.Core.Messaging.Commands
|
||||
_logger.Trace("Publishing {0}", command.Name);
|
||||
_logger.Trace("Checking if command is queued or started: {0}", command.Name);
|
||||
|
||||
command.Trigger = trigger;
|
||||
|
||||
lock (_commandQueue)
|
||||
{
|
||||
var existingCommands = QueuedOrStarted(command.Name);
|
||||
@@ -141,7 +143,6 @@ namespace NzbDrone.Core.Messaging.Commands
|
||||
var command = GetCommand(commandName);
|
||||
command.LastExecutionTime = lastExecutionTime;
|
||||
command.LastStartTime = lastStartTime;
|
||||
command.Trigger = trigger;
|
||||
|
||||
return Push(command, priority, trigger);
|
||||
}
|
||||
@@ -232,13 +233,13 @@ namespace NzbDrone.Core.Messaging.Commands
|
||||
_repo.Trim();
|
||||
}
|
||||
|
||||
private dynamic GetCommand(string commandName)
|
||||
private Command GetCommand(string commandName)
|
||||
{
|
||||
commandName = commandName.Split('.').Last();
|
||||
var commands = _knownTypes.GetImplementations(typeof(Command));
|
||||
var commandType = commands.Single(c => c.Name.Equals(commandName, StringComparison.InvariantCultureIgnoreCase));
|
||||
|
||||
return Json.Deserialize("{}", commandType);
|
||||
return Json.Deserialize("{}", commandType) as Command;
|
||||
}
|
||||
|
||||
private void Update(CommandModel command, CommandStatus status, string message)
|
||||
|
||||
@@ -79,7 +79,7 @@ namespace NzbDrone.Core.Notifications
|
||||
|
||||
foreach (var notification in notifications)
|
||||
{
|
||||
if (blockedNotifications.TryGetValue(notification.Definition.Id, out var notificationStatus))
|
||||
if (blockedNotifications.TryGetValue(notification.Definition.Id, out var notificationStatus) && notificationStatus.DisabledTill.HasValue)
|
||||
{
|
||||
_logger.Debug("Temporarily ignoring notification {0} till {1} due to recent failures.", notification.Definition.Name, notificationStatus.DisabledTill.Value.ToLocalTime());
|
||||
continue;
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
<PackageReference Include="Microsoft.AspNetCore.Cryptography.KeyDerivation" Version="6.0.35" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="2.2.0" />
|
||||
<PackageReference Include="NLog.Targets.Syslog" Version="7.0.0" />
|
||||
<PackageReference Include="Npgsql" Version="7.0.8" />
|
||||
<PackageReference Include="Polly" Version="8.4.2" />
|
||||
<PackageReference Include="Npgsql" Version="7.0.9" />
|
||||
<PackageReference Include="Polly" Version="8.5.0" />
|
||||
<PackageReference Include="Servarr.FluentMigrator.Runner" Version="3.3.2.9" />
|
||||
<PackageReference Include="Servarr.FluentMigrator.Runner.Postgres" Version="3.3.2.9" />
|
||||
<PackageReference Include="Servarr.FluentMigrator.Runner.SQLite" Version="3.3.2.9" />
|
||||
|
||||
@@ -61,9 +61,8 @@ namespace Prowlarr.Api.V1.Commands
|
||||
using var reader = new StreamReader(Request.Body);
|
||||
var body = reader.ReadToEnd();
|
||||
|
||||
dynamic command = STJson.Deserialize(body, commandType);
|
||||
var command = STJson.Deserialize(body, commandType) as Command;
|
||||
|
||||
command.Trigger = CommandTrigger.Manual;
|
||||
command.SuppressMessages = !command.SendUpdatesToClient;
|
||||
command.SendUpdatesToClient = true;
|
||||
command.ClientUserAgent = Request.Headers["User-Agent"];
|
||||
|
||||
@@ -46,6 +46,7 @@ namespace Prowlarr.Api.V1.Config
|
||||
public int BackupInterval { get; set; }
|
||||
public int BackupRetention { get; set; }
|
||||
public int HistoryCleanupDays { get; set; }
|
||||
public bool TrustCgnatIpAddresses { get; set; }
|
||||
}
|
||||
|
||||
public static class HostConfigResourceMapper
|
||||
|
||||
@@ -341,7 +341,7 @@ namespace NzbDrone.Api.V1.Indexers
|
||||
{
|
||||
var blockedIndexers = _indexerStatusService.GetBlockedProviders().ToDictionary(v => v.ProviderId, v => v);
|
||||
|
||||
return blockedIndexers.TryGetValue(indexer.Definition.Id, out var blockedIndexerStatus) ? blockedIndexerStatus : null;
|
||||
return blockedIndexers.GetValueOrDefault(indexer.Definition.Id);
|
||||
}
|
||||
|
||||
private void AddRetryAfterHeader(int retryAfterSeconds)
|
||||
|
||||
@@ -4966,6 +4966,9 @@
|
||||
"historyCleanupDays": {
|
||||
"type": "integer",
|
||||
"format": "int32"
|
||||
},
|
||||
"trustCgnatIpAddresses": {
|
||||
"type": "boolean"
|
||||
}
|
||||
},
|
||||
"additionalProperties": false
|
||||
|
||||
@@ -27,10 +27,13 @@ namespace Prowlarr.Http.Authentication
|
||||
if (_authenticationRequired == AuthenticationRequiredType.DisabledForLocalAddresses)
|
||||
{
|
||||
if (context.Resource is HttpContext httpContext &&
|
||||
IPAddress.TryParse(httpContext.GetRemoteIP(), out var ipAddress) &&
|
||||
ipAddress.IsLocalAddress())
|
||||
IPAddress.TryParse(httpContext.GetRemoteIP(), out var ipAddress))
|
||||
{
|
||||
context.Succeed(requirement);
|
||||
if (ipAddress.IsLocalAddress() ||
|
||||
(_configService.TrustCgnatIpAddresses && ipAddress.IsCgnatIpAddress()))
|
||||
{
|
||||
context.Succeed(requirement);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user