tsarr 2.9.1 → 2.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +120 -233
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/manual-import.d.ts +30 -0
- package/dist/cli/commands/manual-import.d.ts.map +1 -0
- package/dist/cli/commands/radarr.d.ts.map +1 -1
- package/dist/cli/commands/sonarr.d.ts.map +1 -1
- package/dist/cli/index.js +5230 -4783
- package/dist/cli/index.js.map +133 -0
- package/dist/clients/base.d.ts +8 -3
- package/dist/clients/base.d.ts.map +1 -1
- package/dist/clients/bazarr.d.ts +125 -124
- package/dist/clients/bazarr.d.ts.map +1 -1
- package/dist/clients/bazarr.js +183 -100
- package/dist/clients/bazarr.js.map +22 -0
- package/dist/clients/lidarr.d.ts +148 -147
- package/dist/clients/lidarr.d.ts.map +1 -1
- package/dist/clients/lidarr.js +190 -102
- package/dist/clients/lidarr.js.map +23 -0
- package/dist/clients/prowlarr.d.ts +30 -29
- package/dist/clients/prowlarr.d.ts.map +1 -1
- package/dist/clients/prowlarr.js +190 -102
- package/dist/clients/prowlarr.js.map +23 -0
- package/dist/clients/qbittorrent.d.ts +3 -1
- package/dist/clients/qbittorrent.d.ts.map +1 -1
- package/dist/clients/qbittorrent.js +213 -107
- package/dist/clients/qbittorrent.js.map +21 -0
- package/dist/clients/radarr.d.ts +195 -150
- package/dist/clients/radarr.d.ts.map +1 -1
- package/dist/clients/radarr.js +230 -102
- package/dist/clients/radarr.js.map +23 -0
- package/dist/clients/readarr.d.ts +150 -149
- package/dist/clients/readarr.d.ts.map +1 -1
- package/dist/clients/readarr.js +190 -102
- package/dist/clients/readarr.js.map +23 -0
- package/dist/clients/seerr-types.d.ts +1 -1
- package/dist/clients/seerr-types.d.ts.map +1 -1
- package/dist/clients/seerr.d.ts +17 -16
- package/dist/clients/seerr.d.ts.map +1 -1
- package/dist/clients/seerr.js +183 -100
- package/dist/clients/seerr.js.map +22 -0
- package/dist/clients/sonarr.d.ts +203 -168
- package/dist/clients/sonarr.d.ts.map +1 -1
- package/dist/clients/sonarr.js +206 -112
- package/dist/clients/sonarr.js.map +23 -0
- package/dist/core/client.d.ts +2 -0
- package/dist/core/client.d.ts.map +1 -1
- package/dist/core/fetch.d.ts +23 -0
- package/dist/core/fetch.d.ts.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/types.d.ts +7 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/generated/bazarr/client/client.gen.d.ts.map +1 -1
- package/dist/generated/bazarr/client/types.gen.d.ts +5 -2
- package/dist/generated/bazarr/client/types.gen.d.ts.map +1 -1
- package/dist/generated/bazarr/client/utils.gen.d.ts +5 -1
- package/dist/generated/bazarr/client/utils.gen.d.ts.map +1 -1
- package/dist/generated/lidarr/client/client.gen.d.ts.map +1 -1
- package/dist/generated/lidarr/client/types.gen.d.ts +5 -2
- package/dist/generated/lidarr/client/types.gen.d.ts.map +1 -1
- package/dist/generated/lidarr/client/utils.gen.d.ts +5 -1
- package/dist/generated/lidarr/client/utils.gen.d.ts.map +1 -1
- package/dist/generated/prowlarr/client/client.gen.d.ts.map +1 -1
- package/dist/generated/prowlarr/client/types.gen.d.ts +5 -2
- package/dist/generated/prowlarr/client/types.gen.d.ts.map +1 -1
- package/dist/generated/prowlarr/client/utils.gen.d.ts +5 -1
- package/dist/generated/prowlarr/client/utils.gen.d.ts.map +1 -1
- package/dist/generated/qbittorrent/client/client.gen.d.ts.map +1 -1
- package/dist/generated/qbittorrent/client/types.gen.d.ts +5 -2
- package/dist/generated/qbittorrent/client/types.gen.d.ts.map +1 -1
- package/dist/generated/qbittorrent/client/utils.gen.d.ts +5 -1
- package/dist/generated/qbittorrent/client/utils.gen.d.ts.map +1 -1
- package/dist/generated/radarr/client/client.gen.d.ts.map +1 -1
- package/dist/generated/radarr/client/types.gen.d.ts +5 -2
- package/dist/generated/radarr/client/types.gen.d.ts.map +1 -1
- package/dist/generated/radarr/client/utils.gen.d.ts +5 -1
- package/dist/generated/radarr/client/utils.gen.d.ts.map +1 -1
- package/dist/generated/readarr/client/client.gen.d.ts.map +1 -1
- package/dist/generated/readarr/client/types.gen.d.ts +5 -2
- package/dist/generated/readarr/client/types.gen.d.ts.map +1 -1
- package/dist/generated/readarr/client/utils.gen.d.ts +5 -1
- package/dist/generated/readarr/client/utils.gen.d.ts.map +1 -1
- package/dist/generated/seerr/client/client.gen.d.ts.map +1 -1
- package/dist/generated/seerr/client/types.gen.d.ts +5 -2
- package/dist/generated/seerr/client/types.gen.d.ts.map +1 -1
- package/dist/generated/seerr/client/utils.gen.d.ts +5 -1
- package/dist/generated/seerr/client/utils.gen.d.ts.map +1 -1
- package/dist/generated/seerr/index.d.ts +2 -2
- package/dist/generated/seerr/index.d.ts.map +1 -1
- package/dist/generated/seerr/sdk.gen.d.ts +13 -1
- package/dist/generated/seerr/sdk.gen.d.ts.map +1 -1
- package/dist/generated/seerr/types.gen.d.ts +78 -7
- package/dist/generated/seerr/types.gen.d.ts.map +1 -1
- package/dist/generated/sonarr/client/client.gen.d.ts.map +1 -1
- package/dist/generated/sonarr/client/types.gen.d.ts +5 -2
- package/dist/generated/sonarr/client/types.gen.d.ts.map +1 -1
- package/dist/generated/sonarr/client/utils.gen.d.ts +5 -1
- package/dist/generated/sonarr/client/utils.gen.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/index.js.map +12 -0
- package/dist/tsarr-2.11.0.tgz +0 -0
- package/package.json +18 -9
- package/dist/tsarr-2.9.1.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sonarr.d.ts","sourceRoot":"","sources":["../../src/clients/sonarr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"sonarr.d.ts","sourceRoot":"","sources":["../../src/clients/sonarr.ts"],"names":[],"mappings":"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"}
|
package/dist/clients/sonarr.js
CHANGED
|
@@ -26,6 +26,93 @@ class ConnectionError extends TsarrError {
|
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
|
|
29
|
+
// src/core/fetch.ts
|
|
30
|
+
var DEFAULT_TIMEOUT = 30000;
|
|
31
|
+
var DEFAULT_MAX_RETRIES = 3;
|
|
32
|
+
var DEFAULT_INITIAL_DELAY = 1000;
|
|
33
|
+
var DEFAULT_MAX_DELAY = 1e4;
|
|
34
|
+
var RETRYABLE_STATUS_CODES = new Set([408, 429, 502, 503, 504]);
|
|
35
|
+
function isRetryable(error) {
|
|
36
|
+
if (error instanceof DOMException && error.name === "AbortError") {
|
|
37
|
+
return false;
|
|
38
|
+
}
|
|
39
|
+
if (error instanceof TypeError) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
function getRetryDelay(attempt, initialDelayMs, maxDelayMs) {
|
|
45
|
+
const delay = initialDelayMs * 2 ** attempt;
|
|
46
|
+
const jitter = delay * 0.2 * Math.random();
|
|
47
|
+
return Math.min(delay + jitter, maxDelayMs);
|
|
48
|
+
}
|
|
49
|
+
function createResilientFetch(options = {}) {
|
|
50
|
+
const timeout = options.timeout ?? DEFAULT_TIMEOUT;
|
|
51
|
+
const maxRetries = options.retry ? options.retry.maxRetries ?? DEFAULT_MAX_RETRIES : 0;
|
|
52
|
+
const initialDelayMs = options.retry?.initialDelayMs ?? DEFAULT_INITIAL_DELAY;
|
|
53
|
+
const maxDelayMs = options.retry?.maxDelayMs ?? DEFAULT_MAX_DELAY;
|
|
54
|
+
const resilientFetch = async (input, init) => {
|
|
55
|
+
let lastError;
|
|
56
|
+
const template = createRequestTemplate(input, init);
|
|
57
|
+
for (let attempt = 0;attempt <= maxRetries; attempt++) {
|
|
58
|
+
const controller = new AbortController;
|
|
59
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
60
|
+
const callerSignal = init?.signal;
|
|
61
|
+
if (callerSignal?.aborted) {
|
|
62
|
+
clearTimeout(timeoutId);
|
|
63
|
+
throw callerSignal.reason ?? new DOMException("The operation was aborted.", "AbortError");
|
|
64
|
+
}
|
|
65
|
+
const onCallerAbort = () => controller.abort(callerSignal.reason);
|
|
66
|
+
callerSignal?.addEventListener("abort", onCallerAbort, { once: true });
|
|
67
|
+
try {
|
|
68
|
+
const response = await globalThis.fetch(new Request(template.clone(), { signal: controller.signal }));
|
|
69
|
+
clearTimeout(timeoutId);
|
|
70
|
+
callerSignal?.removeEventListener("abort", onCallerAbort);
|
|
71
|
+
if (RETRYABLE_STATUS_CODES.has(response.status) && attempt < maxRetries) {
|
|
72
|
+
lastError = new ConnectionError(`Request failed with status ${response.status}`);
|
|
73
|
+
const delay = getRetryDelay(attempt, initialDelayMs, maxDelayMs);
|
|
74
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
75
|
+
continue;
|
|
76
|
+
}
|
|
77
|
+
return response;
|
|
78
|
+
} catch (error) {
|
|
79
|
+
clearTimeout(timeoutId);
|
|
80
|
+
callerSignal?.removeEventListener("abort", onCallerAbort);
|
|
81
|
+
if (callerSignal?.aborted) {
|
|
82
|
+
throw callerSignal.reason ?? new DOMException("The operation was aborted.", "AbortError");
|
|
83
|
+
}
|
|
84
|
+
if (error instanceof DOMException && error.name === "AbortError") {
|
|
85
|
+
lastError = new ConnectionError(`Request timed out after ${timeout}ms`);
|
|
86
|
+
if (attempt < maxRetries) {
|
|
87
|
+
const delay = getRetryDelay(attempt, initialDelayMs, maxDelayMs);
|
|
88
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
throw lastError;
|
|
92
|
+
}
|
|
93
|
+
if (isRetryable(error) && attempt < maxRetries) {
|
|
94
|
+
lastError = error;
|
|
95
|
+
const delay = getRetryDelay(attempt, initialDelayMs, maxDelayMs);
|
|
96
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
throw error;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
throw lastError;
|
|
103
|
+
};
|
|
104
|
+
return Object.assign(resilientFetch, {
|
|
105
|
+
preconnect: globalThis.fetch.preconnect?.bind(globalThis.fetch)
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
function createRequestTemplate(input, init) {
|
|
109
|
+
const { signal: _signal, ...requestInit } = init ?? {};
|
|
110
|
+
if (input instanceof Request) {
|
|
111
|
+
return init ? new Request(input.clone(), requestInit) : input.clone();
|
|
112
|
+
}
|
|
113
|
+
return new Request(input, requestInit);
|
|
114
|
+
}
|
|
115
|
+
|
|
29
116
|
// src/core/client.ts
|
|
30
117
|
var DEFAULT_TIMEOUT_MS = 30000;
|
|
31
118
|
function createServarrClient(config) {
|
|
@@ -40,6 +127,10 @@ function createServarrClient(config) {
|
|
|
40
127
|
baseUrl: config.baseUrl.replace(/\/$/, "")
|
|
41
128
|
};
|
|
42
129
|
const timeoutMs = validatedConfig.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
130
|
+
const resilientFetch = createResilientFetch({
|
|
131
|
+
timeout: timeoutMs,
|
|
132
|
+
retry: validatedConfig.retry
|
|
133
|
+
});
|
|
43
134
|
return {
|
|
44
135
|
config: validatedConfig,
|
|
45
136
|
getHeaders: () => ({
|
|
@@ -48,22 +139,28 @@ function createServarrClient(config) {
|
|
|
48
139
|
...validatedConfig.headers
|
|
49
140
|
}),
|
|
50
141
|
getBaseUrl: () => validatedConfig.baseUrl,
|
|
51
|
-
getTimeout: () => timeoutMs
|
|
142
|
+
getTimeout: () => timeoutMs,
|
|
143
|
+
getFetch: () => resilientFetch
|
|
52
144
|
};
|
|
53
145
|
}
|
|
54
146
|
|
|
55
147
|
// src/clients/base.ts
|
|
56
148
|
class ServarrBaseClient {
|
|
57
149
|
clientConfig;
|
|
58
|
-
|
|
150
|
+
rawClient;
|
|
151
|
+
constructor(config, rawClient) {
|
|
152
|
+
this.rawClient = rawClient;
|
|
59
153
|
this.clientConfig = createServarrClient(config);
|
|
60
154
|
this.configureRawClient();
|
|
61
155
|
}
|
|
156
|
+
configureRawClient() {
|
|
157
|
+
this.rawClient.setConfig(this.getClientConfig());
|
|
158
|
+
}
|
|
62
159
|
getClientConfig() {
|
|
63
160
|
return {
|
|
64
161
|
baseUrl: this.clientConfig.getBaseUrl(),
|
|
65
162
|
headers: this.clientConfig.getHeaders(),
|
|
66
|
-
|
|
163
|
+
fetch: this.clientConfig.getFetch()
|
|
67
164
|
};
|
|
68
165
|
}
|
|
69
166
|
async getSystemStatus() {
|
|
@@ -838,126 +935,115 @@ var createClient = (config = {}) => {
|
|
|
838
935
|
return { opts: resolvedOpts, url };
|
|
839
936
|
};
|
|
840
937
|
const request = async (options) => {
|
|
841
|
-
const
|
|
842
|
-
const
|
|
843
|
-
|
|
844
|
-
...opts,
|
|
845
|
-
body: getValidRequestBody(opts)
|
|
846
|
-
};
|
|
847
|
-
let request2 = new Request(url, requestInit);
|
|
848
|
-
for (const fn of interceptors.request.fns) {
|
|
849
|
-
if (fn) {
|
|
850
|
-
request2 = await fn(request2, opts);
|
|
851
|
-
}
|
|
852
|
-
}
|
|
853
|
-
const _fetch = opts.fetch;
|
|
938
|
+
const throwOnError = options.throwOnError ?? _config.throwOnError;
|
|
939
|
+
const responseStyle = options.responseStyle ?? _config.responseStyle;
|
|
940
|
+
let request2;
|
|
854
941
|
let response;
|
|
855
942
|
try {
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
943
|
+
const { opts, url } = await beforeRequest(options);
|
|
944
|
+
const requestInit = {
|
|
945
|
+
redirect: "follow",
|
|
946
|
+
...opts,
|
|
947
|
+
body: getValidRequestBody(opts)
|
|
948
|
+
};
|
|
949
|
+
request2 = new Request(url, requestInit);
|
|
950
|
+
for (const fn of interceptors.request.fns) {
|
|
860
951
|
if (fn) {
|
|
861
|
-
|
|
952
|
+
request2 = await fn(request2, opts);
|
|
862
953
|
}
|
|
863
954
|
}
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
955
|
+
const _fetch = opts.fetch;
|
|
956
|
+
response = await _fetch(request2);
|
|
957
|
+
for (const fn of interceptors.response.fns) {
|
|
958
|
+
if (fn) {
|
|
959
|
+
response = await fn(response, request2, opts);
|
|
960
|
+
}
|
|
867
961
|
}
|
|
868
|
-
|
|
869
|
-
error: finalError2,
|
|
962
|
+
const result = {
|
|
870
963
|
request: request2,
|
|
871
|
-
response
|
|
964
|
+
response
|
|
872
965
|
};
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
966
|
+
if (response.ok) {
|
|
967
|
+
const parseAs = (opts.parseAs === "auto" ? getParseAs(response.headers.get("Content-Type")) : opts.parseAs) ?? "json";
|
|
968
|
+
if (response.status === 204 || response.headers.get("Content-Length") === "0") {
|
|
969
|
+
let emptyData;
|
|
970
|
+
switch (parseAs) {
|
|
971
|
+
case "arrayBuffer":
|
|
972
|
+
case "blob":
|
|
973
|
+
case "text":
|
|
974
|
+
emptyData = await response[parseAs]();
|
|
975
|
+
break;
|
|
976
|
+
case "formData":
|
|
977
|
+
emptyData = new FormData;
|
|
978
|
+
break;
|
|
979
|
+
case "stream":
|
|
980
|
+
emptyData = response.body;
|
|
981
|
+
break;
|
|
982
|
+
case "json":
|
|
983
|
+
default:
|
|
984
|
+
emptyData = {};
|
|
985
|
+
break;
|
|
986
|
+
}
|
|
987
|
+
return opts.responseStyle === "data" ? emptyData : {
|
|
988
|
+
data: emptyData,
|
|
989
|
+
...result
|
|
990
|
+
};
|
|
991
|
+
}
|
|
992
|
+
let data;
|
|
887
993
|
switch (parseAs) {
|
|
888
994
|
case "arrayBuffer":
|
|
889
995
|
case "blob":
|
|
996
|
+
case "formData":
|
|
890
997
|
case "text":
|
|
891
|
-
|
|
998
|
+
data = await response[parseAs]();
|
|
892
999
|
break;
|
|
893
|
-
case "
|
|
894
|
-
|
|
1000
|
+
case "json": {
|
|
1001
|
+
const text = await response.text();
|
|
1002
|
+
data = text ? JSON.parse(text) : {};
|
|
895
1003
|
break;
|
|
1004
|
+
}
|
|
896
1005
|
case "stream":
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
|
|
901
|
-
|
|
902
|
-
|
|
1006
|
+
return opts.responseStyle === "data" ? response.body : {
|
|
1007
|
+
data: response.body,
|
|
1008
|
+
...result
|
|
1009
|
+
};
|
|
1010
|
+
}
|
|
1011
|
+
if (parseAs === "json") {
|
|
1012
|
+
if (opts.responseValidator) {
|
|
1013
|
+
await opts.responseValidator(data);
|
|
1014
|
+
}
|
|
1015
|
+
if (opts.responseTransformer) {
|
|
1016
|
+
data = await opts.responseTransformer(data);
|
|
1017
|
+
}
|
|
903
1018
|
}
|
|
904
|
-
return opts.responseStyle === "data" ?
|
|
905
|
-
data
|
|
1019
|
+
return opts.responseStyle === "data" ? data : {
|
|
1020
|
+
data,
|
|
906
1021
|
...result
|
|
907
1022
|
};
|
|
908
1023
|
}
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
break;
|
|
1024
|
+
const textError = await response.text();
|
|
1025
|
+
let jsonError;
|
|
1026
|
+
try {
|
|
1027
|
+
jsonError = JSON.parse(textError);
|
|
1028
|
+
} catch {}
|
|
1029
|
+
throw jsonError ?? textError;
|
|
1030
|
+
} catch (error) {
|
|
1031
|
+
let finalError = error;
|
|
1032
|
+
for (const fn of interceptors.error.fns) {
|
|
1033
|
+
if (fn) {
|
|
1034
|
+
finalError = await fn(finalError, response, request2, options);
|
|
921
1035
|
}
|
|
922
|
-
case "stream":
|
|
923
|
-
return opts.responseStyle === "data" ? response.body : {
|
|
924
|
-
data: response.body,
|
|
925
|
-
...result
|
|
926
|
-
};
|
|
927
1036
|
}
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
}
|
|
932
|
-
if (opts.responseTransformer) {
|
|
933
|
-
data = await opts.responseTransformer(data);
|
|
934
|
-
}
|
|
1037
|
+
finalError = finalError || {};
|
|
1038
|
+
if (throwOnError) {
|
|
1039
|
+
throw finalError;
|
|
935
1040
|
}
|
|
936
|
-
return
|
|
937
|
-
|
|
938
|
-
|
|
1041
|
+
return responseStyle === "data" ? undefined : {
|
|
1042
|
+
error: finalError,
|
|
1043
|
+
request: request2,
|
|
1044
|
+
response
|
|
939
1045
|
};
|
|
940
1046
|
}
|
|
941
|
-
const textError = await response.text();
|
|
942
|
-
let jsonError;
|
|
943
|
-
try {
|
|
944
|
-
jsonError = JSON.parse(textError);
|
|
945
|
-
} catch {}
|
|
946
|
-
const error = jsonError ?? textError;
|
|
947
|
-
let finalError = error;
|
|
948
|
-
for (const fn of interceptors.error.fns) {
|
|
949
|
-
if (fn) {
|
|
950
|
-
finalError = await fn(error, response, request2, opts);
|
|
951
|
-
}
|
|
952
|
-
}
|
|
953
|
-
finalError = finalError || {};
|
|
954
|
-
if (opts.throwOnError) {
|
|
955
|
-
throw finalError;
|
|
956
|
-
}
|
|
957
|
-
return opts.responseStyle === "data" ? undefined : {
|
|
958
|
-
error: finalError,
|
|
959
|
-
...result
|
|
960
|
-
};
|
|
961
1047
|
};
|
|
962
1048
|
const makeMethodFn = (method) => (options) => request({ ...options, method });
|
|
963
1049
|
const makeSseFn = (method) => async (options) => {
|
|
@@ -965,7 +1051,6 @@ var createClient = (config = {}) => {
|
|
|
965
1051
|
return createSseClient({
|
|
966
1052
|
...opts,
|
|
967
1053
|
body: opts.body,
|
|
968
|
-
headers: opts.headers,
|
|
969
1054
|
method,
|
|
970
1055
|
onRequest: async (url2, init) => {
|
|
971
1056
|
let request2 = new Request(url2, init);
|
|
@@ -2338,8 +2423,8 @@ class SonarrClient extends ServarrBaseClient {
|
|
|
2338
2423
|
getUiConfigById: getApiV3ConfigUiById,
|
|
2339
2424
|
updateUiConfig: putApiV3ConfigUiById
|
|
2340
2425
|
};
|
|
2341
|
-
|
|
2342
|
-
client
|
|
2426
|
+
constructor(config) {
|
|
2427
|
+
super(config, client);
|
|
2343
2428
|
}
|
|
2344
2429
|
async getSystemStatus() {
|
|
2345
2430
|
return client.get({
|
|
@@ -2706,21 +2791,27 @@ class SonarrClient extends ServarrBaseClient {
|
|
|
2706
2791
|
async parseEpisodeInfo(title) {
|
|
2707
2792
|
return getApiV3Parse({ query: { title } });
|
|
2708
2793
|
}
|
|
2709
|
-
async getManualImport(
|
|
2794
|
+
async getManualImport(options = {}) {
|
|
2710
2795
|
const query = {};
|
|
2711
|
-
if (folder)
|
|
2712
|
-
query.folder = folder;
|
|
2713
|
-
if (downloadId)
|
|
2714
|
-
query.downloadId = downloadId;
|
|
2715
|
-
if (seriesId !== undefined)
|
|
2716
|
-
query.seriesId = seriesId;
|
|
2717
|
-
if (filterExistingFiles !== undefined)
|
|
2718
|
-
query.filterExistingFiles = filterExistingFiles;
|
|
2796
|
+
if (options.folder)
|
|
2797
|
+
query.folder = options.folder;
|
|
2798
|
+
if (options.downloadId)
|
|
2799
|
+
query.downloadId = options.downloadId;
|
|
2800
|
+
if (options.seriesId !== undefined)
|
|
2801
|
+
query.seriesId = options.seriesId;
|
|
2802
|
+
if (options.filterExistingFiles !== undefined)
|
|
2803
|
+
query.filterExistingFiles = options.filterExistingFiles;
|
|
2719
2804
|
return getApiV3Manualimport(Object.keys(query).length > 0 ? { query } : {});
|
|
2720
2805
|
}
|
|
2721
|
-
async
|
|
2806
|
+
async reprocessManualImport(files) {
|
|
2722
2807
|
return postApiV3Manualimport({ body: files });
|
|
2723
2808
|
}
|
|
2809
|
+
async processManualImport(files) {
|
|
2810
|
+
return this.reprocessManualImport(files);
|
|
2811
|
+
}
|
|
2812
|
+
async applyManualImport(files, importMode = "auto") {
|
|
2813
|
+
return this.runCommand({ name: "ManualImport", files, importMode });
|
|
2814
|
+
}
|
|
2724
2815
|
async getCommand(id) {
|
|
2725
2816
|
return getApiV3CommandById({ path: { id } });
|
|
2726
2817
|
}
|
|
@@ -2728,3 +2819,6 @@ class SonarrClient extends ServarrBaseClient {
|
|
|
2728
2819
|
export {
|
|
2729
2820
|
SonarrClient
|
|
2730
2821
|
};
|
|
2822
|
+
|
|
2823
|
+
//# debugId=551B818510C05A4B64756E2164756E21
|
|
2824
|
+
//# sourceMappingURL=sonarr.js.map
|