Add *arr priority support.

Closes #627
This commit is contained in:
TheOtherP 2020-09-12 09:48:57 +02:00
parent f867a4026e
commit 3d2b7f43e6
30 changed files with 8700 additions and 7456 deletions

3
core/.gitignore vendored
View File

@ -21,4 +21,5 @@ sql notes.sql
/nzbhydra2wrapperPy3.py
/logback-access.xml
*.dmp
*.trc
*.trc
package-lock.json

294
core/package-lock.json generated
View File

@ -623,9 +623,9 @@
},
"dependencies": {
"graceful-fs": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz",
"integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"mout": {
"version": "0.9.1",
@ -650,9 +650,9 @@
},
"dependencies": {
"graceful-fs": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz",
"integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
}
}
},
@ -682,9 +682,9 @@
"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
},
"graceful-fs": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz",
"integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"lru-cache": {
"version": "2.3.1",
@ -1132,9 +1132,9 @@
}
},
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"iconv-lite": {
"version": "0.4.24",
@ -1257,12 +1257,9 @@
"integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A=="
},
"graceful-fs": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
"integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
"requires": {
"natives": "^1.1.0"
}
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"js-yaml": {
"version": "3.13.1",
@ -1436,12 +1433,9 @@
},
"dependencies": {
"graceful-fs": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
"integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
"requires": {
"natives": "^1.1.0"
}
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"nopt": {
"version": "3.0.6",
@ -2120,7 +2114,8 @@
"extsprintf": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
"integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
"optional": true
},
"fancy-log": {
"version": "1.3.3",
@ -2348,7 +2343,8 @@
},
"ansi-regex": {
"version": "2.1.1",
"bundled": true
"bundled": true,
"optional": true
},
"aproba": {
"version": "1.2.0",
@ -2366,11 +2362,13 @@
},
"balanced-match": {
"version": "1.0.0",
"bundled": true
"bundled": true,
"optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@ -2383,15 +2381,18 @@
},
"code-point-at": {
"version": "1.1.0",
"bundled": true
"bundled": true,
"optional": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true
"bundled": true,
"optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true
"bundled": true,
"optional": true
},
"core-util-is": {
"version": "1.0.2",
@ -2494,7 +2495,8 @@
},
"inherits": {
"version": "2.0.3",
"bundled": true
"bundled": true,
"optional": true
},
"ini": {
"version": "1.3.5",
@ -2504,6 +2506,7 @@
"is-fullwidth-code-point": {
"version": "1.0.0",
"bundled": true,
"optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@ -2516,17 +2519,20 @@
"minimatch": {
"version": "3.0.4",
"bundled": true,
"optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
},
"minimist": {
"version": "0.0.8",
"bundled": true
"bundled": true,
"optional": true
},
"minipass": {
"version": "2.3.5",
"bundled": true,
"optional": true,
"requires": {
"safe-buffer": "^5.1.2",
"yallist": "^3.0.0"
@ -2543,6 +2549,7 @@
"mkdirp": {
"version": "0.5.1",
"bundled": true,
"optional": true,
"requires": {
"minimist": "0.0.8"
}
@ -2615,7 +2622,8 @@
},
"number-is-nan": {
"version": "1.0.1",
"bundled": true
"bundled": true,
"optional": true
},
"object-assign": {
"version": "4.1.1",
@ -2625,6 +2633,7 @@
"once": {
"version": "1.4.0",
"bundled": true,
"optional": true,
"requires": {
"wrappy": "1"
}
@ -2700,7 +2709,8 @@
},
"safe-buffer": {
"version": "5.1.2",
"bundled": true
"bundled": true,
"optional": true
},
"safer-buffer": {
"version": "2.1.2",
@ -2730,6 +2740,7 @@
"string-width": {
"version": "1.0.2",
"bundled": true,
"optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
@ -2747,6 +2758,7 @@
"strip-ansi": {
"version": "3.0.1",
"bundled": true,
"optional": true,
"requires": {
"ansi-regex": "^2.0.0"
}
@ -2785,11 +2797,13 @@
},
"wrappy": {
"version": "1.0.2",
"bundled": true
"bundled": true,
"optional": true
},
"yallist": {
"version": "3.0.3",
"bundled": true
"bundled": true,
"optional": true
}
}
},
@ -2805,9 +2819,9 @@
},
"dependencies": {
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
}
}
},
@ -2898,6 +2912,11 @@
"minimatch": "~0.2.11"
},
"dependencies": {
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"inherits": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz",
@ -3126,11 +3145,6 @@
}
}
},
"graceful-fs": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz",
"integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q="
},
"graceful-readlink": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
@ -3229,6 +3243,13 @@
"update-notifier": "^0.3.0",
"user-home": "^1.1.0",
"which": "^1.0.8"
},
"dependencies": {
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
}
}
},
"glob": {
@ -3243,12 +3264,9 @@
}
},
"graceful-fs": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
"integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
"requires": {
"natives": "^1.1.0"
}
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"lodash": {
"version": "3.9.3",
@ -3364,6 +3382,11 @@
"which": "~1.0.5"
},
"dependencies": {
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"rimraf": {
"version": "2.2.8",
"resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz",
@ -3383,9 +3406,9 @@
},
"dependencies": {
"graceful-fs": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz",
"integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"osenv": {
"version": "0.0.3",
@ -3415,9 +3438,9 @@
"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E="
},
"graceful-fs": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz",
"integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"lru-cache": {
"version": "2.3.1",
@ -3493,6 +3516,11 @@
"touch": "0.0.2"
},
"dependencies": {
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"nopt": {
"version": "2.2.1",
"resolved": "https://registry.npmjs.org/nopt/-/nopt-2.2.1.tgz",
@ -3530,6 +3558,13 @@
"inherits": "2",
"minimatch": "^1.0.0",
"once": "^1.3.0"
},
"dependencies": {
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
}
}
},
"got": {
@ -3548,12 +3583,9 @@
}
},
"graceful-fs": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
"integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
"requires": {
"natives": "^1.1.0"
}
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"has-ansi": {
"version": "0.1.0",
@ -3856,9 +3888,9 @@
},
"dependencies": {
"graceful-fs": {
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.1.14.tgz",
"integrity": "sha1-BweNtfY3f2Mh/Oqu30l94STclGU=",
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
"optional": true
}
}
@ -4435,9 +4467,9 @@
},
"dependencies": {
"minimist": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
},
"semver": {
"version": "4.3.6",
@ -6303,9 +6335,9 @@
"integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
},
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"isarray": {
"version": "1.0.0",
@ -6582,9 +6614,9 @@
}
},
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"isarray": {
"version": "1.0.0",
@ -6648,6 +6680,13 @@
"strip-bom": "^2.0.0",
"strip-bom-stream": "^2.0.0",
"vinyl": "^1.1.0"
},
"dependencies": {
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
}
}
}
}
@ -6977,9 +7016,9 @@
}
},
"interpret": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz",
"integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw=="
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
"integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA=="
},
"intersect": {
"version": "0.0.3",
@ -7276,7 +7315,8 @@
"jsbn": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
"integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
"optional": true
},
"jsesc": {
"version": "2.5.1",
@ -7499,6 +7539,7 @@
"version": "2.10.1",
"resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz",
"integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=",
"optional": true,
"requires": {
"hoek": "2.x.x"
}
@ -7513,6 +7554,7 @@
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"optional": true,
"requires": {
"delayed-stream": "~1.0.0"
}
@ -7529,7 +7571,8 @@
"delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
"integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
"optional": true
},
"forever-agent": {
"version": "0.6.1",
@ -7549,9 +7592,9 @@
}
},
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
"optional": true
},
"hawk": {
@ -7569,7 +7612,8 @@
"hoek": {
"version": "2.16.3",
"resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz",
"integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0="
"integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=",
"optional": true
},
"http-signature": {
"version": "1.1.1",
@ -7585,12 +7629,14 @@
"mime-db": {
"version": "1.40.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz",
"integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA=="
"integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==",
"optional": true
},
"mime-types": {
"version": "2.1.24",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz",
"integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==",
"optional": true,
"requires": {
"mime-db": "1.40.0"
}
@ -7739,9 +7785,9 @@
},
"dependencies": {
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
}
}
},
@ -8242,9 +8288,9 @@
}
},
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"gulp-sourcemaps": {
"version": "1.6.0",
@ -8256,6 +8302,13 @@
"strip-bom": "^2.0.0",
"through2": "^2.0.0",
"vinyl": "^1.0.0"
},
"dependencies": {
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
}
}
},
"is-extglob": {
@ -8413,6 +8466,13 @@
"through2-filter": "^2.0.0",
"vali-date": "^1.0.0",
"vinyl": "^1.0.0"
},
"dependencies": {
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
}
}
}
}
@ -8426,9 +8486,9 @@
},
"dependencies": {
"kind-of": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz",
"integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA=="
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
"integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw=="
}
}
},
@ -8779,11 +8839,6 @@
}
}
},
"natives": {
"version": "1.1.6",
"resolved": "https://registry.npmjs.org/natives/-/natives-1.1.6.tgz",
"integrity": "sha512-6+TDFewD4yxY14ptjKaS63GVdtKiES1pTPyxn9Jb0rBqPMZ7VcCiooEhPNsr+mqHtMGxa/5c/HhcC4uPEUw/nA=="
},
"nested-error-stacks": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-1.0.2.tgz",
@ -9345,9 +9400,9 @@
},
"dependencies": {
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
}
}
},
@ -9659,9 +9714,9 @@
},
"dependencies": {
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"isarray": {
"version": "1.0.0",
@ -10822,7 +10877,8 @@
"tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
"integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
"optional": true
},
"type-check": {
"version": "0.3.2",
@ -11123,9 +11179,9 @@
},
"dependencies": {
"graceful-fs": {
"version": "4.1.15",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
"integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA=="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"vinyl": {
"version": "1.2.0",
@ -11160,12 +11216,9 @@
"integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8="
},
"graceful-fs": {
"version": "3.0.11",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz",
"integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=",
"requires": {
"natives": "^1.1.0"
}
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"strip-bom": {
"version": "1.0.0",
@ -11279,6 +11332,13 @@
"mout": "~0.9.0",
"optimist": "~0.6.0",
"osenv": "0.0.3"
},
"dependencies": {
"graceful-fs": {
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
}
}
},
"chalk": {
@ -11305,9 +11365,9 @@
}
},
"graceful-fs": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz",
"integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA="
"version": "4.2.4",
"resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
"integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw=="
},
"has-ansi": {
"version": "0.1.0",

View File

@ -66,12 +66,15 @@
"wiredep-cli": "^0.1.0"
},
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
"preinstall": "npx npm-force-resolutions"
},
"repository": {
"type": "git",
"url": "git+https://github.com/theotherp/nzbhydra2.git"
},
"resolutions": {
"graceful-fs": "^4.2.4"
},
"keywords": [
"usenet",
"newznab",

View File

@ -86,7 +86,7 @@ public class NewznabJsonTransformer {
}
searchResultItem.getAttributes().put("guid", String.valueOf(searchResultItem.getSearchResultId()));
List<NewznabJsonItemAttributes> attributes = searchResultItem.getAttributes().entrySet().stream().map(attribute -> new NewznabJsonItemAttributes(attribute.getKey(), attribute.getValue())).sorted(Comparator.comparing(NewznabJsonItemAttributes::getName)).collect(Collectors.toList());
attributes.add(new NewznabJsonItemAttributes("hydraIndexerScore", String.valueOf(searchResultItem.getIndexer().getConfig().getScore().orElse(null))));
attributes.add(new NewznabJsonItemAttributes("hydraIndexerScore", String.valueOf(searchResultItem.getIndexer().getConfig().getScore())));
attributes.add(new NewznabJsonItemAttributes("hydraIndexerHost", String.valueOf(searchResultItem.getIndexer().getConfig().getHost())));
attributes.add(new NewznabJsonItemAttributes("hydraIndexerName", String.valueOf(searchResultItem.getIndexer().getName())));
String resultType;

View File

@ -90,7 +90,7 @@ public class NewznabXmlTransformer {
searchResultItem.getAttributes().put("guid", String.valueOf(searchResultItem.getSearchResultId()));
List<NewznabAttribute> newznabAttributes = searchResultItem.getAttributes().entrySet().stream().map(attribute -> new NewznabAttribute(attribute.getKey(), attribute.getValue())).sorted(Comparator.comparing(NewznabAttribute::getName)).collect(Collectors.toList());
if (searchResultItem.getIndexer() != null) {
newznabAttributes.add(new NewznabAttribute("hydraIndexerScore", String.valueOf(searchResultItem.getIndexer().getConfig().getScore().orElse(null))));
newznabAttributes.add(new NewznabAttribute("hydraIndexerScore", String.valueOf(searchResultItem.getIndexer().getConfig().getScore())));
newznabAttributes.add(new NewznabAttribute("hydraIndexerHost", getIndexerHost(searchResultItem)));
newznabAttributes.add(new NewznabAttribute("hydraIndexerName", String.valueOf(searchResultItem.getIndexer().getName())));
}

View File

@ -27,7 +27,7 @@ public class MainConfig extends ValidatingConfig<MainConfig> {
private static final Logger logger = LoggerFactory.getLogger(MainConfig.class);
private Integer configVersion = 15;
private Integer configVersion = 16;
//Hosting settings
@RestartRequired

View File

@ -78,7 +78,7 @@ public class IndexerConfig extends ValidatingConfig<IndexerConfig> {
private String password = null;
private boolean preselect = true;
private List<String> schedule = new ArrayList<>();
private Integer score = null;
private int score;
private SearchModuleType searchModuleType = SearchModuleType.NEWZNAB;
private boolean showOnSearch = true;
@JsonFormat(shape = Shape.STRING)
@ -114,10 +114,6 @@ public class IndexerConfig extends ValidatingConfig<IndexerConfig> {
return Optional.ofNullable(Strings.emptyToNull(password));
}
public Optional<Integer> getScore() {
return Optional.ofNullable(score);
}
public Optional<Integer> getTimeout() {
return Optional.ofNullable(timeout);
}

View File

@ -0,0 +1,53 @@
/*
* (C) Copyright 2017 TheOtherP (theotherp@posteo.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.nzbhydra.config.migration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.List;
import java.util.Map;
@SuppressWarnings("unchecked")
public class ConfigMigrationStep015to016 implements ConfigMigrationStep {
private static final Logger logger = LoggerFactory.getLogger(ConfigMigration.class);
@Override
public int forVersion() {
return 15;
}
@Override
public Map<String, Object> migrate(Map<String, Object> toMigrate) {
try {
List<Map<String, Object>> indexers = (List<Map<String, Object>>) toMigrate.get("indexers");
for (Map<String, Object> indexer : indexers) {
final Integer score = (Integer) indexer.get("score");
if (score == null) {
indexer.put("score", 0);
}
}
toMigrate.put("indexers", indexers);
} catch (Exception e) {
logger.error("Error while migrating indexers scores", e);
}
return toMigrate;
}
}

View File

@ -26,6 +26,7 @@ public class AddDialogInfo {
private boolean usenetIndexersConfigured;
private boolean torrentIndexersConfigured;
private String nzbhydraHost;
private boolean prioritiesConfigured;
}

View File

@ -45,6 +45,10 @@ public class AddRequest {
public boolean isV2() {
return this == Sonarr || this == Radarr;
}
public boolean isV3() {
return this == Sonarrv3 || this == Radarrv3;
}
}
private boolean configureForUsenet;
@ -69,8 +73,9 @@ public class AddRequest {
private String seedTime;
private String seasonPackSeedTime;
private String discographySeedTime;
private String categories;
private String animeCategories;
private Integer priority;
private boolean useHydraPriorities;
}

View File

@ -44,9 +44,11 @@ import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@ -72,19 +74,21 @@ public class ExternalTools {
private UrlCalculator urlCalculator;
private final List<String> messages = new ArrayList<>();
private final Map<IndexerConfig, Integer> indexerPrioritiesMapped = new HashMap<>();
public void addNzbhydraAsIndexer(AddRequest addRequest) throws IOException {
public boolean addNzbhydraAsIndexer(AddRequest addRequest) throws IOException {
try {
logger.debug(LoggingMarkers.EXTERNAL_TOOLS, "Received request: {}", addRequest);
messages.clear();
indexerPrioritiesMapped.clear();
if (failOnUnknownVersion(addRequest)) {
return;
return false;
}
if (deleteIndexers(addRequest)) {
return;
return false;
}
logger.info("Enabling mocking mode for external tool configuration. Any search requests made now will return mocked resuls; no indexers will be searched");
@ -95,13 +99,27 @@ public class ExternalTools {
.filter(x -> (x.getState() == IndexerConfig.State.ENABLED || addRequest.isAddDisabledIndexers()) && x.isConfigComplete() && x.isAllCapsChecked())
.filter(x -> x.getEnabledForSearchSource().meets(SearchRequest.SearchSource.API))
.collect(Collectors.toList());
final Optional<Integer> maxPriority = availableIndexers.stream().map(IndexerConfig::getScore).max(Comparator.naturalOrder());
if (addRequest.getAddType() == AddRequest.AddType.PER_INDEXER && addRequest.isUseHydraPriorities() && maxPriority.isPresent() && maxPriority.get() > 51) {
logger.info("Detected indexer with a priority higher than 51 which cannot not supported by {}. Will try to adapt priorities", addRequest.getExternalTool());
float ratio = 50F / (float) maxPriority.get(); //Example: maxPriority is 100 -> ratio is 0.5, every indexer priority is muliplied with 0.5.
availableIndexers.forEach(indexerConfig -> {
//Invert values (1 is highest priority in *arr, 50 the lowest) also needs to be done
int arrPriority = (int) (50 - indexerConfig.getScore() * ratio);
arrPriority = Math.max(arrPriority, 1); //0 is not allwed
logger.debug("Calculated *arr priority for {} to be {}. NZBHydra priority: {}", indexerConfig.getName(), arrPriority, indexerConfig.getScore());
indexerPrioritiesMapped.put(indexerConfig, arrPriority);
});
}
if (addRequest.isConfigureForUsenet()) {
if (addRequest.getAddType() == AddRequest.AddType.SINGLE) {
executeConfigurationRequest(addRequest, BackendType.Newznab, null);
} else {
final List<IndexerConfig> availableTorznabIndexers = availableIndexers.stream().filter(x -> x.getSearchModuleType() != SearchModuleType.TORZNAB).collect(Collectors.toList());
for (IndexerConfig indexer : availableTorznabIndexers) {
executeConfigurationRequest(addRequest, BackendType.Newznab, indexer.getName());
executeConfigurationRequest(addRequest, BackendType.Newznab, indexer);
}
}
}
@ -111,12 +129,17 @@ public class ExternalTools {
} else {
final List<IndexerConfig> availableUsenetIndexers = availableIndexers.stream().filter(x -> x.getSearchModuleType() == SearchModuleType.TORZNAB).collect(Collectors.toList());
for (IndexerConfig indexer : availableUsenetIndexers) {
executeConfigurationRequest(addRequest, BackendType.Torznab, indexer.getName());
executeConfigurationRequest(addRequest, BackendType.Torznab, indexer);
}
}
}
messages.add("Configuration of " + addRequest.getExternalTool() + " finished successfully");
return true;
} catch (Exception e) {
messages.add("Unexpected error: " + e.getMessage());
logger.error("Unexpected error during configuration of " + addRequest.getExternalTool().name(), e);
return false;
} finally {
logger.info("Disabling mocking mode");
ExternalApi.setInMockingMode(false);
@ -202,7 +225,7 @@ public class ExternalTools {
return messages;
}
private void executeConfigurationRequest(AddRequest addRequest, BackendType backendType, String indexerName) throws IOException {
private void executeConfigurationRequest(AddRequest addRequest, BackendType backendType, IndexerConfig indexer) throws IOException {
XdarrIndexer xdarrAddRequest = new XdarrIndexer();
xdarrAddRequest.setConfigContract(backendType == BackendType.Newznab ? "NewznabSettings" : "TorznabSettings");
//Only for sonarr and lidarr
@ -215,8 +238,8 @@ public class ExternalTools {
xdarrAddRequest.setImplementationName(backendType == BackendType.Newznab ? "Newznab" : "Torznab");
xdarrAddRequest.setInfoLink("https://github.com/Sonarr/Sonarr/wiki/Supported-Indexers#newznab");
String nameInXdarr = addRequest.getNzbhydraName();
if (indexerName != null) {
nameInXdarr += indexerName;
if (indexer != null) {
nameInXdarr += indexer.getName();
}
if (addRequest.getAddType() == AddRequest.AddType.SINGLE && addRequest.isConfigureForTorrents() && addRequest.isConfigureForUsenet()) {
nameInXdarr += " (" + backendType.name() + ")";
@ -232,7 +255,7 @@ public class ExternalTools {
} else {
xdarrAddRequest.getFields().add(new XdarrAddRequestField("categories", Arrays.asList(addRequest.getCategories().split(","))));
}
xdarrAddRequest.getFields().add(new XdarrAddRequestField("additionalParameters", getAdditionalParameters(addRequest, indexerName)));
xdarrAddRequest.getFields().add(new XdarrAddRequestField("additionalParameters", getAdditionalParameters(addRequest, indexer.getName())));
final AddRequest.ExternalTool externalTool = addRequest.getExternalTool();
if (externalTool != AddRequest.ExternalTool.Lidarr && externalTool != AddRequest.ExternalTool.Radarrv3) {
@ -269,6 +292,21 @@ public class ExternalTools {
xdarrAddRequest.getFields().add(new XdarrAddRequestField("baseUrl", addRequest.getNzbhydraHost()));
}
if (externalTool.isV3()) {
if (addRequest.getAddType() == AddRequest.AddType.SINGLE && addRequest.getPriority() != null) {
xdarrAddRequest.setPriority(addRequest.getPriority());
} else if (addRequest.isUseHydraPriorities()) {
if (!indexerPrioritiesMapped.isEmpty()) {
xdarrAddRequest.setPriority(indexerPrioritiesMapped.get(indexer));
} else {
int arrPriority = 50 - indexer.getScore();
arrPriority = Math.max(arrPriority, 1); //0 is "disabled"
logger.debug("Calculated *arr priority for {} to be {}. NZBHydra priority: {}", indexer.getName(), arrPriority, indexer.getScore());
xdarrAddRequest.setPriority(arrPriority);
}
} //else: Set value 0 (no priority)
}
if (externalTool.isRadarr()) {
xdarrAddRequest.getFields().add(new XdarrAddRequestField("removeYear", addRequest.isRemoveYearFromSearchString()));
//Not easily mapped as it's a list of numbers mapped to language names
@ -401,6 +439,7 @@ public class ExternalTools {
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
public static class XdarrIndexer {
public Boolean enableRss;
@ -418,6 +457,7 @@ public class ExternalTools {
public String infoLink;
public List<Object> tags = new ArrayList<>();
public int id;
public int priority;
}
@Data

View File

@ -2,6 +2,7 @@ package org.nzbhydra.externaltools;
import org.nzbhydra.config.ConfigProvider;
import org.nzbhydra.config.ConfigReaderWriter;
import org.nzbhydra.config.indexer.IndexerConfig;
import org.nzbhydra.config.indexer.SearchModuleType;
import org.nzbhydra.indexers.IndexerRepository;
import org.nzbhydra.web.UrlCalculator;
@ -36,17 +37,17 @@ public class ExternalToolsWeb {
@Secured({"ROLE_ADMIN"})
@RequestMapping(value = "/internalapi/externalTools/getDialogInfo", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public AddDialogInfo getDialogInfo() {
final boolean usenetIndexersConfigured = configProvider.getBaseConfig().getIndexers().stream().anyMatch(x -> x.getSearchModuleType() != SearchModuleType.TORZNAB);
final boolean torrentIndexersConfigured = configProvider.getBaseConfig().getIndexers().stream().anyMatch(x -> x.getSearchModuleType() == SearchModuleType.TORZNAB);
return new AddDialogInfo(usenetIndexersConfigured, torrentIndexersConfigured, urlCalculator.getRequestBasedUriBuilder().build().toUriString());
final List<IndexerConfig> indexers = configProvider.getBaseConfig().getIndexers();
final boolean usenetIndexersConfigured = indexers.stream().anyMatch(x -> x.getSearchModuleType() != SearchModuleType.TORZNAB);
final boolean torrentIndexersConfigured = indexers.stream().anyMatch(x -> x.getSearchModuleType() == SearchModuleType.TORZNAB);
final boolean prioritiesConfigured = indexers.stream().anyMatch(x -> x.getScore() > 0);
return new AddDialogInfo(usenetIndexersConfigured, torrentIndexersConfigured, urlCalculator.getRequestBasedUriBuilder().build().toUriString(), prioritiesConfigured);
}
@Secured({"ROLE_ADMIN"})
@RequestMapping(value = "/internalapi/externalTools/configure", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.TEXT_PLAIN_VALUE)
public String configureExternalTool(@RequestBody AddRequest addRequest) throws IOException {
externalTools.addNzbhydraAsIndexer(addRequest);
return "OK";
@RequestMapping(value = "/internalapi/externalTools/configure", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public Boolean configureExternalTool(@RequestBody AddRequest addRequest) throws IOException {
return externalTools.addNzbhydraAsIndexer(addRequest);
}
@Secured({"ROLE_ADMIN"})

View File

@ -51,7 +51,7 @@ public class Anizb extends Indexer<NewznabXmlRoot> {
item.setIndexerGuid(rssItem.getRssGuid().getGuid());
item.setSize(rssItem.getEnclosure().getLength());
item.setPubDate(rssItem.getPubDate());
item.setIndexerScore(config.getScore().orElse(0));
item.setIndexerScore(config.getScore());
item.setHasNfo(HasNfo.NO);
item.setAgePrecise(true);
item.setCategory(categoryProvider.getByInternalName("Anime"));

View File

@ -200,7 +200,7 @@ public class Binsearch extends Indexer<String> {
item.setCategory(categoryProvider.getNotAvailable());
item.setIndexer(this);
item.setDownloadType(DownloadType.NZB);
item.setIndexerScore(config.getScore().orElse(0));
item.setIndexerScore(config.getScore());
return item;
}

View File

@ -530,7 +530,7 @@ public class Newznab extends Indexer<Xml> {
searchResultItem.setTitle(cleanUpTitle(item.getTitle()));
searchResultItem.setSize(item.getEnclosure().getLength());
searchResultItem.setPubDate(item.getPubDate());
searchResultItem.setIndexerScore(config.getScore().orElse(0));
searchResultItem.setIndexerScore(config.getScore());
searchResultItem.setGuid(SearchResultIdCalculator.calculateSearchResultId(searchResultItem));
searchResultItem.setAgePrecise(true);
searchResultItem.setDescription(item.getDescription());

View File

@ -72,7 +72,7 @@ public class NzbIndex extends Indexer<NewznabXmlRoot> {
item.setIndexerGuid(matcher.group(1));
item.setCategory(categoryProvider.getNotAvailable());
item.setOriginalCategory("N/A");
item.setIndexerScore(config.getScore().orElse(0));
item.setIndexerScore(config.getScore());
if (item.getDescription() != null) {
item.setHasNfo(rssItem.getDescription().contains("1 NFO") ? HasNfo.YES : HasNfo.NO);
} else {

View File

@ -90,7 +90,7 @@ public class Torznab extends Newznab {
searchResultItem.setCategory(categoryProvider.getNotAvailable());
}
searchResultItem.setHasNfo(HasNfo.NO);
searchResultItem.setIndexerScore(config.getScore().orElse(0));
searchResultItem.setIndexerScore(config.getScore());
searchResultItem.setDownloadType(DownloadType.TORRENT);
searchResultItem.setGuid(SearchResultIdCalculator.calculateSearchResultId(searchResultItem));
return searchResultItem;

View File

@ -111,7 +111,7 @@ public class InternalSearchResultProcessor {
.hash(item.getDuplicateIdentifier())
.indexer(item.getIndexer().getName())
.indexerguid(item.getIndexerGuid())
.indexerscore(item.getIndexer().getConfig().getScore().orElse(null))
.indexerscore(item.getIndexer().getConfig().getScore())
.link(nzbHandler.getDownloadLinkForResults(item.getSearchResultId(), true, item.getDownloadType()))
.originalCategory(item.getOriginalCategory())
.poster(item.getPoster().orElse(null))

View File

@ -22,6 +22,7 @@ import org.springframework.stereotype.Component;
import java.io.File;
import java.io.IOException;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
@ -97,7 +98,7 @@ public class WebAccess {
throw new WebAccessException(response.message(), bodyAsString, response.code());
}
return bodyAsString;
} catch (ConnectException e) {
} catch (ConnectException | SocketTimeoutException e) {
throw new WebAccessException(e);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -275,7 +275,7 @@ main:
backupFolder: "backup"
backupEveryXDays: 7
backupBeforeUpdate: true
configVersion: 15
configVersion: 16
databaseCompactTime: 15000
databaseRetentionTime: 1000
databaseWriteDelay: 5000

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -3,22 +3,30 @@
</div>
<div class="modal-body" style="text-align: left">
<div ng-show="!working">
This allows you to configure NZBHydra in Sonarr / Radarr / Lidarr.<br>
<br>
You can decide if you want to:<br>
<ul>
<div class="well">
This allows you to configure NZBHydra in Sonarr / Radarr / Lidarr.<br>
<br>
You can decide if you want to:<br>
<ul>
<li>a) add NZBHydra as one indexer. This is the default. *darr will make one query to NZBHydra which will then query all indexers and return one unified list of results.</li>
<li>b) add one entry per indexer configured in NZBHydra. *darr will make multiple queries to NZBHydra (one per indexer). This will result in a lot of entries in your NZBHydra history but has the one benefit that should *darr be unable
to
download an NZB from an indexer then NZBHydra then only that indexer entry will be disabled in *darr.
</li>
</ul>
In most cases you should stick with a).<br>
Any indexer entries containing {{nzbhydraName}} in the name will be deleted. I recommend you make a backup of {{::externalToolDisplayName}} before.
<li>a) add NZBHydra as one indexer. This is the default. *darr will make one query to NZBHydra which will then query all indexers and return one unified list of results.</li>
<li>b) add one entry per indexer configured in NZBHydra. *darr will make multiple queries to NZBHydra (one per indexer). This will result in a lot of entries in your NZBHydra history but has the one benefit that should *darr be
unable
to
download an NZB from an indexer then NZBHydra then only that indexer entry will be disabled in *darr.
</li>
</ul>
In most cases you should stick with a).<br>
<br>
Any indexer entries containing {{nzbhydraName}} in the name will be deleted. I recommend you make a backup of {{::externalToolDisplayName}} before.
<br>
<span ng-if="prioritiesConfigured && (externalTool === 'Sonarrv3' || externalTool === 'Radarrv3') && addType === 'PER_INDEXER'">
<br>
This tool supports indexer priorities. Unfortunately where NZBHydra uses higher values for higher priorities this tool uses lower values (0 for highest, 50 for lowest priority). NZBHydra will try to map the priorities accordingly.
<br>
</span>
</div>
<br>
<br>
<div class="form-group row">
<div class="col-md-8" style="text-align: right">
<label>NZBHydra name</label>
@ -108,7 +116,7 @@
<input bs-switch type="checkbox" ng-model="enableAutomaticSearch">
</div>
</div>
<div class="form-group row" ng-show="externalTool !== 'Radarr'">
<div class="col-md-8" style="text-align: right">
<label>Enable interactive search</label>
@ -117,7 +125,16 @@
<input bs-switch type="checkbox" ng-model="enableInteractiveSearch">
</div>
</div>
<div class="form-group row" ng-show="prioritiesConfigured && (externalTool === 'Sonarrv3' || externalTool === 'Radarrv3') && addType === 'PER_INDEXER'">
<div class="col-md-8" style="text-align: right">
<label>Set indexer priorities</label>
</div>
<div class="col-md-12">
<input bs-switch type="checkbox" ng-model="useHydraPriorities">
</div>
</div>
<div class="form-group row">
<div class="col-md-8" style="text-align: right">
<label>Categories</label>
@ -126,7 +143,7 @@
<input type="text" class="form-control" ng-model="categories">
</div>
</div>
<div class="form-group row">
<div class="col-md-8" style="text-align: right">
<label>Additional parameters</label>

View File

@ -7,7 +7,7 @@
<div class="form-group" style="margin-left: 10px">
<div class="input-group">
<input type="number" keep-focus ng-model="indexer.score" class="form-control"
style="width: 43px; height: 34px;">
style="width: 49px; height: 34px;">
<span class="input-group-addon">Priority</span>
</div>
</div>

View File

@ -123,6 +123,7 @@ function ConfigService($http, $q, $cacheFactory, $uibModal, bootstrapped) {
$scope.nzbhydraHost = dialogInfo.nzbhydraHost;
$scope.usenetIndexersConfigured = dialogInfo.usenetIndexersConfigured;
$scope.prioritiesConfigured = dialogInfo.prioritiesConfigured;
$scope.configureForUsenet = dialogInfo.usenetIndexersConfigured;
$scope.torrentIndexersConfigured = dialogInfo.torrentIndexersConfigured;
$scope.configureForTorrents = dialogInfo.torrentIndexersConfigured;
@ -140,6 +141,8 @@ function ConfigService($http, $q, $cacheFactory, $uibModal, bootstrapped) {
$scope.enableInteractiveSearch = true;
$scope.categories = null;
$scope.animeCategories = null;
$scope.priority = 0;
$scope.useHydraPriorities = true;
if (externalTool === "Sonarr" || externalTool === "Sonarrv3") {
$scope.xdarrHost += "8989";
@ -203,7 +206,9 @@ function ConfigService($http, $q, $cacheFactory, $uibModal, bootstrapped) {
seedTime: $scope.seedTime,
seasonPackSeedTime: $scope.seasonPackSeedTime,
discographySeedTime: $scope.discographySeedTime,
addDisabledIndexers: $scope.addDisabledIndexers
addDisabledIndexers: $scope.addDisabledIndexers,
priority: $scope.priority,
useHydraPriorities: $scope.useHydraPriorities
}
localStorageService.set(externalTool, data);
@ -220,12 +225,18 @@ function ConfigService($http, $q, $cacheFactory, $uibModal, bootstrapped) {
RequestsErrorHandler.specificallyHandled(function () {
$scope.completed = false;
$http.post("internalapi/externalTools/configure", data).then(function () {
$http.post("internalapi/externalTools/configure", data).then(function (response) {
updateMessages();
$interval.cancel(updateInterval);
$scope.spinnerActive = false;
$scope.completed = true;
$scope.closeButtonType = "success";
console.log(response);
if (response.data) {
$scope.completed = true;
$scope.closeButtonType = "success";
} else {
$scope.working = false;
$scope.completed = false;
}
}, function (error) {
updateMessages();
console.error(error.data);
@ -235,7 +246,6 @@ function ConfigService($http, $q, $cacheFactory, $uibModal, bootstrapped) {
$scope.working = false;
});
});
};
}

View File

@ -0,0 +1,6 @@
@echo off
rem docker run -p 8990:8989 linuxserver/sonarr:preview
rem docker run -p 8787:8787 hotio/readarr:unstable
docker pull linuxserver/radarr:preview
docker run -p 7878:7878 linuxserver/radarr:preview