tsarr 2.8.0 → 2.9.1
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/README.md +7 -5
- package/dist/cli/commands/bazarr.d.ts +2 -0
- package/dist/cli/commands/bazarr.d.ts.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/lidarr.d.ts +2 -0
- package/dist/cli/commands/lidarr.d.ts.map +1 -1
- package/dist/cli/commands/radarr.d.ts.map +1 -1
- package/dist/cli/commands/readarr.d.ts +2 -0
- package/dist/cli/commands/readarr.d.ts.map +1 -1
- package/dist/cli/commands/sonarr.d.ts.map +1 -1
- package/dist/cli/index.js +2722 -3054
- package/dist/clients/base.d.ts +131 -0
- package/dist/clients/base.d.ts.map +1 -0
- package/dist/clients/bazarr.d.ts +0 -1
- package/dist/clients/bazarr.d.ts.map +1 -1
- package/dist/clients/bazarr.js +8 -3
- package/dist/clients/lidarr.d.ts +25 -683
- package/dist/clients/lidarr.d.ts.map +1 -1
- package/dist/clients/lidarr.js +227 -197
- package/dist/clients/prowlarr.d.ts +26 -640
- package/dist/clients/prowlarr.d.ts.map +1 -1
- package/dist/clients/prowlarr.js +235 -176
- package/dist/clients/qbittorrent.d.ts +1 -17
- package/dist/clients/qbittorrent.d.ts.map +1 -1
- package/dist/clients/qbittorrent.js +8 -2
- package/dist/clients/radarr.d.ts +5 -659
- package/dist/clients/radarr.d.ts.map +1 -1
- package/dist/clients/radarr.js +227 -165
- package/dist/clients/readarr.d.ts +5 -637
- package/dist/clients/readarr.d.ts.map +1 -1
- package/dist/clients/readarr.js +227 -165
- package/dist/clients/seerr.d.ts +0 -1
- package/dist/clients/seerr.d.ts.map +1 -1
- package/dist/clients/seerr.js +8 -3
- package/dist/clients/sonarr.d.ts +182 -774
- package/dist/clients/sonarr.d.ts.map +1 -1
- package/dist/clients/sonarr.js +250 -158
- package/dist/core/client.d.ts +1 -0
- package/dist/core/client.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/tsarr-2.9.1.tgz +0 -0
- package/package.json +2 -4
- package/dist/tsarr-2.8.0.tgz +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sonarr.d.ts","sourceRoot":"","sources":["../../src/clients/sonarr.ts"],"names":[],"mappings":"
|
|
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
|
@@ -27,6 +27,7 @@ class ConnectionError extends TsarrError {
|
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
// src/core/client.ts
|
|
30
|
+
var DEFAULT_TIMEOUT_MS = 30000;
|
|
30
31
|
function createServarrClient(config) {
|
|
31
32
|
if (!config.apiKey) {
|
|
32
33
|
throw new ApiKeyError;
|
|
@@ -38,6 +39,7 @@ function createServarrClient(config) {
|
|
|
38
39
|
...config,
|
|
39
40
|
baseUrl: config.baseUrl.replace(/\/$/, "")
|
|
40
41
|
};
|
|
42
|
+
const timeoutMs = validatedConfig.timeout ?? DEFAULT_TIMEOUT_MS;
|
|
41
43
|
return {
|
|
42
44
|
config: validatedConfig,
|
|
43
45
|
getHeaders: () => ({
|
|
@@ -45,10 +47,180 @@ function createServarrClient(config) {
|
|
|
45
47
|
"Content-Type": "application/json",
|
|
46
48
|
...validatedConfig.headers
|
|
47
49
|
}),
|
|
48
|
-
getBaseUrl: () => validatedConfig.baseUrl
|
|
50
|
+
getBaseUrl: () => validatedConfig.baseUrl,
|
|
51
|
+
getTimeout: () => timeoutMs
|
|
49
52
|
};
|
|
50
53
|
}
|
|
51
54
|
|
|
55
|
+
// src/clients/base.ts
|
|
56
|
+
class ServarrBaseClient {
|
|
57
|
+
clientConfig;
|
|
58
|
+
constructor(config) {
|
|
59
|
+
this.clientConfig = createServarrClient(config);
|
|
60
|
+
this.configureRawClient();
|
|
61
|
+
}
|
|
62
|
+
getClientConfig() {
|
|
63
|
+
return {
|
|
64
|
+
baseUrl: this.clientConfig.getBaseUrl(),
|
|
65
|
+
headers: this.clientConfig.getHeaders(),
|
|
66
|
+
signal: AbortSignal.timeout(this.clientConfig.getTimeout())
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
async getSystemStatus() {
|
|
70
|
+
return this.ops.getSystemStatus();
|
|
71
|
+
}
|
|
72
|
+
async getHealth() {
|
|
73
|
+
return this.ops.getHealth();
|
|
74
|
+
}
|
|
75
|
+
async getTags() {
|
|
76
|
+
return this.ops.getTags();
|
|
77
|
+
}
|
|
78
|
+
async addTag(tag) {
|
|
79
|
+
return this.ops.createTag({ body: tag });
|
|
80
|
+
}
|
|
81
|
+
async getTag(id) {
|
|
82
|
+
return this.ops.getTagById({ path: { id } });
|
|
83
|
+
}
|
|
84
|
+
async updateTag(id, tag) {
|
|
85
|
+
return this.ops.updateTagById({ path: { id: String(id) }, body: tag });
|
|
86
|
+
}
|
|
87
|
+
async deleteTag(id) {
|
|
88
|
+
return this.ops.deleteTagById({ path: { id } });
|
|
89
|
+
}
|
|
90
|
+
async getTagDetails() {
|
|
91
|
+
return this.ops.getTagDetails();
|
|
92
|
+
}
|
|
93
|
+
async getTagDetailById(id) {
|
|
94
|
+
return this.ops.getTagDetailById({ path: { id } });
|
|
95
|
+
}
|
|
96
|
+
async getNotifications() {
|
|
97
|
+
return this.ops.getNotifications();
|
|
98
|
+
}
|
|
99
|
+
async getNotification(id) {
|
|
100
|
+
return this.ops.getNotificationById({ path: { id } });
|
|
101
|
+
}
|
|
102
|
+
async addNotification(notification) {
|
|
103
|
+
return this.ops.createNotification({ body: notification });
|
|
104
|
+
}
|
|
105
|
+
async updateNotification(id, notification) {
|
|
106
|
+
return this.ops.updateNotificationById({ path: { id: String(id) }, body: notification });
|
|
107
|
+
}
|
|
108
|
+
async deleteNotification(id) {
|
|
109
|
+
return this.ops.deleteNotificationById({ path: { id } });
|
|
110
|
+
}
|
|
111
|
+
async getNotificationSchema() {
|
|
112
|
+
return this.ops.getNotificationSchema();
|
|
113
|
+
}
|
|
114
|
+
async testNotification(notification) {
|
|
115
|
+
return this.ops.testNotification({ body: notification });
|
|
116
|
+
}
|
|
117
|
+
async testAllNotifications() {
|
|
118
|
+
return this.ops.testAllNotifications();
|
|
119
|
+
}
|
|
120
|
+
async getDownloadClients() {
|
|
121
|
+
return this.ops.getDownloadClients();
|
|
122
|
+
}
|
|
123
|
+
async getDownloadClient(id) {
|
|
124
|
+
return this.ops.getDownloadClientById({ path: { id } });
|
|
125
|
+
}
|
|
126
|
+
async addDownloadClient(client) {
|
|
127
|
+
return this.ops.createDownloadClient({ body: client });
|
|
128
|
+
}
|
|
129
|
+
async updateDownloadClient(id, client) {
|
|
130
|
+
return this.ops.updateDownloadClientById({ path: { id: String(id) }, body: client });
|
|
131
|
+
}
|
|
132
|
+
async deleteDownloadClient(id) {
|
|
133
|
+
return this.ops.deleteDownloadClientById({ path: { id } });
|
|
134
|
+
}
|
|
135
|
+
async getDownloadClientSchema() {
|
|
136
|
+
return this.ops.getDownloadClientSchema();
|
|
137
|
+
}
|
|
138
|
+
async testDownloadClient(client) {
|
|
139
|
+
return this.ops.testDownloadClient({ body: client });
|
|
140
|
+
}
|
|
141
|
+
async testAllDownloadClients() {
|
|
142
|
+
return this.ops.testAllDownloadClients();
|
|
143
|
+
}
|
|
144
|
+
async getIndexers() {
|
|
145
|
+
return this.ops.getIndexers();
|
|
146
|
+
}
|
|
147
|
+
async getIndexer(id) {
|
|
148
|
+
return this.ops.getIndexerById({ path: { id } });
|
|
149
|
+
}
|
|
150
|
+
async addIndexer(indexer) {
|
|
151
|
+
return this.ops.createIndexer({ body: indexer });
|
|
152
|
+
}
|
|
153
|
+
async updateIndexer(id, indexer) {
|
|
154
|
+
return this.ops.updateIndexerById({ path: { id: String(id) }, body: indexer });
|
|
155
|
+
}
|
|
156
|
+
async deleteIndexer(id) {
|
|
157
|
+
return this.ops.deleteIndexerById({ path: { id } });
|
|
158
|
+
}
|
|
159
|
+
async getIndexerSchema() {
|
|
160
|
+
return this.ops.getIndexerSchema();
|
|
161
|
+
}
|
|
162
|
+
async testIndexer(indexer) {
|
|
163
|
+
return this.ops.testIndexer({ body: indexer });
|
|
164
|
+
}
|
|
165
|
+
async testAllIndexers() {
|
|
166
|
+
return this.ops.testAllIndexers();
|
|
167
|
+
}
|
|
168
|
+
async restartSystem() {
|
|
169
|
+
return this.ops.restartSystem();
|
|
170
|
+
}
|
|
171
|
+
async shutdownSystem() {
|
|
172
|
+
return this.ops.shutdownSystem();
|
|
173
|
+
}
|
|
174
|
+
async getSystemBackups() {
|
|
175
|
+
return this.ops.getBackups();
|
|
176
|
+
}
|
|
177
|
+
async deleteSystemBackup(id) {
|
|
178
|
+
return this.ops.deleteBackup({ path: { id } });
|
|
179
|
+
}
|
|
180
|
+
async restoreSystemBackup(id) {
|
|
181
|
+
return this.ops.restoreBackup({ path: { id } });
|
|
182
|
+
}
|
|
183
|
+
async uploadSystemBackup() {
|
|
184
|
+
return this.ops.uploadBackup();
|
|
185
|
+
}
|
|
186
|
+
async getLogFiles() {
|
|
187
|
+
return this.ops.getLogFiles();
|
|
188
|
+
}
|
|
189
|
+
async getLogFileByName(filename) {
|
|
190
|
+
return this.ops.getLogFileByName({ path: { filename } });
|
|
191
|
+
}
|
|
192
|
+
async runCommand(command) {
|
|
193
|
+
return this.ops.runCommand({ body: command });
|
|
194
|
+
}
|
|
195
|
+
async getCommands() {
|
|
196
|
+
return this.ops.getCommands();
|
|
197
|
+
}
|
|
198
|
+
async getHostConfig() {
|
|
199
|
+
return this.ops.getHostConfig();
|
|
200
|
+
}
|
|
201
|
+
async getHostConfigById(id) {
|
|
202
|
+
return this.ops.getHostConfigById({ path: { id } });
|
|
203
|
+
}
|
|
204
|
+
async updateHostConfig(id, config) {
|
|
205
|
+
return this.ops.updateHostConfig({ path: { id: String(id) }, body: config });
|
|
206
|
+
}
|
|
207
|
+
async getUiConfig() {
|
|
208
|
+
return this.ops.getUiConfig();
|
|
209
|
+
}
|
|
210
|
+
async getUiConfigById(id) {
|
|
211
|
+
return this.ops.getUiConfigById({ path: { id } });
|
|
212
|
+
}
|
|
213
|
+
async updateUiConfig(id, config) {
|
|
214
|
+
return this.ops.updateUiConfig({ path: { id: String(id) }, body: config });
|
|
215
|
+
}
|
|
216
|
+
updateConfig(newConfig) {
|
|
217
|
+
const updatedConfig = { ...this.clientConfig.config, ...newConfig };
|
|
218
|
+
this.clientConfig = createServarrClient(updatedConfig);
|
|
219
|
+
this.configureRawClient();
|
|
220
|
+
return this.clientConfig.config;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
52
224
|
// src/generated/sonarr/core/bodySerializer.gen.ts
|
|
53
225
|
var jsonBodySerializer = {
|
|
54
226
|
bodySerializer: (body) => JSON.stringify(body, (_key, value) => typeof value === "bigint" ? value.toString() : value)
|
|
@@ -1536,6 +1708,24 @@ var getApiV3Log = (options) => (options?.client ?? client).get({
|
|
|
1536
1708
|
url: "/api/v3/log",
|
|
1537
1709
|
...options
|
|
1538
1710
|
});
|
|
1711
|
+
var getApiV3LogFile = (options) => (options?.client ?? client).get({
|
|
1712
|
+
security: [{ name: "X-Api-Key", type: "apiKey" }, {
|
|
1713
|
+
in: "query",
|
|
1714
|
+
name: "apikey",
|
|
1715
|
+
type: "apiKey"
|
|
1716
|
+
}],
|
|
1717
|
+
url: "/api/v3/log/file",
|
|
1718
|
+
...options
|
|
1719
|
+
});
|
|
1720
|
+
var getApiV3LogFileByFilename = (options) => (options.client ?? client).get({
|
|
1721
|
+
security: [{ name: "X-Api-Key", type: "apiKey" }, {
|
|
1722
|
+
in: "query",
|
|
1723
|
+
name: "apikey",
|
|
1724
|
+
type: "apiKey"
|
|
1725
|
+
}],
|
|
1726
|
+
url: "/api/v3/log/file/{filename}",
|
|
1727
|
+
...options
|
|
1728
|
+
});
|
|
1539
1729
|
var getApiV3Manualimport = (options) => (options?.client ?? client).get({
|
|
1540
1730
|
security: [{ name: "X-Api-Key", type: "apiKey" }, {
|
|
1541
1731
|
in: "query",
|
|
@@ -2096,17 +2286,60 @@ var getApiV3Update = (options) => (options?.client ?? client).get({
|
|
|
2096
2286
|
...options
|
|
2097
2287
|
});
|
|
2098
2288
|
// src/clients/sonarr.ts
|
|
2099
|
-
class SonarrClient {
|
|
2100
|
-
|
|
2101
|
-
|
|
2102
|
-
|
|
2103
|
-
|
|
2104
|
-
|
|
2105
|
-
|
|
2106
|
-
|
|
2107
|
-
|
|
2108
|
-
|
|
2109
|
-
|
|
2289
|
+
class SonarrClient extends ServarrBaseClient {
|
|
2290
|
+
ops = {
|
|
2291
|
+
getSystemStatus: () => Promise.resolve(),
|
|
2292
|
+
getHealth: () => Promise.resolve(),
|
|
2293
|
+
getTags: getApiV3Tag,
|
|
2294
|
+
createTag: postApiV3Tag,
|
|
2295
|
+
getTagById: getApiV3TagById,
|
|
2296
|
+
updateTagById: putApiV3TagById,
|
|
2297
|
+
deleteTagById: deleteApiV3TagById,
|
|
2298
|
+
getTagDetails: getApiV3TagDetail,
|
|
2299
|
+
getTagDetailById: getApiV3TagDetailById,
|
|
2300
|
+
getNotifications: getApiV3Notification,
|
|
2301
|
+
createNotification: postApiV3Notification,
|
|
2302
|
+
getNotificationById: getApiV3NotificationById,
|
|
2303
|
+
updateNotificationById: putApiV3NotificationById,
|
|
2304
|
+
deleteNotificationById: deleteApiV3NotificationById,
|
|
2305
|
+
getNotificationSchema: getApiV3NotificationSchema,
|
|
2306
|
+
testNotification: postApiV3NotificationTest,
|
|
2307
|
+
testAllNotifications: postApiV3NotificationTestall,
|
|
2308
|
+
getDownloadClients: getApiV3Downloadclient,
|
|
2309
|
+
createDownloadClient: postApiV3Downloadclient,
|
|
2310
|
+
getDownloadClientById: getApiV3DownloadclientById,
|
|
2311
|
+
updateDownloadClientById: putApiV3DownloadclientById,
|
|
2312
|
+
deleteDownloadClientById: deleteApiV3DownloadclientById,
|
|
2313
|
+
getDownloadClientSchema: getApiV3DownloadclientSchema,
|
|
2314
|
+
testDownloadClient: postApiV3DownloadclientTest,
|
|
2315
|
+
testAllDownloadClients: postApiV3DownloadclientTestall,
|
|
2316
|
+
getIndexers: getApiV3Indexer,
|
|
2317
|
+
createIndexer: postApiV3Indexer,
|
|
2318
|
+
getIndexerById: getApiV3IndexerById,
|
|
2319
|
+
updateIndexerById: putApiV3IndexerById,
|
|
2320
|
+
deleteIndexerById: deleteApiV3IndexerById,
|
|
2321
|
+
getIndexerSchema: getApiV3IndexerSchema,
|
|
2322
|
+
testIndexer: postApiV3IndexerTest,
|
|
2323
|
+
testAllIndexers: postApiV3IndexerTestall,
|
|
2324
|
+
restartSystem: postApiV3SystemRestart,
|
|
2325
|
+
shutdownSystem: postApiV3SystemShutdown,
|
|
2326
|
+
getBackups: getApiV3SystemBackup,
|
|
2327
|
+
deleteBackup: deleteApiV3SystemBackupById,
|
|
2328
|
+
restoreBackup: postApiV3SystemBackupRestoreById,
|
|
2329
|
+
uploadBackup: postApiV3SystemBackupRestoreUpload,
|
|
2330
|
+
getLogFiles: getApiV3LogFile,
|
|
2331
|
+
getLogFileByName: getApiV3LogFileByFilename,
|
|
2332
|
+
runCommand: postApiV3Command,
|
|
2333
|
+
getCommands: getApiV3Command,
|
|
2334
|
+
getHostConfig: getApiV3ConfigHost,
|
|
2335
|
+
getHostConfigById: getApiV3ConfigHostById,
|
|
2336
|
+
updateHostConfig: putApiV3ConfigHostById,
|
|
2337
|
+
getUiConfig: getApiV3ConfigUi,
|
|
2338
|
+
getUiConfigById: getApiV3ConfigUiById,
|
|
2339
|
+
updateUiConfig: putApiV3ConfigUiById
|
|
2340
|
+
};
|
|
2341
|
+
configureRawClient() {
|
|
2342
|
+
client.setConfig(this.getClientConfig());
|
|
2110
2343
|
}
|
|
2111
2344
|
async getSystemStatus() {
|
|
2112
2345
|
return client.get({
|
|
@@ -2122,6 +2355,9 @@ class SonarrClient {
|
|
|
2122
2355
|
baseUrl: this.clientConfig.getBaseUrl()
|
|
2123
2356
|
});
|
|
2124
2357
|
}
|
|
2358
|
+
async getApi() {
|
|
2359
|
+
return getApi();
|
|
2360
|
+
}
|
|
2125
2361
|
async getSeries() {
|
|
2126
2362
|
return getApiV3Series();
|
|
2127
2363
|
}
|
|
@@ -2180,15 +2416,6 @@ class SonarrClient {
|
|
|
2180
2416
|
async getUpdateSetting() {
|
|
2181
2417
|
return getApiV3Update();
|
|
2182
2418
|
}
|
|
2183
|
-
async getHostConfig() {
|
|
2184
|
-
return getApiV3ConfigHost();
|
|
2185
|
-
}
|
|
2186
|
-
async getHostConfigById(id) {
|
|
2187
|
-
return getApiV3ConfigHostById({ path: { id } });
|
|
2188
|
-
}
|
|
2189
|
-
async updateHostConfig(id, config) {
|
|
2190
|
-
return putApiV3ConfigHostById({ path: { id }, body: config });
|
|
2191
|
-
}
|
|
2192
2419
|
async getNamingConfig() {
|
|
2193
2420
|
return getApiV3ConfigNaming();
|
|
2194
2421
|
}
|
|
@@ -2210,57 +2437,9 @@ class SonarrClient {
|
|
|
2210
2437
|
async updateMediaManagementConfig(id, config) {
|
|
2211
2438
|
return putApiV3ConfigMediamanagementById({ path: { id }, body: config });
|
|
2212
2439
|
}
|
|
2213
|
-
async getUiConfig() {
|
|
2214
|
-
return getApiV3ConfigUi();
|
|
2215
|
-
}
|
|
2216
|
-
async getUiConfigById(id) {
|
|
2217
|
-
return getApiV3ConfigUiById({ path: { id } });
|
|
2218
|
-
}
|
|
2219
|
-
async updateUiConfig(id, config) {
|
|
2220
|
-
return putApiV3ConfigUiById({ path: { id }, body: config });
|
|
2221
|
-
}
|
|
2222
|
-
async restartSystem() {
|
|
2223
|
-
return postApiV3SystemRestart();
|
|
2224
|
-
}
|
|
2225
|
-
async shutdownSystem() {
|
|
2226
|
-
return postApiV3SystemShutdown();
|
|
2227
|
-
}
|
|
2228
|
-
async getSystemBackups() {
|
|
2229
|
-
return getApiV3SystemBackup();
|
|
2230
|
-
}
|
|
2231
|
-
async deleteSystemBackup(id) {
|
|
2232
|
-
return deleteApiV3SystemBackupById({ path: { id } });
|
|
2233
|
-
}
|
|
2234
|
-
async restoreSystemBackup(id) {
|
|
2235
|
-
return postApiV3SystemBackupRestoreById({ path: { id } });
|
|
2236
|
-
}
|
|
2237
|
-
async uploadSystemBackup() {
|
|
2238
|
-
return postApiV3SystemBackupRestoreUpload();
|
|
2239
|
-
}
|
|
2240
2440
|
async getDiskSpace() {
|
|
2241
2441
|
return getApiV3Diskspace();
|
|
2242
2442
|
}
|
|
2243
|
-
async getTags() {
|
|
2244
|
-
return getApiV3Tag();
|
|
2245
|
-
}
|
|
2246
|
-
async addTag(tag) {
|
|
2247
|
-
return postApiV3Tag({ body: tag });
|
|
2248
|
-
}
|
|
2249
|
-
async getTag(id) {
|
|
2250
|
-
return getApiV3TagById({ path: { id } });
|
|
2251
|
-
}
|
|
2252
|
-
async updateTag(id, tag) {
|
|
2253
|
-
return putApiV3TagById({ path: { id }, body: tag });
|
|
2254
|
-
}
|
|
2255
|
-
async deleteTag(id) {
|
|
2256
|
-
return deleteApiV3TagById({ path: { id } });
|
|
2257
|
-
}
|
|
2258
|
-
async getTagDetails() {
|
|
2259
|
-
return getApiV3TagDetail();
|
|
2260
|
-
}
|
|
2261
|
-
async getTagDetailById(id) {
|
|
2262
|
-
return getApiV3TagDetailById({ path: { id } });
|
|
2263
|
-
}
|
|
2264
2443
|
async getEpisodes(seriesId, episodeIds) {
|
|
2265
2444
|
const query = {};
|
|
2266
2445
|
if (seriesId !== undefined)
|
|
@@ -2343,60 +2522,12 @@ class SonarrClient {
|
|
|
2343
2522
|
async getCustomFormatSchema() {
|
|
2344
2523
|
return getApiV3CustomformatSchema();
|
|
2345
2524
|
}
|
|
2346
|
-
async getDownloadClients() {
|
|
2347
|
-
return getApiV3Downloadclient();
|
|
2348
|
-
}
|
|
2349
|
-
async getDownloadClient(id) {
|
|
2350
|
-
return getApiV3DownloadclientById({ path: { id } });
|
|
2351
|
-
}
|
|
2352
|
-
async addDownloadClient(client2) {
|
|
2353
|
-
return postApiV3Downloadclient({ body: client2 });
|
|
2354
|
-
}
|
|
2355
|
-
async updateDownloadClient(id, client2) {
|
|
2356
|
-
return putApiV3DownloadclientById({ path: { id }, body: client2 });
|
|
2357
|
-
}
|
|
2358
|
-
async deleteDownloadClient(id) {
|
|
2359
|
-
return deleteApiV3DownloadclientById({ path: { id } });
|
|
2360
|
-
}
|
|
2361
2525
|
async updateDownloadClientsBulk(clients) {
|
|
2362
2526
|
return putApiV3DownloadclientBulk({ body: clients });
|
|
2363
2527
|
}
|
|
2364
2528
|
async deleteDownloadClientsBulk(ids) {
|
|
2365
2529
|
return deleteApiV3DownloadclientBulk({ body: { ids } });
|
|
2366
2530
|
}
|
|
2367
|
-
async getDownloadClientSchema() {
|
|
2368
|
-
return getApiV3DownloadclientSchema();
|
|
2369
|
-
}
|
|
2370
|
-
async testDownloadClient(client2) {
|
|
2371
|
-
return postApiV3DownloadclientTest({ body: client2 });
|
|
2372
|
-
}
|
|
2373
|
-
async testAllDownloadClients() {
|
|
2374
|
-
return postApiV3DownloadclientTestall();
|
|
2375
|
-
}
|
|
2376
|
-
async getIndexers() {
|
|
2377
|
-
return getApiV3Indexer();
|
|
2378
|
-
}
|
|
2379
|
-
async getIndexer(id) {
|
|
2380
|
-
return getApiV3IndexerById({ path: { id } });
|
|
2381
|
-
}
|
|
2382
|
-
async addIndexer(indexer) {
|
|
2383
|
-
return postApiV3Indexer({ body: indexer });
|
|
2384
|
-
}
|
|
2385
|
-
async updateIndexer(id, indexer) {
|
|
2386
|
-
return putApiV3IndexerById({ path: { id }, body: indexer });
|
|
2387
|
-
}
|
|
2388
|
-
async deleteIndexer(id) {
|
|
2389
|
-
return deleteApiV3IndexerById({ path: { id } });
|
|
2390
|
-
}
|
|
2391
|
-
async getIndexerSchema() {
|
|
2392
|
-
return getApiV3IndexerSchema();
|
|
2393
|
-
}
|
|
2394
|
-
async testIndexer(indexer) {
|
|
2395
|
-
return postApiV3IndexerTest({ body: indexer });
|
|
2396
|
-
}
|
|
2397
|
-
async testAllIndexers() {
|
|
2398
|
-
return postApiV3IndexerTestall();
|
|
2399
|
-
}
|
|
2400
2531
|
async getImportLists() {
|
|
2401
2532
|
return getApiV3Importlist();
|
|
2402
2533
|
}
|
|
@@ -2421,39 +2552,6 @@ class SonarrClient {
|
|
|
2421
2552
|
async testAllImportLists() {
|
|
2422
2553
|
return postApiV3ImportlistTestall();
|
|
2423
2554
|
}
|
|
2424
|
-
async getNotifications() {
|
|
2425
|
-
return getApiV3Notification();
|
|
2426
|
-
}
|
|
2427
|
-
async getNotification(id) {
|
|
2428
|
-
return getApiV3NotificationById({ path: { id } });
|
|
2429
|
-
}
|
|
2430
|
-
async addNotification(notification) {
|
|
2431
|
-
return postApiV3Notification({ body: notification });
|
|
2432
|
-
}
|
|
2433
|
-
async updateNotification(id, notification) {
|
|
2434
|
-
return putApiV3NotificationById({ path: { id }, body: notification });
|
|
2435
|
-
}
|
|
2436
|
-
async deleteNotification(id) {
|
|
2437
|
-
return deleteApiV3NotificationById({ path: { id } });
|
|
2438
|
-
}
|
|
2439
|
-
async getNotificationSchema() {
|
|
2440
|
-
return getApiV3NotificationSchema();
|
|
2441
|
-
}
|
|
2442
|
-
async testNotification(notification) {
|
|
2443
|
-
return postApiV3NotificationTest({ body: notification });
|
|
2444
|
-
}
|
|
2445
|
-
async testAllNotifications() {
|
|
2446
|
-
return postApiV3NotificationTestall();
|
|
2447
|
-
}
|
|
2448
|
-
async runCommand(command) {
|
|
2449
|
-
return postApiV3Command({ body: command });
|
|
2450
|
-
}
|
|
2451
|
-
async getCommands() {
|
|
2452
|
-
return getApiV3Command();
|
|
2453
|
-
}
|
|
2454
|
-
async getCommand(id) {
|
|
2455
|
-
return getApiV3CommandById({ path: { id } });
|
|
2456
|
-
}
|
|
2457
2555
|
async getHistory(page, pageSize, sortKey, sortDirection, seriesId, downloadId) {
|
|
2458
2556
|
const query = {};
|
|
2459
2557
|
if (page !== undefined)
|
|
@@ -2623,14 +2721,8 @@ class SonarrClient {
|
|
|
2623
2721
|
async processManualImport(files) {
|
|
2624
2722
|
return postApiV3Manualimport({ body: files });
|
|
2625
2723
|
}
|
|
2626
|
-
|
|
2627
|
-
|
|
2628
|
-
this.clientConfig = createServarrClient(updatedConfig);
|
|
2629
|
-
client.setConfig({
|
|
2630
|
-
baseUrl: this.clientConfig.getBaseUrl(),
|
|
2631
|
-
headers: this.clientConfig.getHeaders()
|
|
2632
|
-
});
|
|
2633
|
-
return this.clientConfig.config;
|
|
2724
|
+
async getCommand(id) {
|
|
2725
|
+
return getApiV3CommandById({ path: { id } });
|
|
2634
2726
|
}
|
|
2635
2727
|
}
|
|
2636
2728
|
export {
|
package/dist/core/client.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export declare function createServarrClient(config: ServarrClientConfig): {
|
|
|
11
11
|
'Content-Type': string;
|
|
12
12
|
};
|
|
13
13
|
getBaseUrl: () => string;
|
|
14
|
+
getTimeout: () => number;
|
|
14
15
|
};
|
|
15
16
|
export declare function validateApiKey(apiKey: string | undefined): string;
|
|
16
17
|
export declare function validateBaseUrl(baseUrl: string | undefined): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,SAAS,CAAC;AAInD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB;;;;;;;;;;;;;EA0B9D;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKjE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAmBnE"}
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
class t extends Error{code;statusCode;details;constructor(r,e,
|
|
1
|
+
class t extends Error{code;statusCode;details;constructor(r,e,i,l){super(r);this.code=e;this.statusCode=i;this.details=l;this.name="TsarrError"}}class n extends t{constructor(r="Invalid or missing API key"){super(r,"API_KEY_ERROR",401);this.name="ApiKeyError"}}class o extends t{constructor(r,e){super(r,"CONNECTION_ERROR",void 0,e);this.name="ConnectionError"}}class s extends t{constructor(r,e){super(r,"VALIDATION_ERROR",void 0,e);this.name="ValidationError"}}class a extends t{constructor(r){super(`Resource not found: ${r}`,"NOT_FOUND",404);this.name="NotFoundError"}}var p=30000;function f(r){if(!r.apiKey)throw new n;if(!r.baseUrl)throw new o("No base URL provided");let e={...r,baseUrl:r.baseUrl.replace(/\/$/,"")},i=e.timeout??p;return{config:e,getHeaders:()=>({"X-Api-Key":e.apiKey,"Content-Type":"application/json",...e.headers}),getBaseUrl:()=>e.baseUrl,getTimeout:()=>i}}function m(r){if(!r||r.trim()==="")throw new n;return r.trim()}function x(r){if(!r||r.trim()==="")throw new o("No base URL provided");let e;try{e=new URL(r)}catch{throw new o(`Failed to connect: Invalid URL: ${r}`)}if(e.protocol==="http:"&&!d(e.hostname))console.warn(`Warning: Using unencrypted HTTP for remote URL "${e.host}". Consider using HTTPS to protect your API key in transit.`);return r.trim().replace(/\/$/,"")}function d(r){return r==="localhost"||r==="127.0.0.1"||r==="::1"||r==="0.0.0.0"||r.endsWith(".local")||/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(r)}export{x as validateBaseUrl,m as validateApiKey,f as createServarrClient,s as ValidationError,t as TsarrError,b as SonarrClient,M as Sonarr,S as SeerrClient,H as Seerr,I as ReadarrClient,D as Readarr,N as RadarrClient,$ as Radarr,L as QBittorrentClient,F as QBittorrent,U as ProwlarrClient,k as Prowlarr,a as NotFoundError,h as LidarrClient,K as Lidarr,o as ConnectionError,w as BazarrClient,B as Bazarr,n as ApiKeyError};
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tsarr",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.9.1",
|
|
4
4
|
"author": "Robbe Verhelst",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -87,7 +87,7 @@
|
|
|
87
87
|
},
|
|
88
88
|
"description": "Type-safe TypeScript SDK for Servarr APIs (Radarr, Sonarr, etc.)",
|
|
89
89
|
"engines": {
|
|
90
|
-
"node": ">=24.
|
|
90
|
+
"node": ">=24.15.0"
|
|
91
91
|
},
|
|
92
92
|
"files": [
|
|
93
93
|
"dist",
|
|
@@ -132,8 +132,6 @@
|
|
|
132
132
|
"generate": "bun run scripts/generate.ts",
|
|
133
133
|
"refresh:specs": "bun run scripts/refresh-specs.ts",
|
|
134
134
|
"generate:types": "bun run scripts/generate-type-exports.ts",
|
|
135
|
-
"generate:radarr": "bun run scripts/generate-radarr.ts",
|
|
136
|
-
"generate:sonarr": "bun run scripts/generate-sonarr.ts",
|
|
137
135
|
"clean": "rm -rf src/generated && rm -rf dist",
|
|
138
136
|
"docs": "typedoc",
|
|
139
137
|
"docs:serve": "typedoc --serve",
|
package/dist/tsarr-2.8.0.tgz
DELETED
|
Binary file
|