mcp-arr-suite 1.0.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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +198 -0
  3. package/dist/clients/arr-client.d.ts +681 -0
  4. package/dist/clients/arr-client.d.ts.map +1 -0
  5. package/dist/clients/arr-client.js +367 -0
  6. package/dist/clients/arr-client.js.map +1 -0
  7. package/dist/index.d.ts +14 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +93 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/registry.d.ts +16 -0
  12. package/dist/registry.d.ts.map +1 -0
  13. package/dist/registry.js +32 -0
  14. package/dist/registry.js.map +1 -0
  15. package/dist/services/cross-service.d.ts +8 -0
  16. package/dist/services/cross-service.d.ts.map +1 -0
  17. package/dist/services/cross-service.js +113 -0
  18. package/dist/services/cross-service.js.map +1 -0
  19. package/dist/services/lidarr.d.ts +6 -0
  20. package/dist/services/lidarr.d.ts.map +1 -0
  21. package/dist/services/lidarr.js +263 -0
  22. package/dist/services/lidarr.js.map +1 -0
  23. package/dist/services/prowlarr.d.ts +10 -0
  24. package/dist/services/prowlarr.d.ts.map +1 -0
  25. package/dist/services/prowlarr.js +140 -0
  26. package/dist/services/prowlarr.js.map +1 -0
  27. package/dist/services/radarr.d.ts +9 -0
  28. package/dist/services/radarr.d.ts.map +1 -0
  29. package/dist/services/radarr.js +574 -0
  30. package/dist/services/radarr.js.map +1 -0
  31. package/dist/services/sonarr.d.ts +9 -0
  32. package/dist/services/sonarr.d.ts.map +1 -0
  33. package/dist/services/sonarr.js +696 -0
  34. package/dist/services/sonarr.js.map +1 -0
  35. package/dist/shared/config-tools.d.ts +15 -0
  36. package/dist/shared/config-tools.d.ts.map +1 -0
  37. package/dist/shared/config-tools.js +225 -0
  38. package/dist/shared/config-tools.js.map +1 -0
  39. package/dist/shared/formatting.d.ts +37 -0
  40. package/dist/shared/formatting.d.ts.map +1 -0
  41. package/dist/shared/formatting.js +57 -0
  42. package/dist/shared/formatting.js.map +1 -0
  43. package/dist/trash/client.d.ts +127 -0
  44. package/dist/trash/client.d.ts.map +1 -0
  45. package/dist/trash/client.js +289 -0
  46. package/dist/trash/client.js.map +1 -0
  47. package/dist/trash/tools.d.ts +13 -0
  48. package/dist/trash/tools.d.ts.map +1 -0
  49. package/dist/trash/tools.js +377 -0
  50. package/dist/trash/tools.js.map +1 -0
  51. package/dist/types.d.ts +33 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +15 -0
  54. package/dist/types.js.map +1 -0
  55. package/package.json +53 -0
