tsarr 2.0.0 → 2.1.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/README.md +4 -1
- package/dist/cli/commands/doctor.d.ts +15 -1
- package/dist/cli/commands/doctor.d.ts.map +1 -1
- package/dist/cli/commands/service.d.ts.map +1 -1
- package/dist/cli/config.d.ts +1 -0
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/index.js +150 -25
- package/dist/clients/bazarr.d.ts.map +1 -1
- package/dist/clients/bazarr.js +10 -1
- package/dist/index.js +13 -13
- package/dist/tsarr-2.1.0.tgz +0 -0
- package/package.json +1 -1
- package/dist/tsarr-2.0.0.tgz +0 -0
package/README.md
CHANGED
|
@@ -93,6 +93,8 @@ tsarr completions fish > ~/.config/fish/completions/tsarr.fish
|
|
|
93
93
|
| `prowlarr` | indexer, search, app, tag, system |
|
|
94
94
|
| `bazarr` | series, movie, episode, provider, language, system |
|
|
95
95
|
|
|
96
|
+
See the [CLI Guide](./docs/cli.md) for full documentation including all commands, scripting examples, and shell completions.
|
|
97
|
+
|
|
96
98
|
## SDK
|
|
97
99
|
|
|
98
100
|
### Quick Start
|
|
@@ -148,8 +150,9 @@ bun run format
|
|
|
148
150
|
|
|
149
151
|
## 📖 Documentation
|
|
150
152
|
|
|
153
|
+
- [CLI Guide](./docs/cli.md) - Complete CLI documentation with all commands and scripting examples
|
|
154
|
+
- [SDK Usage Guide](./docs/usage.md) - SDK usage documentation with examples
|
|
151
155
|
- [API Documentation](https://robbeverhelst.github.io/Tsarr/) - Auto-generated TypeScript API docs
|
|
152
|
-
- [Usage Guide](./docs/usage.md) - Complete usage documentation with examples
|
|
153
156
|
- [Examples](./docs/examples.md) - Real-world automation examples
|
|
154
157
|
- [Examples Directory](./examples/) - Runnable example scripts
|
|
155
158
|
|
|
@@ -1,2 +1,16 @@
|
|
|
1
|
-
export declare const doctor: import("citty").CommandDef<
|
|
1
|
+
export declare const doctor: import("citty").CommandDef<{
|
|
2
|
+
readonly json: {
|
|
3
|
+
readonly type: "boolean";
|
|
4
|
+
readonly description: "Output as JSON";
|
|
5
|
+
};
|
|
6
|
+
readonly table: {
|
|
7
|
+
readonly type: "boolean";
|
|
8
|
+
readonly description: "Output as table";
|
|
9
|
+
};
|
|
10
|
+
readonly quiet: {
|
|
11
|
+
readonly type: "boolean";
|
|
12
|
+
readonly alias: "q";
|
|
13
|
+
readonly description: "Output service names only";
|
|
14
|
+
};
|
|
15
|
+
}>;
|
|
2
16
|
//# sourceMappingURL=doctor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor.ts"],"names":[],"mappings":"AAyCA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;EA2EjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAK/D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,GAAG,EACnD,SAAS,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAK/D,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC5B;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,CAAC;CACtB;AAED,wBAAgB,mBAAmB,CACjC,WAAW,EAAE,MAAM,EACnB,WAAW,EAAE,MAAM,EACnB,aAAa,EAAE,CAAC,MAAM,EAAE,mBAAmB,KAAK,GAAG,EACnD,SAAS,EAAE,WAAW,EAAE,uDAgIzB"}
|
package/dist/cli/config.d.ts
CHANGED
package/dist/cli/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;KACrC,CAAC;CACH;AAED,QAAA,MAAM,QAAQ,0EAA2E,CAAC;AAE1F,QAAA,MAAM,kBAAkB,QAAyC,CAAC;AAClE,QAAA,MAAM,iBAAiB,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/cli/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACxC,QAAQ,CAAC,EAAE;QACT,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,CAAC;KACrC,CAAC;CACH;AAED,QAAA,MAAM,QAAQ,0EAA2E,CAAC;AAE1F,QAAA,MAAM,kBAAkB,QAAyC,CAAC;AAClE,QAAA,MAAM,iBAAiB,gBAAgB,CAAC;AAsExC,wBAAgB,UAAU,IAAI,cAAc,CA+B3C;AA0CD,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAsBhF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAG7D;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAI5D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAS9D;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,UAAO,GAAG,IAAI,CAoB9E;AAcD,wBAAgB,qBAAqB,IAAI,MAAM,EAAE,CAKhD;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,GAAG,OAAO,GAAG,OAAO,CAAC,cAAc,CAAC,CAMnF;AAED,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,CAAC"}
|
package/dist/cli/index.js
CHANGED
|
@@ -4543,12 +4543,33 @@ ${indent}`);
|
|
|
4543
4543
|
// src/cli/config.ts
|
|
4544
4544
|
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
4545
4545
|
import { homedir } from "os";
|
|
4546
|
-
import { join, resolve } from "path";
|
|
4546
|
+
import { dirname, isAbsolute, join, resolve } from "path";
|
|
4547
|
+
function normalizeServiceConfig(service) {
|
|
4548
|
+
if (!service)
|
|
4549
|
+
return;
|
|
4550
|
+
const normalized = {
|
|
4551
|
+
baseUrl: service.baseUrl ?? "",
|
|
4552
|
+
apiKey: service.apiKey ?? "",
|
|
4553
|
+
...service.apiKeyFile ? { apiKeyFile: service.apiKeyFile } : {}
|
|
4554
|
+
};
|
|
4555
|
+
const timeout = typeof service.timeout === "string" ? Number(service.timeout) : service.timeout;
|
|
4556
|
+
if (typeof timeout === "number" && Number.isFinite(timeout)) {
|
|
4557
|
+
normalized.timeout = timeout;
|
|
4558
|
+
}
|
|
4559
|
+
return normalized;
|
|
4560
|
+
}
|
|
4561
|
+
function normalizeConfig(config) {
|
|
4562
|
+
const services = Object.fromEntries(Object.entries(config.services ?? {}).map(([name, service]) => [name, normalizeServiceConfig(service)]).filter(([, service]) => service != null));
|
|
4563
|
+
return {
|
|
4564
|
+
...config,
|
|
4565
|
+
...Object.keys(services).length > 0 ? { services } : {}
|
|
4566
|
+
};
|
|
4567
|
+
}
|
|
4547
4568
|
function readJsonFile(path) {
|
|
4548
4569
|
if (!existsSync(path))
|
|
4549
4570
|
return {};
|
|
4550
4571
|
try {
|
|
4551
|
-
return JSON.parse(readFileSync(path, "utf-8"));
|
|
4572
|
+
return normalizeConfig(JSON.parse(readFileSync(path, "utf-8")));
|
|
4552
4573
|
} catch {
|
|
4553
4574
|
return {};
|
|
4554
4575
|
}
|
|
@@ -4583,18 +4604,25 @@ function findLocalConfigPath() {
|
|
|
4583
4604
|
}
|
|
4584
4605
|
}
|
|
4585
4606
|
function loadConfig() {
|
|
4586
|
-
const base = { services: {} };
|
|
4587
4607
|
const global = readJsonFile(GLOBAL_CONFIG_PATH);
|
|
4588
4608
|
const localPath = findLocalConfigPath();
|
|
4589
4609
|
const local = localPath ? readJsonFile(localPath) : {};
|
|
4590
4610
|
const env2 = getEnvConfig();
|
|
4611
|
+
const allServiceNames = new Set([
|
|
4612
|
+
...Object.keys(global.services ?? {}),
|
|
4613
|
+
...Object.keys(local.services ?? {}),
|
|
4614
|
+
...Object.keys(env2.services ?? {})
|
|
4615
|
+
]);
|
|
4616
|
+
const services = {};
|
|
4617
|
+
for (const name of allServiceNames) {
|
|
4618
|
+
services[name] = {
|
|
4619
|
+
...global.services?.[name],
|
|
4620
|
+
...local.services?.[name],
|
|
4621
|
+
...env2.services?.[name]
|
|
4622
|
+
};
|
|
4623
|
+
}
|
|
4591
4624
|
const merged = {
|
|
4592
|
-
services
|
|
4593
|
-
...base.services,
|
|
4594
|
-
...global.services,
|
|
4595
|
-
...local.services,
|
|
4596
|
-
...env2.services
|
|
4597
|
-
},
|
|
4625
|
+
services,
|
|
4598
4626
|
defaults: {
|
|
4599
4627
|
...global.defaults,
|
|
4600
4628
|
...local.defaults
|
|
@@ -4602,14 +4630,51 @@ function loadConfig() {
|
|
|
4602
4630
|
};
|
|
4603
4631
|
return merged;
|
|
4604
4632
|
}
|
|
4633
|
+
function resolveConfigRelativePath(filePath, configPath) {
|
|
4634
|
+
if (isAbsolute(filePath) || !configPath) {
|
|
4635
|
+
return filePath;
|
|
4636
|
+
}
|
|
4637
|
+
return resolve(dirname(configPath), filePath);
|
|
4638
|
+
}
|
|
4639
|
+
function getResolvedApiKeyFilePath(serviceName, service, localPath, local, global) {
|
|
4640
|
+
if (!service.apiKeyFile)
|
|
4641
|
+
return;
|
|
4642
|
+
if (local.services?.[serviceName]?.apiKeyFile) {
|
|
4643
|
+
return resolveConfigRelativePath(service.apiKeyFile, localPath);
|
|
4644
|
+
}
|
|
4645
|
+
if (global.services?.[serviceName]?.apiKeyFile) {
|
|
4646
|
+
return resolveConfigRelativePath(service.apiKeyFile, GLOBAL_CONFIG_PATH);
|
|
4647
|
+
}
|
|
4648
|
+
return service.apiKeyFile;
|
|
4649
|
+
}
|
|
4650
|
+
function readApiKeyFile(filePath) {
|
|
4651
|
+
if (!existsSync(filePath)) {
|
|
4652
|
+
throw new Error(`API key file not found: ${filePath}`);
|
|
4653
|
+
}
|
|
4654
|
+
try {
|
|
4655
|
+
return readFileSync(filePath, "utf-8").trimEnd();
|
|
4656
|
+
} catch (err) {
|
|
4657
|
+
throw new Error(`Failed to read API key file: ${filePath}: ${err instanceof Error ? err.message : String(err)}`);
|
|
4658
|
+
}
|
|
4659
|
+
}
|
|
4605
4660
|
function getServiceConfig(serviceName) {
|
|
4661
|
+
const global = readJsonFile(GLOBAL_CONFIG_PATH);
|
|
4662
|
+
const localPath = findLocalConfigPath();
|
|
4663
|
+
const local = localPath ? readJsonFile(localPath) : {};
|
|
4606
4664
|
const config = loadConfig();
|
|
4607
4665
|
const service = config.services[serviceName];
|
|
4608
|
-
if (!service?.baseUrl
|
|
4666
|
+
if (!service?.baseUrl)
|
|
4667
|
+
return null;
|
|
4668
|
+
let apiKey = service.apiKey;
|
|
4669
|
+
const apiKeyFilePath = getResolvedApiKeyFilePath(serviceName, service, localPath, local, global);
|
|
4670
|
+
if (!apiKey && apiKeyFilePath) {
|
|
4671
|
+
apiKey = readApiKeyFile(apiKeyFilePath);
|
|
4672
|
+
}
|
|
4673
|
+
if (!apiKey)
|
|
4609
4674
|
return null;
|
|
4610
4675
|
return {
|
|
4611
4676
|
baseUrl: service.baseUrl,
|
|
4612
|
-
apiKey
|
|
4677
|
+
apiKey,
|
|
4613
4678
|
...service.timeout ? { timeout: service.timeout } : {}
|
|
4614
4679
|
};
|
|
4615
4680
|
}
|
|
@@ -4646,13 +4711,23 @@ function setConfigValue(key, value, global = true) {
|
|
|
4646
4711
|
}
|
|
4647
4712
|
current = current[parts[i2]];
|
|
4648
4713
|
}
|
|
4649
|
-
current[parts[parts.length - 1]] = value;
|
|
4714
|
+
current[parts[parts.length - 1]] = parseConfigValue(key, value);
|
|
4650
4715
|
if (global) {
|
|
4651
4716
|
saveGlobalConfig(config);
|
|
4652
4717
|
} else {
|
|
4653
4718
|
saveLocalConfig(config);
|
|
4654
4719
|
}
|
|
4655
4720
|
}
|
|
4721
|
+
function parseConfigValue(key, value) {
|
|
4722
|
+
if (key.endsWith(".timeout")) {
|
|
4723
|
+
const timeout = Number(value);
|
|
4724
|
+
if (!Number.isFinite(timeout) || timeout < 0) {
|
|
4725
|
+
throw new Error(`Invalid timeout value "${value}". Expected a non-negative number.`);
|
|
4726
|
+
}
|
|
4727
|
+
return timeout;
|
|
4728
|
+
}
|
|
4729
|
+
return value;
|
|
4730
|
+
}
|
|
4656
4731
|
function loadScopedConfig(scope) {
|
|
4657
4732
|
if (scope === "global") {
|
|
4658
4733
|
return readJsonFile(GLOBAL_CONFIG_PATH);
|
|
@@ -4851,6 +4926,9 @@ Run \`tsarr config init\` or set TSARR_${serviceName.toUpperCase()}_API_KEY`);
|
|
|
4851
4926
|
process.exit(1);
|
|
4852
4927
|
}
|
|
4853
4928
|
let result = raw?.data !== undefined ? raw.data : raw;
|
|
4929
|
+
if (result != null && typeof result === "object" && "data" in result && Object.keys(result).length === 1) {
|
|
4930
|
+
result = result.data;
|
|
4931
|
+
}
|
|
4854
4932
|
if (result?.records !== undefined && Array.isArray(result.records)) {
|
|
4855
4933
|
result = result.records;
|
|
4856
4934
|
}
|
|
@@ -15198,13 +15276,17 @@ var exports_bazarr = {};
|
|
|
15198
15276
|
__export(exports_bazarr, {
|
|
15199
15277
|
BazarrClient: () => BazarrClient
|
|
15200
15278
|
});
|
|
15279
|
+
function getBazarrApiBaseUrl(baseUrl) {
|
|
15280
|
+
const normalizedBaseUrl = baseUrl.replace(/\/$/, "");
|
|
15281
|
+
return normalizedBaseUrl.endsWith("/api") ? normalizedBaseUrl : `${normalizedBaseUrl}/api`;
|
|
15282
|
+
}
|
|
15201
15283
|
|
|
15202
15284
|
class BazarrClient {
|
|
15203
15285
|
clientConfig;
|
|
15204
15286
|
constructor(config) {
|
|
15205
15287
|
this.clientConfig = createServarrClient(config);
|
|
15206
15288
|
client6.setConfig({
|
|
15207
|
-
baseUrl: this.clientConfig.getBaseUrl(),
|
|
15289
|
+
baseUrl: getBazarrApiBaseUrl(this.clientConfig.getBaseUrl()),
|
|
15208
15290
|
headers: this.clientConfig.getHeaders()
|
|
15209
15291
|
});
|
|
15210
15292
|
}
|
|
@@ -15543,6 +15625,10 @@ class BazarrClient {
|
|
|
15543
15625
|
updateConfig(newConfig) {
|
|
15544
15626
|
const updatedConfig = { ...this.clientConfig.config, ...newConfig };
|
|
15545
15627
|
this.clientConfig = createServarrClient(updatedConfig);
|
|
15628
|
+
client6.setConfig({
|
|
15629
|
+
baseUrl: getBazarrApiBaseUrl(this.clientConfig.getBaseUrl()),
|
|
15630
|
+
headers: this.clientConfig.getHeaders()
|
|
15631
|
+
});
|
|
15546
15632
|
return this.clientConfig.config;
|
|
15547
15633
|
}
|
|
15548
15634
|
}
|
|
@@ -15657,6 +15743,9 @@ var exports_doctor = {};
|
|
|
15657
15743
|
__export(exports_doctor, {
|
|
15658
15744
|
doctor: () => doctor
|
|
15659
15745
|
});
|
|
15746
|
+
function getDoctorVersion(status) {
|
|
15747
|
+
return status?.data?.data?.version ?? status?.data?.data?.bazarr_version ?? status?.data?.version ?? status?.version ?? status?.data?.bazarr_version ?? status?.bazarr_version ?? undefined;
|
|
15748
|
+
}
|
|
15660
15749
|
var clientFactories, doctor;
|
|
15661
15750
|
var init_doctor = __esm(() => {
|
|
15662
15751
|
init_dist();
|
|
@@ -15681,37 +15770,71 @@ var init_doctor = __esm(() => {
|
|
|
15681
15770
|
name: "doctor",
|
|
15682
15771
|
description: "Test all configured service connections"
|
|
15683
15772
|
},
|
|
15684
|
-
|
|
15685
|
-
|
|
15686
|
-
|
|
15687
|
-
|
|
15773
|
+
args: {
|
|
15774
|
+
json: { type: "boolean", description: "Output as JSON" },
|
|
15775
|
+
table: { type: "boolean", description: "Output as table" },
|
|
15776
|
+
quiet: { type: "boolean", alias: "q", description: "Output service names only" }
|
|
15777
|
+
},
|
|
15778
|
+
async run({ args }) {
|
|
15779
|
+
const format = detectFormat(args);
|
|
15688
15780
|
let hasAny = false;
|
|
15781
|
+
const results = [];
|
|
15782
|
+
if (format === "table") {
|
|
15783
|
+
consola.info(`Checking connections...
|
|
15784
|
+
`);
|
|
15785
|
+
}
|
|
15689
15786
|
for (const service of SERVICES) {
|
|
15690
15787
|
const svcConfig = getServiceConfig(service);
|
|
15691
15788
|
if (!svcConfig) {
|
|
15692
|
-
|
|
15789
|
+
results.push({
|
|
15790
|
+
service,
|
|
15791
|
+
configured: false,
|
|
15792
|
+
status: "not configured"
|
|
15793
|
+
});
|
|
15693
15794
|
continue;
|
|
15694
15795
|
}
|
|
15695
15796
|
hasAny = true;
|
|
15696
15797
|
try {
|
|
15697
15798
|
const factory = clientFactories[service];
|
|
15698
15799
|
if (!factory) {
|
|
15699
|
-
|
|
15800
|
+
results.push({
|
|
15801
|
+
service,
|
|
15802
|
+
configured: true,
|
|
15803
|
+
status: "fail",
|
|
15804
|
+
baseUrl: svcConfig.baseUrl,
|
|
15805
|
+
error: "No client factory available"
|
|
15806
|
+
});
|
|
15700
15807
|
continue;
|
|
15701
15808
|
}
|
|
15702
15809
|
const client7 = factory(svcConfig);
|
|
15703
15810
|
const status = await client7.getSystemStatus();
|
|
15704
|
-
const version = status
|
|
15705
|
-
|
|
15811
|
+
const version = getDoctorVersion(status) ?? "?";
|
|
15812
|
+
results.push({
|
|
15813
|
+
service,
|
|
15814
|
+
configured: true,
|
|
15815
|
+
status: "ok",
|
|
15816
|
+
version: String(version),
|
|
15817
|
+
baseUrl: svcConfig.baseUrl
|
|
15818
|
+
});
|
|
15706
15819
|
} catch (error) {
|
|
15707
15820
|
const msg = error instanceof Error ? error.message : "Unknown error";
|
|
15708
|
-
|
|
15821
|
+
results.push({
|
|
15822
|
+
service,
|
|
15823
|
+
configured: true,
|
|
15824
|
+
status: "fail",
|
|
15825
|
+
baseUrl: svcConfig.baseUrl,
|
|
15826
|
+
error: msg
|
|
15827
|
+
});
|
|
15709
15828
|
}
|
|
15710
15829
|
}
|
|
15711
|
-
if (!hasAny) {
|
|
15830
|
+
if (!hasAny && format === "table") {
|
|
15712
15831
|
consola.warn("\nNo services configured. Run `tsarr config init` to set up.");
|
|
15713
15832
|
}
|
|
15714
|
-
|
|
15833
|
+
formatOutput(results, {
|
|
15834
|
+
format,
|
|
15835
|
+
columns: ["service", "status", "version", "baseUrl", "error"],
|
|
15836
|
+
idField: "service"
|
|
15837
|
+
});
|
|
15715
15838
|
}
|
|
15716
15839
|
});
|
|
15717
15840
|
});
|
|
@@ -16084,10 +16207,12 @@ var init_completions = __esm(() => {
|
|
|
16084
16207
|
|
|
16085
16208
|
// src/cli/index.ts
|
|
16086
16209
|
init_dist();
|
|
16210
|
+
import { readFileSync as readFileSync2 } from "fs";
|
|
16211
|
+
var { version } = JSON.parse(readFileSync2(new URL("../../package.json", import.meta.url), "utf-8"));
|
|
16087
16212
|
var main = defineCommand({
|
|
16088
16213
|
meta: {
|
|
16089
16214
|
name: "tsarr",
|
|
16090
|
-
version
|
|
16215
|
+
version,
|
|
16091
16216
|
description: "CLI for Servarr APIs (Radarr, Sonarr, Lidarr, Readarr, Prowlarr, Bazarr)"
|
|
16092
16217
|
},
|
|
16093
16218
|
subCommands: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bazarr.d.ts","sourceRoot":"","sources":["../../src/clients/bazarr.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAE5D,OAAO,KAAK,SAAS,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"bazarr.d.ts","sourceRoot":"","sources":["../../src/clients/bazarr.ts"],"names":[],"mappings":"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"}
|
package/dist/clients/bazarr.js
CHANGED
|
@@ -1195,12 +1195,17 @@ var postWebHooksSonarr = (options) => (options.client ?? client).post({
|
|
|
1195
1195
|
}
|
|
1196
1196
|
});
|
|
1197
1197
|
// src/clients/bazarr.ts
|
|
1198
|
+
function getBazarrApiBaseUrl(baseUrl) {
|
|
1199
|
+
const normalizedBaseUrl = baseUrl.replace(/\/$/, "");
|
|
1200
|
+
return normalizedBaseUrl.endsWith("/api") ? normalizedBaseUrl : `${normalizedBaseUrl}/api`;
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1198
1203
|
class BazarrClient {
|
|
1199
1204
|
clientConfig;
|
|
1200
1205
|
constructor(config) {
|
|
1201
1206
|
this.clientConfig = createServarrClient(config);
|
|
1202
1207
|
client.setConfig({
|
|
1203
|
-
baseUrl: this.clientConfig.getBaseUrl(),
|
|
1208
|
+
baseUrl: getBazarrApiBaseUrl(this.clientConfig.getBaseUrl()),
|
|
1204
1209
|
headers: this.clientConfig.getHeaders()
|
|
1205
1210
|
});
|
|
1206
1211
|
}
|
|
@@ -1539,6 +1544,10 @@ class BazarrClient {
|
|
|
1539
1544
|
updateConfig(newConfig) {
|
|
1540
1545
|
const updatedConfig = { ...this.clientConfig.config, ...newConfig };
|
|
1541
1546
|
this.clientConfig = createServarrClient(updatedConfig);
|
|
1547
|
+
client.setConfig({
|
|
1548
|
+
baseUrl: getBazarrApiBaseUrl(this.clientConfig.getBaseUrl()),
|
|
1549
|
+
headers: this.clientConfig.getHeaders()
|
|
1550
|
+
});
|
|
1542
1551
|
return this.clientConfig.config;
|
|
1543
1552
|
}
|
|
1544
1553
|
}
|