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":"radarr.d.ts","sourceRoot":"","sources":["../../src/clients/radarr.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"radarr.d.ts","sourceRoot":"","sources":["../../src/clients/radarr.ts"],"names":[],"mappings":"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"}
|
package/dist/clients/radarr.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);
|
|
@@ -1625,6 +1710,28 @@ var getApiV3LogFileByFilename = (options) => (options.client ?? client).get({
|
|
|
1625
1710
|
url: "/api/v3/log/file/{filename}",
|
|
1626
1711
|
...options
|
|
1627
1712
|
});
|
|
1713
|
+
var getApiV3Manualimport = (options) => (options?.client ?? client).get({
|
|
1714
|
+
security: [{ name: "X-Api-Key", type: "apiKey" }, {
|
|
1715
|
+
in: "query",
|
|
1716
|
+
name: "apikey",
|
|
1717
|
+
type: "apiKey"
|
|
1718
|
+
}],
|
|
1719
|
+
url: "/api/v3/manualimport",
|
|
1720
|
+
...options
|
|
1721
|
+
});
|
|
1722
|
+
var postApiV3Manualimport = (options) => (options?.client ?? client).post({
|
|
1723
|
+
security: [{ name: "X-Api-Key", type: "apiKey" }, {
|
|
1724
|
+
in: "query",
|
|
1725
|
+
name: "apikey",
|
|
1726
|
+
type: "apiKey"
|
|
1727
|
+
}],
|
|
1728
|
+
url: "/api/v3/manualimport",
|
|
1729
|
+
...options,
|
|
1730
|
+
headers: {
|
|
1731
|
+
"Content-Type": "application/json",
|
|
1732
|
+
...options?.headers
|
|
1733
|
+
}
|
|
1734
|
+
});
|
|
1628
1735
|
var getApiV3ConfigMediamanagement = (options) => (options?.client ?? client).get({
|
|
1629
1736
|
security: [{ name: "X-Api-Key", type: "apiKey" }, {
|
|
1630
1737
|
in: "query",
|
|
@@ -2307,8 +2414,8 @@ class RadarrClient extends ServarrBaseClient {
|
|
|
2307
2414
|
getUiConfigById: getApiV3ConfigUiById,
|
|
2308
2415
|
updateUiConfig: putApiV3ConfigUiById
|
|
2309
2416
|
};
|
|
2310
|
-
|
|
2311
|
-
client
|
|
2417
|
+
constructor(config) {
|
|
2418
|
+
super(config, client);
|
|
2312
2419
|
}
|
|
2313
2420
|
async getMovies() {
|
|
2314
2421
|
return getApiV3Movie();
|
|
@@ -2386,6 +2493,24 @@ class RadarrClient extends ServarrBaseClient {
|
|
|
2386
2493
|
async importMovies(movies) {
|
|
2387
2494
|
return postApiV3MovieImport({ body: movies });
|
|
2388
2495
|
}
|
|
2496
|
+
async getManualImport(options = {}) {
|
|
2497
|
+
const query = {};
|
|
2498
|
+
if (options.folder)
|
|
2499
|
+
query.folder = options.folder;
|
|
2500
|
+
if (options.downloadId)
|
|
2501
|
+
query.downloadId = options.downloadId;
|
|
2502
|
+
if (options.movieId !== undefined)
|
|
2503
|
+
query.movieId = options.movieId;
|
|
2504
|
+
if (options.filterExistingFiles !== undefined)
|
|
2505
|
+
query.filterExistingFiles = options.filterExistingFiles;
|
|
2506
|
+
return getApiV3Manualimport(Object.keys(query).length > 0 ? { query } : {});
|
|
2507
|
+
}
|
|
2508
|
+
async reprocessManualImport(files) {
|
|
2509
|
+
return postApiV3Manualimport({ body: files });
|
|
2510
|
+
}
|
|
2511
|
+
async applyManualImport(files, importMode = "auto") {
|
|
2512
|
+
return this.runCommand({ name: "ManualImport", files, importMode });
|
|
2513
|
+
}
|
|
2389
2514
|
async getMovieFiles(movieId, movieFileIds) {
|
|
2390
2515
|
const query = {};
|
|
2391
2516
|
if (movieId !== undefined)
|
|
@@ -2650,3 +2775,6 @@ class RadarrClient extends ServarrBaseClient {
|
|
|
2650
2775
|
export {
|
|
2651
2776
|
RadarrClient
|
|
2652
2777
|
};
|
|
2778
|
+
|
|
2779
|
+
//# debugId=A4462FD453DCB82C64756E2164756E21
|
|
2780
|
+
//# sourceMappingURL=radarr.js.map
|