@@ -0,0 +1,681 @@
1
+ /**
2
+ * *arr Suite API Client
3
+ *
4
+ * All *arr applications share the same REST API pattern with X-Api-Key authentication.
5
+ * Extend ArrClient to add a new service.
6
+ */
7
+ export type ArrService = 'sonarr' | 'radarr' | 'lidarr' | 'prowlarr';
8
+ export interface ArrConfig {
9
+ url: string;
10
+ apiKey: string;
11
+ }
12
+ export interface SystemStatus {
13
+ appName: string;
14
+ version: string;
15
+ buildTime: string;
16
+ isDebug: boolean;
17
+ isProduction: boolean;
18
+ isAdmin: boolean;
19
+ isUserInteractive: boolean;
20
+ startupPath: string;
21
+ appData: string;
22
+ osName: string;
23
+ isDocker: boolean;
24
+ isLinux: boolean;
25
+ isOsx: boolean;
26
+ isWindows: boolean;
27
+ }
28
+ export interface QueueItem {
29
+ id: number;
30
+ title: string;
31
+ status: string;
32
+ trackedDownloadStatus: string;
33
+ trackedDownloadState: string;
34
+ statusMessages: Array<{
35
+ title: string;
36
+ messages: string[];
37
+ }>;
38
+ downloadId: string;
39
+ protocol: string;
40
+ downloadClient: string;
41
+ outputPath: string;
42
+ sizeleft: number;
43
+ size: number;
44
+ timeleft: string;
45
+ estimatedCompletionTime: string;
46
+ }
47
+ export interface QualityProfile {
48
+ id: number;
49
+ name: string;
50
+ upgradeAllowed: boolean;
51
+ cutoff: number;
52
+ items: Array<{
53
+ id?: number;
54
+ name?: string;
55
+ quality?: {
56
+ id: number;
57
+ name: string;
58
+ source: string;
59
+ resolution: number;
60
+ };
61
+ items?: Array<{
62
+ quality: {
63
+ id: number;
64
+ name: string;
65
+ };
66
+ }>;
67
+ allowed: boolean;
68
+ }>;
69
+ minFormatScore: number;
70
+ cutoffFormatScore: number;
71
+ formatItems: Array<{
72
+ format: number;
73
+ name: string;
74
+ score: number;
75
+ }>;
76
+ }
77
+ export interface QualityDefinition {
78
+ id: number;
79
+ quality: {
80
+ id: number;
81
+ name: string;
82
+ source: string;
83
+ resolution: number;
84
+ };
85
+ title: string;
86
+ weight: number;
87
+ minSize: number;
88
+ maxSize: number;
89
+ preferredSize: number;
90
+ }
91
+ export interface DownloadClient {
92
+ id: number;
93
+ name: string;
94
+ implementation: string;
95
+ implementationName: string;
96
+ configContract: string;
97
+ enable: boolean;
98
+ protocol: string;
99
+ priority: number;
100
+ removeCompletedDownloads: boolean;
101
+ removeFailedDownloads: boolean;
102
+ fields: Array<{
103
+ name: string;
104
+ value: unknown;
105
+ }>;
106
+ tags: number[];
107
+ }
108
+ export interface NamingConfig {
109
+ renameEpisodes?: boolean;
110
+ replaceIllegalCharacters: boolean;
111
+ colonReplacementFormat?: string;
112
+ standardEpisodeFormat?: string;
113
+ dailyEpisodeFormat?: string;
114
+ animeEpisodeFormat?: string;
115
+ seriesFolderFormat?: string;
116
+ seasonFolderFormat?: string;
117
+ specialsFolderFormat?: string;
118
+ multiEpisodeStyle?: number;
119
+ renameMovies?: boolean;
120
+ movieFolderFormat?: string;
121
+ standardMovieFormat?: string;
122
+ renameTracks?: boolean;
123
+ artistFolderFormat?: string;
124
+ albumFolderFormat?: string;
125
+ trackFormat?: string;
126
+ }
127
+ export interface MediaManagementConfig {
128
+ recycleBin: string;
129
+ recycleBinCleanupDays: number;
130
+ downloadPropersAndRepacks: string;
131
+ deleteEmptyFolders: boolean;
132
+ fileDate: string;
133
+ rescanAfterRefresh: string;
134
+ setPermissionsLinux: boolean;
135
+ chmodFolder: string;
136
+ chownGroup: string;
137
+ skipFreeSpaceCheckWhenImporting: boolean;
138
+ minimumFreeSpaceWhenImporting: number;
139
+ copyUsingHardlinks: boolean;
140
+ importExtraFiles: boolean;
141
+ extraFileExtensions: string;
142
+ enableMediaInfo: boolean;
143
+ }
144
+ export interface HealthCheck {
145
+ source: string;
146
+ type: string;
147
+ message: string;
148
+ wikiUrl: string;
149
+ }
150
+ export interface Tag {
151
+ id: number;
152
+ label: string;
153
+ }
154
+ export interface RootFolder {
155
+ id: number;
156
+ path: string;
157
+ accessible: boolean;
158
+ freeSpace: number;
159
+ unmappedFolders?: Array<{
160
+ name: string;
161
+ path: string;
162
+ }>;
163
+ }
164
+ export interface Indexer {
165
+ id: number;
166
+ name: string;
167
+ enableRss: boolean;
168
+ enableAutomaticSearch: boolean;
169
+ enableInteractiveSearch: boolean;
170
+ protocol: string;
171
+ priority: number;
172
+ added: string;
173
+ }
174
+ export interface SearchResult {
175
+ title: string;
176
+ sortTitle: string;
177
+ status: string;
178
+ overview: string;
179
+ year: number;
180
+ images: Array<{
181
+ coverType: string;
182
+ url: string;
183
+ }>;
184
+ remotePoster?: string;
185
+ tvdbId?: number;
186
+ tmdbId?: number;
187
+ imdbId?: string;
188
+ foreignArtistId?: string;
189
+ artistName?: string;
190
+ disambiguation?: string;
191
+ }
192
+ export interface Series {
193
+ id: number;
194
+ title: string;
195
+ sortTitle: string;
196
+ status: string;
197
+ overview: string;
198
+ network: string;
199
+ airTime: string;
200
+ year: number;
201
+ path: string;
202
+ qualityProfileId: number;
203
+ seasonFolder: boolean;
204
+ monitored: boolean;
205
+ runtime: number;
206
+ tvdbId: number;
207
+ imdbId: string;
208
+ titleSlug: string;
209
+ genres: string[];
210
+ tags: number[];
211
+ seasons: Array<{
212
+ seasonNumber: number;
213
+ monitored: boolean;
214
+ }>;
215
+ statistics: {
216
+ seasonCount: number;
217
+ episodeFileCount: number;
218
+ episodeCount: number;
219
+ totalEpisodeCount: number;
220
+ sizeOnDisk: number;
221
+ percentOfEpisodes: number;
222
+ };
223
+ }
224
+ export interface Episode {
225
+ id: number;
226
+ seriesId: number;
227
+ tvdbId: number;
228
+ episodeFileId: number;
229
+ seasonNumber: number;
230
+ episodeNumber: number;
231
+ title: string;
232
+ airDate: string;
233
+ airDateUtc: string;
234
+ overview: string;
235
+ hasFile: boolean;
236
+ monitored: boolean;
237
+ absoluteEpisodeNumber: number;
238
+ episodeFile?: {
239
+ id: number;
240
+ relativePath: string;
241
+ path: string;
242
+ size: number;
243
+ dateAdded: string;
244
+ quality: {
245
+ quality: {
246
+ id: number;
247
+ name: string;
248
+ };
249
+ };
250
+ };
251
+ }
252
+ export interface Movie {
253
+ id: number;
254
+ title: string;
255
+ sortTitle: string;
256
+ sizeOnDisk: number;
257
+ status: string;
258
+ overview: string;
259
+ inCinemas: string;
260
+ physicalRelease: string;
261
+ digitalRelease: string;
262
+ year: number;
263
+ hasFile: boolean;
264
+ studio: string;
265
+ path: string;
266
+ qualityProfileId: number;
267
+ monitored: boolean;
268
+ minimumAvailability: string;
269
+ isAvailable: boolean;
270
+ runtime: number;
271
+ imdbId: string;
272
+ tmdbId: number;
273
+ titleSlug: string;
274
+ genres: string[];
275
+ tags: number[];
276
+ movieFile?: {
277
+ id: number;
278
+ relativePath: string;
279
+ path: string;
280
+ size: number;
281
+ dateAdded: string;
282
+ quality: {
283
+ quality: {
284
+ id: number;
285
+ name: string;
286
+ };
287
+ };
288
+ };
289
+ }
290
+ export interface Artist {
291
+ id: number;
292
+ artistName: string;
293
+ sortName: string;
294
+ status: string;
295
+ overview: string;
296
+ artistType: string;
297
+ disambiguation: string;
298
+ path: string;
299
+ qualityProfileId: number;
300
+ metadataProfileId: number;
301
+ monitored: boolean;
302
+ monitorNewItems: string;
303
+ genres: string[];
304
+ foreignArtistId: string;
305
+ tags: number[];
306
+ statistics: {
307
+ albumCount: number;
308
+ trackFileCount: number;
309
+ trackCount: number;
310
+ totalTrackCount: number;
311
+ sizeOnDisk: number;
312
+ percentOfTracks: number;
313
+ };
314
+ }
315
+ export interface Album {
316
+ id: number;
317
+ title: string;
318
+ disambiguation: string;
319
+ overview: string;
320
+ artistId: number;
321
+ foreignAlbumId: string;
322
+ monitored: boolean;
323
+ profileId: number;
324
+ duration: number;
325
+ albumType: string;
326
+ genres: string[];
327
+ statistics?: {
328
+ trackFileCount: number;
329
+ trackCount: number;
330
+ totalTrackCount: number;
331
+ sizeOnDisk: number;
332
+ percentOfTracks: number;
333
+ };
334
+ releaseDate: string;
335
+ grabbed: boolean;
336
+ }
337
+ export interface MetadataProfile {
338
+ id: number;
339
+ name: string;
340
+ minPopularity?: number;
341
+ skipMissingDate: boolean;
342
+ skipMissingIsbn: boolean;
343
+ skipPartsAndSets: boolean;
344
+ skipSeriesSecondary: boolean;
345
+ allowedLanguages?: string;
346
+ minPages?: number;
347
+ }
348
+ export interface DiskSpace {
349
+ path: string;
350
+ label: string;
351
+ freeSpace: number;
352
+ totalSpace: number;
353
+ }
354
+ export interface MovieFile {
355
+ id: number;
356
+ movieId: number;
357
+ relativePath: string;
358
+ path: string;
359
+ size: number;
360
+ dateAdded: string;
361
+ quality: {
362
+ quality: {
363
+ id: number;
364
+ name: string;
365
+ source: string;
366
+ resolution: number;
367
+ };
368
+ revision: {
369
+ version: number;
370
+ real: number;
371
+ };
372
+ };
373
+ mediaInfo?: {
374
+ audioChannels: number;
375
+ audioCodec: string;
376
+ audioLanguages: string;
377
+ subtitles: string;
378
+ videoCodec: string;
379
+ videoDynamicRange: string;
380
+ videoDynamicRangeType: string;
381
+ };
382
+ originalFilePath?: string;
383
+ qualityCutoffNotMet: boolean;
384
+ languages: Array<{
385
+ id: number;
386
+ name: string;
387
+ }>;
388
+ edition: string;
389
+ }
390
+ export interface HistoryRecord {
391
+ id: number;
392
+ movieId: number;
393
+ sourceTitle: string;
394
+ languages: Array<{
395
+ id: number;
396
+ name: string;
397
+ }>;
398
+ quality: {
399
+ quality: {
400
+ id: number;
401
+ name: string;
402
+ };
403
+ };
404
+ customFormats?: Array<{
405
+ id: number;
406
+ name: string;
407
+ }>;
408
+ qualityCutoffNotMet: boolean;
409
+ date: string;
410
+ downloadId?: string;
411
+ eventType: string;
412
+ data: Record<string, string>;
413
+ }
414
+ export interface BlocklistRecord {
415
+ id: number;
416
+ movieId: number;
417
+ sourceTitle: string;
418
+ languages: Array<{
419
+ id: number;
420
+ name: string;
421
+ }>;
422
+ quality: {
423
+ quality: {
424
+ id: number;
425
+ name: string;
426
+ };
427
+ };
428
+ date: string;
429
+ protocol: string;
430
+ indexer: string;
431
+ message: string;
432
+ }
433
+ export interface WantedRecord {
434
+ page: number;
435
+ pageSize: number;
436
+ sortKey: string;
437
+ sortDirection: string;
438
+ totalRecords: number;
439
+ records: Movie[];
440
+ }
441
+ export interface EpisodeFile {
442
+ id: number;
443
+ seriesId: number;
444
+ seasonNumber: number;
445
+ relativePath: string;
446
+ path: string;
447
+ size: number;
448
+ dateAdded: string;
449
+ quality: {
450
+ quality: {
451
+ id: number;
452
+ name: string;
453
+ };
454
+ revision: {
455
+ version: number;
456
+ real: number;
457
+ };
458
+ };
459
+ mediaInfo?: {
460
+ audioChannels: number;
461
+ audioCodec: string;
462
+ audioLanguages: string;
463
+ subtitles: string;
464
+ videoCodec: string;
465
+ videoDynamicRange: string;
466
+ videoDynamicRangeType: string;
467
+ };
468
+ qualityCutoffNotMet: boolean;
469
+ languages: Array<{
470
+ id: number;
471
+ name: string;
472
+ }>;
473
+ }
474
+ export interface SeriesHistoryRecord {
475
+ id: number;
476
+ episodeId: number;
477
+ seriesId: number;
478
+ sourceTitle: string;
479
+ languages: Array<{
480
+ id: number;
481
+ name: string;
482
+ }>;
483
+ quality: {
484
+ quality: {
485
+ id: number;
486
+ name: string;
487
+ };
488
+ };
489
+ qualityCutoffNotMet: boolean;
490
+ date: string;
491
+ downloadId?: string;
492
+ eventType: string;
493
+ data: Record<string, string>;
494
+ }
495
+ export interface SeriesWantedRecord {
496
+ page: number;
497
+ pageSize: number;
498
+ sortKey: string;
499
+ sortDirection: string;
500
+ totalRecords: number;
501
+ records: Series[];
502
+ }
503
+ export interface SeriesBlocklistRecord {
504
+ id: number;
505
+ seriesId: number;
506
+ episodeIds: number[];
507
+ sourceTitle: string;
508
+ languages: Array<{
509
+ id: number;
510
+ name: string;
511
+ }>;
512
+ quality: {
513
+ quality: {
514
+ id: number;
515
+ name: string;
516
+ };
517
+ };
518
+ date: string;
519
+ protocol: string;
520
+ indexer: string;
521
+ message: string;
522
+ }
523
+ export interface IndexerStats {
524
+ id: number;
525
+ indexerId: number;
526
+ indexerName: string;
527
+ averageResponseTime: number;
528
+ numberOfQueries: number;
529
+ numberOfGrabs: number;
530
+ numberOfRssQueries: number;
531
+ numberOfAuthQueries: number;
532
+ numberOfFailedQueries: number;
533
+ numberOfFailedGrabs: number;
534
+ numberOfFailedRssQueries: number;
535
+ numberOfFailedAuthQueries: number;
536
+ }
537
+ export declare class ArrClient {
538
+ private readonly config;
539
+ private readonly serviceName;
540
+ protected apiVersion: string;
541
+ constructor(serviceName: ArrService, config: ArrConfig);
542
+ protected request<T>(endpoint: string, options?: RequestInit): Promise<T>;
543
+ getStatus(): Promise<SystemStatus>;
544
+ getQueue(): Promise<{
545
+ records: QueueItem[];
546
+ totalRecords: number;
547
+ }>;
548
+ getCalendar(start?: string, end?: string): Promise<unknown[]>;
549
+ getQualityProfiles(): Promise<QualityProfile[]>;
550
+ getQualityDefinitions(): Promise<QualityDefinition[]>;
551
+ getDownloadClients(): Promise<DownloadClient[]>;
552
+ getNamingConfig(): Promise<NamingConfig>;
553
+ getMediaManagement(): Promise<MediaManagementConfig>;
554
+ getHealth(): Promise<HealthCheck[]>;
555
+ getTags(): Promise<Tag[]>;
556
+ getRootFolders(): Promise<RootFolder[]>;
557
+ getIndexers(): Promise<Indexer[]>;
558
+ testConnection(): Promise<boolean>;
559
+ }
560
+ export declare class SonarrClient extends ArrClient {
561
+ constructor(config: ArrConfig);
562
+ getSeries(): Promise<Series[]>;
563
+ getSeriesById(id: number): Promise<Series>;
564
+ searchSeries(term: string): Promise<SearchResult[]>;
565
+ addSeries(series: Partial<Series> & {
566
+ tvdbId: number;
567
+ rootFolderPath: string;
568
+ qualityProfileId: number;
569
+ }): Promise<Series>;
570
+ getEpisodes(seriesId: number, seasonNumber?: number): Promise<Episode[]>;
571
+ searchMissing(seriesId: number): Promise<{
572
+ id: number;
573
+ }>;
574
+ searchEpisode(episodeIds: number[]): Promise<{
575
+ id: number;
576
+ }>;
577
+ refreshSeries(seriesId: number): Promise<{
578
+ id: number;
579
+ }>;
580
+ deleteSeries(seriesId: number, deleteFiles?: boolean, addImportListExclusion?: boolean): Promise<void>;
581
+ updateSeries(seriesId: number, changes: Partial<Series>): Promise<Series>;
582
+ getDiskSpace(): Promise<DiskSpace[]>;
583
+ getHistory(seriesId?: number, page?: number, pageSize?: number): Promise<{
584
+ records: SeriesHistoryRecord[];
585
+ totalRecords: number;
586
+ }>;
587
+ removeFromQueue(queueId: number, blocklist?: boolean, removeFromClient?: boolean): Promise<void>;
588
+ removeFromQueueBulk(ids: number[], blocklist?: boolean, removeFromClient?: boolean): Promise<void>;
589
+ getWantedMissing(page?: number, pageSize?: number): Promise<SeriesWantedRecord>;
590
+ getWantedCutoff(page?: number, pageSize?: number): Promise<SeriesWantedRecord>;
591
+ getEpisodeFiles(seriesId: number): Promise<EpisodeFile[]>;
592
+ deleteEpisodeFile(fileId: number): Promise<void>;
593
+ getBlocklist(page?: number, pageSize?: number): Promise<{
594
+ records: SeriesBlocklistRecord[];
595
+ totalRecords: number;
596
+ }>;
597
+ deleteFromBlocklist(blocklistId: number): Promise<void>;
598
+ monitorEpisodes(episodeIds: number[], monitored: boolean): Promise<void>;
599
+ setSeasonPass(series: Array<{
600
+ id: number;
601
+ monitored: boolean;
602
+ seasons: Array<{
603
+ seasonNumber: number;
604
+ monitored: boolean;
605
+ }>;
606
+ }>): Promise<void>;
607
+ }
608
+ export declare class RadarrClient extends ArrClient {
609
+ constructor(config: ArrConfig);
610
+ getMovies(): Promise<Movie[]>;
611
+ getMovieById(id: number): Promise<Movie>;
612
+ searchMovies(term: string): Promise<SearchResult[]>;
613
+ addMovie(movie: Partial<Movie> & {
614
+ tmdbId: number;
615
+ rootFolderPath: string;
616
+ qualityProfileId: number;
617
+ }): Promise<Movie>;
618
+ searchMovie(movieId: number): Promise<{
619
+ id: number;
620
+ }>;
621
+ refreshMovie(movieId: number): Promise<{
622
+ id: number;
623
+ }>;
624
+ deleteMovie(movieId: number, deleteFiles?: boolean, addImportExclusion?: boolean): Promise<void>;
625
+ updateMovie(movieId: number, changes: Partial<Movie>): Promise<Movie>;
626
+ getDiskSpace(): Promise<DiskSpace[]>;
627
+ getHistory(movieId?: number, page?: number, pageSize?: number): Promise<{
628
+ records: HistoryRecord[];
629
+ totalRecords: number;
630
+ }>;
631
+ removeFromQueue(queueId: number, blocklist?: boolean, removeFromClient?: boolean): Promise<void>;
632
+ removeFromQueueBulk(ids: number[], blocklist?: boolean, removeFromClient?: boolean): Promise<void>;
633
+ getWantedMissing(page?: number, pageSize?: number): Promise<WantedRecord>;
634
+ getWantedCutoff(page?: number, pageSize?: number): Promise<WantedRecord>;
635
+ getMovieFiles(movieId: number): Promise<MovieFile[]>;
636
+ deleteMovieFile(fileId: number): Promise<void>;
637
+ getBlocklist(page?: number, pageSize?: number): Promise<{
638
+ records: BlocklistRecord[];
639
+ totalRecords: number;
640
+ }>;
641
+ deleteFromBlocklist(blocklistId: number): Promise<void>;
642
+ }
643
+ export declare class LidarrClient extends ArrClient {
644
+ constructor(config: ArrConfig);
645
+ getArtists(): Promise<Artist[]>;
646
+ getArtistById(id: number): Promise<Artist>;
647
+ searchArtists(term: string): Promise<SearchResult[]>;
648
+ addArtist(artist: Partial<Artist> & {
649
+ foreignArtistId: string;
650
+ rootFolderPath: string;
651
+ qualityProfileId: number;
652
+ metadataProfileId: number;
653
+ }): Promise<Artist>;
654
+ getAlbums(artistId?: number): Promise<Album[]>;
655
+ getAlbumById(id: number): Promise<Album>;
656
+ searchAlbum(albumId: number): Promise<{
657
+ id: number;
658
+ }>;
659
+ searchMissingAlbums(artistId: number): Promise<{
660
+ id: number;
661
+ }>;
662
+ getCalendar(start?: string, end?: string): Promise<Album[]>;
663
+ getMetadataProfiles(): Promise<MetadataProfile[]>;
664
+ }
665
+ export declare class ProwlarrClient extends ArrClient {
666
+ constructor(config: ArrConfig);
667
+ getIndexers(): Promise<Indexer[]>;
668
+ testAllIndexers(): Promise<Array<{
669
+ id: number;
670
+ isValid: boolean;
671
+ validationFailures: Array<{
672
+ propertyName: string;
673
+ errorMessage: string;
674
+ }>;
675
+ }>>;
676
+ getIndexerStats(): Promise<{
677
+ indexers: IndexerStats[];
678
+ }>;
679
+ search(query: string, categories?: number[]): Promise<unknown[]>;
680
+ }
681
+ //# sourceMappingURL=arr-client.d.ts.map