tsarr 2.4.11 → 2.5.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 CHANGED
@@ -66,6 +66,16 @@ bunx tsarr doctor
66
66
  brew install robbeverhelst/tsarr/tsarr
67
67
  ```
68
68
 
69
+ ### OpenClaw / ClawHub
70
+
71
+ Install the published OpenClaw skill to manage your Servarr stack through TsArr:
72
+
73
+ ```bash
74
+ openclaw clawhub install tsarr
75
+ # or with the registry CLI
76
+ clawhub install tsarr
77
+ ```
78
+
69
79
  ### Pre-built Binaries
70
80
 
71
81
  Download standalone binaries from [GitHub Releases](https://github.com/robbeverhelst/tsarr/releases) — no runtime needed:
@@ -1 +1 @@
1
- {"version":3,"file":"lidarr.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/lidarr.ts"],"names":[],"mappings":"AA0hBA,eAAO,MAAM,MAAM,qDAKlB,CAAC"}
1
+ {"version":3,"file":"lidarr.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/lidarr.ts"],"names":[],"mappings":"AAojBA,eAAO,MAAM,MAAM,qDAKlB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"radarr.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/radarr.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,eAAO,MAAM,SAAS,EAAE,WAAW,EAmjBlC,CAAC;AAEF,eAAO,MAAM,MAAM,qDAKlB,CAAC"}
1
+ {"version":3,"file":"radarr.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/radarr.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,eAAO,MAAM,SAAS,EAAE,WAAW,EA6kBlC,CAAC;AAEF,eAAO,MAAM,MAAM,qDAKlB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"readarr.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/readarr.ts"],"names":[],"mappings":"AA2hBA,eAAO,MAAM,OAAO,qDAKnB,CAAC"}
1
+ {"version":3,"file":"readarr.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/readarr.ts"],"names":[],"mappings":"AAqjBA,eAAO,MAAM,OAAO,qDAKnB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"sonarr.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sonarr.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,eAAO,MAAM,SAAS,EAAE,WAAW,EAomBlC,CAAC;AAEF,eAAO,MAAM,MAAM,qDAKlB,CAAC"}
1
+ {"version":3,"file":"sonarr.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sonarr.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAGhD,eAAO,MAAM,SAAS,EAAE,WAAW,EA8nBlC,CAAC;AAEF,eAAO,MAAM,MAAM,qDAKlB,CAAC"}
package/dist/cli/index.js CHANGED
@@ -1931,6 +1931,78 @@ var getApiV3SystemBackup = (options) => (options?.client ?? client).get({
1931
1931
  "Content-Type": "application/json",
1932
1932
  ...options.headers
1933
1933
  }
1934
+ }), getApiV3Moviefile = (options) => (options?.client ?? client).get({
1935
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
1936
+ in: "query",
1937
+ name: "apikey",
1938
+ type: "apiKey"
1939
+ }],
1940
+ url: "/api/v3/moviefile",
1941
+ ...options
1942
+ }), deleteApiV3MoviefileById = (options) => (options.client ?? client).delete({
1943
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
1944
+ in: "query",
1945
+ name: "apikey",
1946
+ type: "apiKey"
1947
+ }],
1948
+ url: "/api/v3/moviefile/{id}",
1949
+ ...options
1950
+ }), getApiV3MoviefileById = (options) => (options.client ?? client).get({
1951
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
1952
+ in: "query",
1953
+ name: "apikey",
1954
+ type: "apiKey"
1955
+ }],
1956
+ url: "/api/v3/moviefile/{id}",
1957
+ ...options
1958
+ }), putApiV3MoviefileById = (options) => (options.client ?? client).put({
1959
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
1960
+ in: "query",
1961
+ name: "apikey",
1962
+ type: "apiKey"
1963
+ }],
1964
+ url: "/api/v3/moviefile/{id}",
1965
+ ...options,
1966
+ headers: {
1967
+ "Content-Type": "application/json",
1968
+ ...options.headers
1969
+ }
1970
+ }), putApiV3MoviefileEditor = (options) => (options?.client ?? client).put({
1971
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
1972
+ in: "query",
1973
+ name: "apikey",
1974
+ type: "apiKey"
1975
+ }],
1976
+ url: "/api/v3/moviefile/editor",
1977
+ ...options,
1978
+ headers: {
1979
+ "Content-Type": "application/json",
1980
+ ...options?.headers
1981
+ }
1982
+ }), deleteApiV3MoviefileBulk = (options) => (options?.client ?? client).delete({
1983
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
1984
+ in: "query",
1985
+ name: "apikey",
1986
+ type: "apiKey"
1987
+ }],
1988
+ url: "/api/v3/moviefile/bulk",
1989
+ ...options,
1990
+ headers: {
1991
+ "Content-Type": "application/json",
1992
+ ...options?.headers
1993
+ }
1994
+ }), putApiV3MoviefileBulk = (options) => (options?.client ?? client).put({
1995
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
1996
+ in: "query",
1997
+ name: "apikey",
1998
+ type: "apiKey"
1999
+ }],
2000
+ url: "/api/v3/moviefile/bulk",
2001
+ ...options,
2002
+ headers: {
2003
+ "Content-Type": "application/json",
2004
+ ...options?.headers
2005
+ }
1934
2006
  }), postApiV3MovieImport = (options) => (options?.client ?? client).post({
1935
2007
  security: [{ name: "X-Api-Key", type: "apiKey" }, {
1936
2008
  in: "query",
@@ -2456,6 +2528,32 @@ class RadarrClient {
2456
2528
  async importMovies(movies) {
2457
2529
  return postApiV3MovieImport({ body: movies });
2458
2530
  }
2531
+ async getMovieFiles(movieId, movieFileIds) {
2532
+ const query = {};
2533
+ if (movieId !== undefined)
2534
+ query.movieId = movieId;
2535
+ if (movieFileIds !== undefined)
2536
+ query.movieFileIds = movieFileIds;
2537
+ return getApiV3Moviefile(Object.keys(query).length > 0 ? { query } : {});
2538
+ }
2539
+ async getMovieFile(id) {
2540
+ return getApiV3MoviefileById({ path: { id } });
2541
+ }
2542
+ async updateMovieFile(id, movieFile) {
2543
+ return putApiV3MoviefileById({ path: { id }, body: movieFile });
2544
+ }
2545
+ async deleteMovieFile(id) {
2546
+ return deleteApiV3MoviefileById({ path: { id } });
2547
+ }
2548
+ async updateMovieFilesEditor(movieFileList) {
2549
+ return putApiV3MoviefileEditor({ body: movieFileList });
2550
+ }
2551
+ async deleteMovieFilesBulk(movieFileList) {
2552
+ return deleteApiV3MoviefileBulk({ body: movieFileList });
2553
+ }
2554
+ async updateMovieFilesBulk(movieFiles) {
2555
+ return putApiV3MoviefileBulk({ body: movieFiles });
2556
+ }
2459
2557
  async getQualityProfiles() {
2460
2558
  return getApiV3Qualityprofile();
2461
2559
  }
@@ -5484,6 +5582,32 @@ var init_radarr3 = __esm(() => {
5484
5582
  }
5485
5583
  ]
5486
5584
  },
5585
+ {
5586
+ name: "moviefile",
5587
+ description: "Manage movie files",
5588
+ actions: [
5589
+ {
5590
+ name: "list",
5591
+ description: "List movie files for a movie",
5592
+ args: [{ name: "movie-id", description: "Movie ID", required: true, type: "number" }],
5593
+ columns: ["id", "relativePath", "size", "quality", "dateAdded"],
5594
+ run: (c3, a2) => c3.getMovieFiles([a2["movie-id"]])
5595
+ },
5596
+ {
5597
+ name: "get",
5598
+ description: "Get a movie file by ID",
5599
+ args: [{ name: "id", description: "Movie file ID", required: true, type: "number" }],
5600
+ run: (c3, a2) => c3.getMovieFile(a2.id)
5601
+ },
5602
+ {
5603
+ name: "delete",
5604
+ description: "Delete a movie file from disk",
5605
+ args: [{ name: "id", description: "Movie file ID", required: true, type: "number" }],
5606
+ confirmMessage: "Are you sure you want to delete this movie file from disk?",
5607
+ run: (c3, a2) => c3.deleteMovieFile(a2.id)
5608
+ }
5609
+ ]
5610
+ },
5487
5611
  {
5488
5612
  name: "profile",
5489
5613
  description: "Manage quality profiles",
@@ -6995,6 +7119,78 @@ var getApi2 = (options) => (options?.client ?? client2).get({
6995
7119
  "Content-Type": "application/json",
6996
7120
  ...options.headers
6997
7121
  }
7122
+ }), getApiV3Episodefile = (options) => (options?.client ?? client2).get({
7123
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
7124
+ in: "query",
7125
+ name: "apikey",
7126
+ type: "apiKey"
7127
+ }],
7128
+ url: "/api/v3/episodefile",
7129
+ ...options
7130
+ }), deleteApiV3EpisodefileById = (options) => (options.client ?? client2).delete({
7131
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
7132
+ in: "query",
7133
+ name: "apikey",
7134
+ type: "apiKey"
7135
+ }],
7136
+ url: "/api/v3/episodefile/{id}",
7137
+ ...options
7138
+ }), getApiV3EpisodefileById = (options) => (options.client ?? client2).get({
7139
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
7140
+ in: "query",
7141
+ name: "apikey",
7142
+ type: "apiKey"
7143
+ }],
7144
+ url: "/api/v3/episodefile/{id}",
7145
+ ...options
7146
+ }), putApiV3EpisodefileById = (options) => (options.client ?? client2).put({
7147
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
7148
+ in: "query",
7149
+ name: "apikey",
7150
+ type: "apiKey"
7151
+ }],
7152
+ url: "/api/v3/episodefile/{id}",
7153
+ ...options,
7154
+ headers: {
7155
+ "Content-Type": "application/json",
7156
+ ...options.headers
7157
+ }
7158
+ }), putApiV3EpisodefileEditor = (options) => (options?.client ?? client2).put({
7159
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
7160
+ in: "query",
7161
+ name: "apikey",
7162
+ type: "apiKey"
7163
+ }],
7164
+ url: "/api/v3/episodefile/editor",
7165
+ ...options,
7166
+ headers: {
7167
+ "Content-Type": "application/json",
7168
+ ...options?.headers
7169
+ }
7170
+ }), deleteApiV3EpisodefileBulk = (options) => (options?.client ?? client2).delete({
7171
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
7172
+ in: "query",
7173
+ name: "apikey",
7174
+ type: "apiKey"
7175
+ }],
7176
+ url: "/api/v3/episodefile/bulk",
7177
+ ...options,
7178
+ headers: {
7179
+ "Content-Type": "application/json",
7180
+ ...options?.headers
7181
+ }
7182
+ }), putApiV3EpisodefileBulk = (options) => (options?.client ?? client2).put({
7183
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
7184
+ in: "query",
7185
+ name: "apikey",
7186
+ type: "apiKey"
7187
+ }],
7188
+ url: "/api/v3/episodefile/bulk",
7189
+ ...options,
7190
+ headers: {
7191
+ "Content-Type": "application/json",
7192
+ ...options?.headers
7193
+ }
6998
7194
  }), getApiV3History2 = (options) => (options?.client ?? client2).get({
6999
7195
  security: [{ name: "X-Api-Key", type: "apiKey" }, {
7000
7196
  in: "query",
@@ -7914,6 +8110,32 @@ class SonarrClient {
7914
8110
  async updateEpisode(id, episode) {
7915
8111
  return putApiV3EpisodeById({ path: { id }, body: episode });
7916
8112
  }
8113
+ async getEpisodeFiles(seriesId, episodeFileIds) {
8114
+ const query = {};
8115
+ if (seriesId !== undefined)
8116
+ query.seriesId = seriesId;
8117
+ if (episodeFileIds !== undefined)
8118
+ query.episodeFileIds = episodeFileIds;
8119
+ return getApiV3Episodefile(Object.keys(query).length > 0 ? { query } : {});
8120
+ }
8121
+ async getEpisodeFile(id) {
8122
+ return getApiV3EpisodefileById({ path: { id } });
8123
+ }
8124
+ async updateEpisodeFile(id, episodeFile) {
8125
+ return putApiV3EpisodefileById({ path: { id }, body: episodeFile });
8126
+ }
8127
+ async deleteEpisodeFile(id) {
8128
+ return deleteApiV3EpisodefileById({ path: { id } });
8129
+ }
8130
+ async updateEpisodeFilesEditor(episodeFileList) {
8131
+ return putApiV3EpisodefileEditor({ body: episodeFileList });
8132
+ }
8133
+ async deleteEpisodeFilesBulk(episodeFileList) {
8134
+ return deleteApiV3EpisodefileBulk({ body: episodeFileList });
8135
+ }
8136
+ async updateEpisodeFilesBulk(episodeFiles) {
8137
+ return putApiV3EpisodefileBulk({ body: episodeFiles });
8138
+ }
7917
8139
  async getQualityProfiles() {
7918
8140
  return getApiV3Qualityprofile2();
7919
8141
  }
@@ -8538,6 +8760,32 @@ var init_sonarr3 = __esm(() => {
8538
8760
  }
8539
8761
  ]
8540
8762
  },
8763
+ {
8764
+ name: "episodefile",
8765
+ description: "Manage episode files",
8766
+ actions: [
8767
+ {
8768
+ name: "list",
8769
+ description: "List episode files for a series",
8770
+ args: [{ name: "series-id", description: "Series ID", required: true, type: "number" }],
8771
+ columns: ["id", "relativePath", "size", "quality", "dateAdded"],
8772
+ run: (c3, a2) => c3.getEpisodeFiles(a2["series-id"])
8773
+ },
8774
+ {
8775
+ name: "get",
8776
+ description: "Get an episode file by ID",
8777
+ args: [{ name: "id", description: "Episode file ID", required: true, type: "number" }],
8778
+ run: (c3, a2) => c3.getEpisodeFile(a2.id)
8779
+ },
8780
+ {
8781
+ name: "delete",
8782
+ description: "Delete an episode file from disk",
8783
+ args: [{ name: "id", description: "Episode file ID", required: true, type: "number" }],
8784
+ confirmMessage: "Are you sure you want to delete this episode file from disk?",
8785
+ run: (c3, a2) => c3.deleteEpisodeFile(a2.id)
8786
+ }
8787
+ ]
8788
+ },
8541
8789
  {
8542
8790
  name: "profile",
8543
8791
  description: "Manage quality profiles",
@@ -10770,6 +11018,66 @@ var getApiV1Album = (options) => (options?.client ?? client3).get({
10770
11018
  }],
10771
11019
  url: "/api/v1/tag/detail",
10772
11020
  ...options
11021
+ }), deleteApiV1TrackfileById = (options) => (options.client ?? client3).delete({
11022
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
11023
+ in: "query",
11024
+ name: "apikey",
11025
+ type: "apiKey"
11026
+ }],
11027
+ url: "/api/v1/trackfile/{id}",
11028
+ ...options
11029
+ }), getApiV1TrackfileById = (options) => (options.client ?? client3).get({
11030
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
11031
+ in: "query",
11032
+ name: "apikey",
11033
+ type: "apiKey"
11034
+ }],
11035
+ url: "/api/v1/trackfile/{id}",
11036
+ ...options
11037
+ }), putApiV1TrackfileById = (options) => (options.client ?? client3).put({
11038
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
11039
+ in: "query",
11040
+ name: "apikey",
11041
+ type: "apiKey"
11042
+ }],
11043
+ url: "/api/v1/trackfile/{id}",
11044
+ ...options,
11045
+ headers: {
11046
+ "Content-Type": "application/json",
11047
+ ...options.headers
11048
+ }
11049
+ }), getApiV1Trackfile = (options) => (options?.client ?? client3).get({
11050
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
11051
+ in: "query",
11052
+ name: "apikey",
11053
+ type: "apiKey"
11054
+ }],
11055
+ url: "/api/v1/trackfile",
11056
+ ...options
11057
+ }), putApiV1TrackfileEditor = (options) => (options?.client ?? client3).put({
11058
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
11059
+ in: "query",
11060
+ name: "apikey",
11061
+ type: "apiKey"
11062
+ }],
11063
+ url: "/api/v1/trackfile/editor",
11064
+ ...options,
11065
+ headers: {
11066
+ "Content-Type": "application/json",
11067
+ ...options?.headers
11068
+ }
11069
+ }), deleteApiV1TrackfileBulk = (options) => (options?.client ?? client3).delete({
11070
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
11071
+ in: "query",
11072
+ name: "apikey",
11073
+ type: "apiKey"
11074
+ }],
11075
+ url: "/api/v1/trackfile/bulk",
11076
+ ...options,
11077
+ headers: {
11078
+ "Content-Type": "application/json",
11079
+ ...options?.headers
11080
+ }
10773
11081
  }), getApiV1ConfigUiById = (options) => (options.client ?? client3).get({
10774
11082
  security: [{ name: "X-Api-Key", type: "apiKey" }, {
10775
11083
  in: "query",
@@ -10903,6 +11211,33 @@ class LidarrClient {
10903
11211
  query.tags = tags;
10904
11212
  return getFeedV1CalendarLidarrIcs(Object.keys(query).length > 0 ? { query } : {});
10905
11213
  }
11214
+ async getTrackFiles(artistId, trackFileIds, albumId, unmapped) {
11215
+ const query = {};
11216
+ if (artistId !== undefined)
11217
+ query.artistId = artistId;
11218
+ if (trackFileIds !== undefined)
11219
+ query.trackFileIds = trackFileIds;
11220
+ if (albumId !== undefined)
11221
+ query.albumId = albumId;
11222
+ if (unmapped !== undefined)
11223
+ query.unmapped = unmapped;
11224
+ return getApiV1Trackfile(Object.keys(query).length > 0 ? { query } : {});
11225
+ }
11226
+ async getTrackFile(id) {
11227
+ return getApiV1TrackfileById({ path: { id } });
11228
+ }
11229
+ async updateTrackFile(id, trackFile) {
11230
+ return putApiV1TrackfileById({ path: { id }, body: trackFile });
11231
+ }
11232
+ async deleteTrackFile(id) {
11233
+ return deleteApiV1TrackfileById({ path: { id } });
11234
+ }
11235
+ async updateTrackFilesEditor(trackFileList) {
11236
+ return putApiV1TrackfileEditor({ body: trackFileList });
11237
+ }
11238
+ async deleteTrackFilesBulk(trackFileList) {
11239
+ return deleteApiV1TrackfileBulk({ body: trackFileList });
11240
+ }
10906
11241
  async getQualityProfiles() {
10907
11242
  return getApiV1Qualityprofile();
10908
11243
  }
@@ -11504,6 +11839,32 @@ var init_lidarr3 = __esm(() => {
11504
11839
  }
11505
11840
  ]
11506
11841
  },
11842
+ {
11843
+ name: "trackfile",
11844
+ description: "Manage track files",
11845
+ actions: [
11846
+ {
11847
+ name: "list",
11848
+ description: "List track files for an artist",
11849
+ args: [{ name: "artist-id", description: "Artist ID", required: true, type: "number" }],
11850
+ columns: ["id", "relativePath", "size", "quality", "dateAdded"],
11851
+ run: (c3, a2) => c3.getTrackFiles(a2["artist-id"])
11852
+ },
11853
+ {
11854
+ name: "get",
11855
+ description: "Get a track file by ID",
11856
+ args: [{ name: "id", description: "Track file ID", required: true, type: "number" }],
11857
+ run: (c3, a2) => c3.getTrackFile(a2.id)
11858
+ },
11859
+ {
11860
+ name: "delete",
11861
+ description: "Delete a track file from disk",
11862
+ args: [{ name: "id", description: "Track file ID", required: true, type: "number" }],
11863
+ confirmMessage: "Are you sure you want to delete this track file from disk?",
11864
+ run: (c3, a2) => c3.deleteTrackFile(a2.id)
11865
+ }
11866
+ ]
11867
+ },
11507
11868
  {
11508
11869
  name: "profile",
11509
11870
  description: "Manage quality profiles",
@@ -12815,6 +13176,66 @@ var getApiV1Author = (options) => (options?.client ?? client4).get({
12815
13176
  "Content-Type": "application/json",
12816
13177
  ...options.headers
12817
13178
  }
13179
+ }), getApiV1Bookfile = (options) => (options?.client ?? client4).get({
13180
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
13181
+ in: "query",
13182
+ name: "apikey",
13183
+ type: "apiKey"
13184
+ }],
13185
+ url: "/api/v1/bookfile",
13186
+ ...options
13187
+ }), deleteApiV1BookfileById = (options) => (options.client ?? client4).delete({
13188
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
13189
+ in: "query",
13190
+ name: "apikey",
13191
+ type: "apiKey"
13192
+ }],
13193
+ url: "/api/v1/bookfile/{id}",
13194
+ ...options
13195
+ }), getApiV1BookfileById = (options) => (options.client ?? client4).get({
13196
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
13197
+ in: "query",
13198
+ name: "apikey",
13199
+ type: "apiKey"
13200
+ }],
13201
+ url: "/api/v1/bookfile/{id}",
13202
+ ...options
13203
+ }), putApiV1BookfileById = (options) => (options.client ?? client4).put({
13204
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
13205
+ in: "query",
13206
+ name: "apikey",
13207
+ type: "apiKey"
13208
+ }],
13209
+ url: "/api/v1/bookfile/{id}",
13210
+ ...options,
13211
+ headers: {
13212
+ "Content-Type": "application/json",
13213
+ ...options.headers
13214
+ }
13215
+ }), putApiV1BookfileEditor = (options) => (options?.client ?? client4).put({
13216
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
13217
+ in: "query",
13218
+ name: "apikey",
13219
+ type: "apiKey"
13220
+ }],
13221
+ url: "/api/v1/bookfile/editor",
13222
+ ...options,
13223
+ headers: {
13224
+ "Content-Type": "application/json",
13225
+ ...options?.headers
13226
+ }
13227
+ }), deleteApiV1BookfileBulk = (options) => (options?.client ?? client4).delete({
13228
+ security: [{ name: "X-Api-Key", type: "apiKey" }, {
13229
+ in: "query",
13230
+ name: "apikey",
13231
+ type: "apiKey"
13232
+ }],
13233
+ url: "/api/v1/bookfile/bulk",
13234
+ ...options,
13235
+ headers: {
13236
+ "Content-Type": "application/json",
13237
+ ...options?.headers
13238
+ }
12818
13239
  }), getApiV1BookLookup = (options) => (options?.client ?? client4).get({
12819
13240
  security: [{ name: "X-Api-Key", type: "apiKey" }, {
12820
13241
  in: "query",
@@ -13934,6 +14355,33 @@ class ReadarrClient {
13934
14355
  query.tagList = tagList;
13935
14356
  return getFeedV1CalendarReadarrIcs(Object.keys(query).length > 0 ? { query } : {});
13936
14357
  }
14358
+ async getBookFiles(authorId, bookFileIds, bookId, unmapped) {
14359
+ const query = {};
14360
+ if (authorId !== undefined)
14361
+ query.authorId = authorId;
14362
+ if (bookFileIds !== undefined)
14363
+ query.bookFileIds = bookFileIds;
14364
+ if (bookId !== undefined)
14365
+ query.bookId = bookId;
14366
+ if (unmapped !== undefined)
14367
+ query.unmapped = unmapped;
14368
+ return getApiV1Bookfile(Object.keys(query).length > 0 ? { query } : {});
14369
+ }
14370
+ async getBookFile(id) {
14371
+ return getApiV1BookfileById({ path: { id } });
14372
+ }
14373
+ async updateBookFile(id, bookFile) {
14374
+ return putApiV1BookfileById({ path: { id }, body: bookFile });
14375
+ }
14376
+ async deleteBookFile(id) {
14377
+ return deleteApiV1BookfileById({ path: { id } });
14378
+ }
14379
+ async updateBookFilesEditor(bookFileList) {
14380
+ return putApiV1BookfileEditor({ body: bookFileList });
14381
+ }
14382
+ async deleteBookFilesBulk(bookFileList) {
14383
+ return deleteApiV1BookfileBulk({ body: bookFileList });
14384
+ }
13937
14385
  async getQualityProfiles() {
13938
14386
  return getApiV1Qualityprofile2();
13939
14387
  }
@@ -14426,6 +14874,32 @@ var init_readarr3 = __esm(() => {
14426
14874
  }
14427
14875
  ]
14428
14876
  },
14877
+ {
14878
+ name: "bookfile",
14879
+ description: "Manage book files",
14880
+ actions: [
14881
+ {
14882
+ name: "list",
14883
+ description: "List book files for an author",
14884
+ args: [{ name: "author-id", description: "Author ID", required: true, type: "number" }],
14885
+ columns: ["id", "relativePath", "size", "quality", "dateAdded"],
14886
+ run: (c3, a2) => c3.getBookFiles(a2["author-id"])
14887
+ },
14888
+ {
14889
+ name: "get",
14890
+ description: "Get a book file by ID",
14891
+ args: [{ name: "id", description: "Book file ID", required: true, type: "number" }],
14892
+ run: (c3, a2) => c3.getBookFile(a2.id)
14893
+ },
14894
+ {
14895
+ name: "delete",
14896
+ description: "Delete a book file from disk",
14897
+ args: [{ name: "id", description: "Book file ID", required: true, type: "number" }],
14898
+ confirmMessage: "Are you sure you want to delete this book file from disk?",
14899
+ run: (c3, a2) => c3.deleteBookFile(a2.id)
14900
+ }
14901
+ ]
14902
+ },
14429
14903
  {
14430
14904
  name: "profile",
14431
14905
  description: "Manage quality profiles",
@@ -18854,7 +19328,7 @@ init_dist();
18854
19328
  // package.json
18855
19329
  var package_default = {
18856
19330
  name: "tsarr",
18857
- version: "2.4.11",
19331
+ version: "2.5.0",
18858
19332
  author: "Robbe Verhelst",
18859
19333
  repository: {
18860
19334
  type: "git",
@@ -18866,15 +19340,15 @@ var package_default = {
18866
19340
  main: "dist/index.js",
18867
19341
  module: "dist/index.js",
18868
19342
  devDependencies: {
18869
- "@biomejs/biome": "2.4.8",
18870
- "@hey-api/openapi-ts": "^0.94.3",
19343
+ "@biomejs/biome": "2.4.10",
19344
+ "@hey-api/openapi-ts": "^0.94.5",
18871
19345
  "@semantic-release/changelog": "^6.0.3",
18872
19346
  "@semantic-release/git": "^10.0.1",
18873
19347
  "@semantic-release/github": "^12.0.6",
18874
19348
  "@semantic-release/npm": "^13.1.5",
18875
- "@types/bun": "^1.3.10",
19349
+ "@types/bun": "^1.3.11",
18876
19350
  "semantic-release": "^25.0.3",
18877
- typedoc: "^0.28.17",
19351
+ typedoc: "^0.28.18",
18878
19352
  typescript: "^5.9.3"
18879
19353
  },
18880
19354
  exports: {
@@ -18927,7 +19401,7 @@ var package_default = {
18927
19401
  },
18928
19402
  description: "Type-safe TypeScript SDK for Servarr APIs (Radarr, Sonarr, etc.)",
18929
19403
  engines: {
18930
- node: ">=18.20.8"
19404
+ node: ">=24.14.1"
18931
19405
  },
18932
19406
  files: [
18933
19407
  "dist",