Skip to content

Commit ffd6faa

Browse files
committed
fix: set default language for new profiles to any
* this only applies to products which do have languages in profiles
1 parent b9ad772 commit ffd6faa

File tree

5 files changed

+95
-12
lines changed

5 files changed

+95
-12
lines changed

src/clients/radarr-client.ts

+26-5
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
import { KyHttpClient } from "../__generated__/ky-client";
22
import { Api } from "../__generated__/radarr/Api";
3-
import { CustomFormatResource, QualityDefinitionResource, QualityProfileResource } from "../__generated__/radarr/data-contracts";
3+
import {
4+
CustomFormatResource,
5+
LanguageResource,
6+
QualityDefinitionResource,
7+
QualityProfileResource,
8+
} from "../__generated__/radarr/data-contracts";
49
import { logger } from "../logger";
10+
import { cloneWithJSON } from "../util";
511
import { IArrClient, validateClientParams } from "./unified-client";
612

7-
export class RadarrClient implements IArrClient<QualityProfileResource, QualityDefinitionResource, CustomFormatResource> {
13+
export class RadarrClient implements IArrClient<QualityProfileResource, QualityDefinitionResource, CustomFormatResource, LanguageResource> {
814
private api!: Api<unknown>;
15+
private languageMap: Map<string, LanguageResource> = new Map();
916

1017
constructor(baseUrl: string, apiKey: string) {
1118
this.initialize(baseUrl, apiKey);
@@ -24,13 +31,18 @@ export class RadarrClient implements IArrClient<QualityProfileResource, QualityD
2431
this.api = new Api(httpClient);
2532
}
2633

34+
async getLanguages() {
35+
return this.api.v3LanguageList();
36+
}
37+
2738
// Quality Management
2839
getQualityDefinitions() {
2940
return this.api.v3QualitydefinitionList();
3041
}
3142

3243
async updateQualityDefinitions(definitions: QualityDefinitionResource[]) {
3344
await this.api.v3QualitydefinitionUpdateUpdate(definitions);
45+
this.api.v3LanguageList();
3446
return this.getQualityDefinitions();
3547
}
3648

@@ -39,10 +51,19 @@ export class RadarrClient implements IArrClient<QualityProfileResource, QualityD
3951
return this.api.v3QualityprofileList();
4052
}
4153

42-
createQualityProfile(profile: QualityProfileResource): Promise<QualityProfileResource> {
43-
if (profile.language) {
54+
async createQualityProfile(profile: QualityProfileResource): Promise<QualityProfileResource> {
55+
const cloned = cloneWithJSON(profile);
56+
57+
if (this.languageMap.size <= 0) {
58+
const languages = await this.getLanguages();
59+
this.languageMap = new Map(languages.map((i) => [i.name!, i]));
4460
}
45-
return this.api.v3QualityprofileCreate(profile);
61+
62+
if (profile.language == null) {
63+
cloned.language = this.languageMap.get("Any");
64+
}
65+
66+
return this.api.v3QualityprofileCreate(cloned);
4667
}
4768

4869
updateQualityProfile(id: string, profile: QualityProfileResource): Promise<QualityProfileResource> {

src/clients/readarr-client.ts

+8-1
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,17 @@ import { KyHttpClient } from "../__generated__/ky-client";
22
import { Api } from "../__generated__/readarr/Api";
33
import {
44
CustomFormatResource,
5+
LanguageResource,
56
MetadataProfileResource,
67
QualityDefinitionResource,
78
QualityProfileResource,
89
} from "../__generated__/readarr/data-contracts";
910
import { logger } from "../logger";
1011
import { IArrClient, validateClientParams } from "./unified-client";
1112

12-
export class ReadarrClient implements IArrClient<QualityProfileResource, QualityDefinitionResource, CustomFormatResource> {
13+
export class ReadarrClient
14+
implements IArrClient<QualityProfileResource, QualityDefinitionResource, CustomFormatResource, LanguageResource>
15+
{
1316
private api!: Api<unknown>;
1417

1518
constructor(baseUrl: string, apiKey: string) {
@@ -29,6 +32,10 @@ export class ReadarrClient implements IArrClient<QualityProfileResource, Quality
2932
this.api = new Api(httpClient);
3033
}
3134

35+
async getLanguages() {
36+
return this.api.v1LanguageList();
37+
}
38+
3239
// Quality Management
3340
getQualityDefinitions() {
3441
return this.api.v1QualitydefinitionList();

src/clients/sonarr-client.ts

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
import { KyHttpClient } from "../__generated__/ky-client";
22
import { Api } from "../__generated__/sonarr/Api";
3-
import { CustomFormatResource, QualityDefinitionResource, QualityProfileResource } from "../__generated__/sonarr/data-contracts";
3+
import {
4+
CustomFormatResource,
5+
LanguageResource,
6+
QualityDefinitionResource,
7+
QualityProfileResource,
8+
} from "../__generated__/sonarr/data-contracts";
49
import { logger } from "../logger";
510
import { IArrClient, validateClientParams } from "./unified-client";
611

@@ -10,7 +15,7 @@ export type SonarrQualityProfileResource = {
1015
// Add other common properties that all quality profiles share
1116
};
1217

13-
export class SonarrClient implements IArrClient<QualityProfileResource, QualityDefinitionResource, CustomFormatResource> {
18+
export class SonarrClient implements IArrClient<QualityProfileResource, QualityDefinitionResource, CustomFormatResource, LanguageResource> {
1419
private api!: Api<unknown>;
1520

1621
constructor(baseUrl: string, apiKey: string) {
@@ -30,6 +35,10 @@ export class SonarrClient implements IArrClient<QualityProfileResource, QualityD
3035
this.api = new Api(httpClient);
3136
}
3237

38+
async getLanguages() {
39+
return this.api.v3LanguageList();
40+
}
41+
3342
// Quality Management
3443
getQualityDefinitions() {
3544
return this.api.v3QualitydefinitionList();

src/clients/unified-client.ts

+13
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,17 @@ export type ArrClientQualityProfile = {
8484
// Add other common properties that all quality profiles share
8585
};
8686

87+
export type ArrClientLanguageResource = {
88+
id?: number;
89+
name?: string | null;
90+
nameLower?: string | null;
91+
};
92+
8793
export interface IArrClient<
8894
QP extends ArrClientQualityProfile = MergedQualityProfileResource,
8995
QD extends ArrClientQualityDefinition = MergedQualityDefinitionResource,
9096
CF extends ArrClientCustomFormat = MergedCustomFormatResource,
97+
L extends ArrClientLanguageResource = ArrClientLanguageResource,
9198
> {
9299
// Quality Management
93100
getQualityDefinitions(): Promise<QD[]>;
@@ -104,6 +111,8 @@ export interface IArrClient<
104111
updateCustomFormat(id: string, format: CF): Promise<CF>;
105112
deleteCustomFormat(id: string): Promise<void>;
106113

114+
getLanguages(): Promise<L[]>;
115+
107116
// System/Health Check
108117
getSystemStatus(): Promise<any>;
109118
testConnection(): Promise<boolean>;
@@ -138,6 +147,10 @@ export class UnifiedClient implements IArrClient {
138147
return this.api as T;
139148
}
140149

150+
async getLanguages() {
151+
return this.api.getLanguages();
152+
}
153+
141154
async getQualityDefinitions() {
142155
return await this.api.getQualityDefinitions();
143156
}

src/clients/whisparr-client.ts

+37-4
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,29 @@
11
import { KyHttpClient } from "../__generated__/ky-client";
22
import { Api } from "../__generated__/whisparr/Api";
3-
import { CustomFormatResource, QualityDefinitionResource, QualityProfileResource } from "../__generated__/whisparr/data-contracts";
3+
import {
4+
CustomFormatResource,
5+
LanguageResource,
6+
QualityDefinitionResource,
7+
QualityProfileResource,
8+
} from "../__generated__/whisparr/data-contracts";
49
import { logger } from "../logger";
10+
import { cloneWithJSON } from "../util";
511
import { IArrClient, validateClientParams } from "./unified-client";
612

7-
export class WhisparrClient implements IArrClient<QualityProfileResource, QualityDefinitionResource, CustomFormatResource> {
13+
/**
14+
* Overwrite wrong types for now
15+
*/
16+
declare module "../__generated__/whisparr/data-contracts" {
17+
export interface QualityProfileResource {
18+
language?: Language;
19+
}
20+
}
21+
22+
export class WhisparrClient
23+
implements IArrClient<QualityProfileResource, QualityDefinitionResource, CustomFormatResource, LanguageResource>
24+
{
825
private api!: Api<unknown>;
26+
private languageMap: Map<string, LanguageResource> = new Map();
927

1028
constructor(baseUrl: string, apiKey: string) {
1129
this.initialize(baseUrl, apiKey);
@@ -24,6 +42,10 @@ export class WhisparrClient implements IArrClient<QualityProfileResource, Qualit
2442
this.api = new Api(httpClient);
2543
}
2644

45+
async getLanguages() {
46+
return this.api.v3LanguageList();
47+
}
48+
2749
// Quality Management
2850
getQualityDefinitions() {
2951
return this.api.v3QualitydefinitionList();
@@ -39,8 +61,19 @@ export class WhisparrClient implements IArrClient<QualityProfileResource, Qualit
3961
return this.api.v3QualityprofileList();
4062
}
4163

42-
createQualityProfile(profile: QualityProfileResource) {
43-
return this.api.v3QualityprofileCreate(profile);
64+
async createQualityProfile(profile: QualityProfileResource): Promise<QualityProfileResource> {
65+
const cloned = cloneWithJSON(profile);
66+
67+
if (this.languageMap.size <= 0) {
68+
const languages = await this.getLanguages();
69+
this.languageMap = new Map(languages.map((i) => [i.name!, i]));
70+
}
71+
72+
if (profile.language == null) {
73+
cloned.language = this.languageMap.get("Any");
74+
}
75+
76+
return this.api.v3QualityprofileCreate(cloned);
4477
}
4578

4679
updateQualityProfile(id: string, profile: QualityProfileResource) {

0 commit comments

Comments
 (0)