tsarr 2.10.0 → 2.11.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.
Files changed (89) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +120 -233
  3. package/dist/cli/commands/doctor.d.ts.map +1 -1
  4. package/dist/cli/commands/manual-import.d.ts +30 -0
  5. package/dist/cli/commands/manual-import.d.ts.map +1 -0
  6. package/dist/cli/commands/radarr.d.ts.map +1 -1
  7. package/dist/cli/commands/sonarr.d.ts.map +1 -1
  8. package/dist/cli/index.js +5200 -4854
  9. package/dist/cli/index.js.map +133 -0
  10. package/dist/clients/bazarr.d.ts +124 -124
  11. package/dist/clients/bazarr.js +88 -97
  12. package/dist/clients/bazarr.js.map +22 -0
  13. package/dist/clients/lidarr.d.ts +146 -146
  14. package/dist/clients/lidarr.js +88 -97
  15. package/dist/clients/lidarr.js.map +23 -0
  16. package/dist/clients/prowlarr.d.ts +28 -28
  17. package/dist/clients/prowlarr.js +88 -97
  18. package/dist/clients/prowlarr.js.map +23 -0
  19. package/dist/clients/qbittorrent.d.ts +2 -0
  20. package/dist/clients/qbittorrent.d.ts.map +1 -1
  21. package/dist/clients/qbittorrent.js +119 -102
  22. package/dist/clients/qbittorrent.js.map +21 -0
  23. package/dist/clients/radarr.d.ts +193 -149
  24. package/dist/clients/radarr.d.ts.map +1 -1
  25. package/dist/clients/radarr.js +128 -97
  26. package/dist/clients/radarr.js.map +23 -0
  27. package/dist/clients/readarr.d.ts +148 -148
  28. package/dist/clients/readarr.js +88 -97
  29. package/dist/clients/readarr.js.map +23 -0
  30. package/dist/clients/seerr-types.d.ts +1 -1
  31. package/dist/clients/seerr-types.d.ts.map +1 -1
  32. package/dist/clients/seerr.d.ts +16 -16
  33. package/dist/clients/seerr.js +88 -97
  34. package/dist/clients/seerr.js.map +22 -0
  35. package/dist/clients/sonarr.d.ts +201 -167
  36. package/dist/clients/sonarr.d.ts.map +1 -1
  37. package/dist/clients/sonarr.js +104 -107
  38. package/dist/clients/sonarr.js.map +23 -0
  39. package/dist/generated/bazarr/client/client.gen.d.ts.map +1 -1
  40. package/dist/generated/bazarr/client/types.gen.d.ts +5 -2
  41. package/dist/generated/bazarr/client/types.gen.d.ts.map +1 -1
  42. package/dist/generated/bazarr/client/utils.gen.d.ts +5 -1
  43. package/dist/generated/bazarr/client/utils.gen.d.ts.map +1 -1
  44. package/dist/generated/lidarr/client/client.gen.d.ts.map +1 -1
  45. package/dist/generated/lidarr/client/types.gen.d.ts +5 -2
  46. package/dist/generated/lidarr/client/types.gen.d.ts.map +1 -1
  47. package/dist/generated/lidarr/client/utils.gen.d.ts +5 -1
  48. package/dist/generated/lidarr/client/utils.gen.d.ts.map +1 -1
  49. package/dist/generated/prowlarr/client/client.gen.d.ts.map +1 -1
  50. package/dist/generated/prowlarr/client/types.gen.d.ts +5 -2
  51. package/dist/generated/prowlarr/client/types.gen.d.ts.map +1 -1
  52. package/dist/generated/prowlarr/client/utils.gen.d.ts +5 -1
  53. package/dist/generated/prowlarr/client/utils.gen.d.ts.map +1 -1
  54. package/dist/generated/qbittorrent/client/client.gen.d.ts.map +1 -1
  55. package/dist/generated/qbittorrent/client/types.gen.d.ts +5 -2
  56. package/dist/generated/qbittorrent/client/types.gen.d.ts.map +1 -1
  57. package/dist/generated/qbittorrent/client/utils.gen.d.ts +5 -1
  58. package/dist/generated/qbittorrent/client/utils.gen.d.ts.map +1 -1
  59. package/dist/generated/radarr/client/client.gen.d.ts.map +1 -1
  60. package/dist/generated/radarr/client/types.gen.d.ts +5 -2
  61. package/dist/generated/radarr/client/types.gen.d.ts.map +1 -1
  62. package/dist/generated/radarr/client/utils.gen.d.ts +5 -1
  63. package/dist/generated/radarr/client/utils.gen.d.ts.map +1 -1
  64. package/dist/generated/readarr/client/client.gen.d.ts.map +1 -1
  65. package/dist/generated/readarr/client/types.gen.d.ts +5 -2
  66. package/dist/generated/readarr/client/types.gen.d.ts.map +1 -1
  67. package/dist/generated/readarr/client/utils.gen.d.ts +5 -1
  68. package/dist/generated/readarr/client/utils.gen.d.ts.map +1 -1
  69. package/dist/generated/seerr/client/client.gen.d.ts.map +1 -1
  70. package/dist/generated/seerr/client/types.gen.d.ts +5 -2
  71. package/dist/generated/seerr/client/types.gen.d.ts.map +1 -1
  72. package/dist/generated/seerr/client/utils.gen.d.ts +5 -1
  73. package/dist/generated/seerr/client/utils.gen.d.ts.map +1 -1
  74. package/dist/generated/seerr/index.d.ts +2 -2
  75. package/dist/generated/seerr/index.d.ts.map +1 -1
  76. package/dist/generated/seerr/sdk.gen.d.ts +13 -1
  77. package/dist/generated/seerr/sdk.gen.d.ts.map +1 -1
  78. package/dist/generated/seerr/types.gen.d.ts +78 -7
  79. package/dist/generated/seerr/types.gen.d.ts.map +1 -1
  80. package/dist/generated/sonarr/client/client.gen.d.ts.map +1 -1
  81. package/dist/generated/sonarr/client/types.gen.d.ts +5 -2
  82. package/dist/generated/sonarr/client/types.gen.d.ts.map +1 -1
  83. package/dist/generated/sonarr/client/utils.gen.d.ts +5 -1
  84. package/dist/generated/sonarr/client/utils.gen.d.ts.map +1 -1
  85. package/dist/index.js +3 -0
  86. package/dist/index.js.map +12 -0
  87. package/dist/tsarr-2.11.1.tgz +0 -0
  88. package/package.json +18 -9
  89. package/dist/tsarr-2.10.0.tgz +0 -0
@@ -745,126 +745,115 @@ var createClient = (config = {}) => {
745
745
  return { opts: resolvedOpts, url };
746
746
  };
747
747
  const request = async (options) => {
748
- const { opts, url } = await beforeRequest(options);
749
- const requestInit = {
750
- redirect: "follow",
751
- ...opts,
752
- body: getValidRequestBody(opts)
753
- };
754
- let request2 = new Request(url, requestInit);
755
- for (const fn of interceptors.request.fns) {
756
- if (fn) {
757
- request2 = await fn(request2, opts);
758
- }
759
- }
760
- const _fetch = opts.fetch;
748
+ const throwOnError = options.throwOnError ?? _config.throwOnError;
749
+ const responseStyle = options.responseStyle ?? _config.responseStyle;
750
+ let request2;
761
751
  let response;
762
752
  try {
763
- response = await _fetch(request2);
764
- } catch (error2) {
765
- let finalError2 = error2;
766
- for (const fn of interceptors.error.fns) {
753
+ const { opts, url } = await beforeRequest(options);
754
+ const requestInit = {
755
+ redirect: "follow",
756
+ ...opts,
757
+ body: getValidRequestBody(opts)
758
+ };
759
+ request2 = new Request(url, requestInit);
760
+ for (const fn of interceptors.request.fns) {
767
761
  if (fn) {
768
- finalError2 = await fn(error2, undefined, request2, opts);
762
+ request2 = await fn(request2, opts);
769
763
  }
770
764
  }
771
- finalError2 = finalError2 || {};
772
- if (opts.throwOnError) {
773
- throw finalError2;
765
+ const _fetch = opts.fetch;
766
+ response = await _fetch(request2);
767
+ for (const fn of interceptors.response.fns) {
768
+ if (fn) {
769
+ response = await fn(response, request2, opts);
770
+ }
774
771
  }
775
- return opts.responseStyle === "data" ? undefined : {
776
- error: finalError2,
772
+ const result = {
777
773
  request: request2,
778
- response: undefined
774
+ response
779
775
  };
780
- }
781
- for (const fn of interceptors.response.fns) {
782
- if (fn) {
783
- response = await fn(response, request2, opts);
784
- }
785
- }
786
- const result = {
787
- request: request2,
788
- response
789
- };
790
- if (response.ok) {
791
- const parseAs = (opts.parseAs === "auto" ? getParseAs(response.headers.get("Content-Type")) : opts.parseAs) ?? "json";
792
- if (response.status === 204 || response.headers.get("Content-Length") === "0") {
793
- let emptyData;
776
+ if (response.ok) {
777
+ const parseAs = (opts.parseAs === "auto" ? getParseAs(response.headers.get("Content-Type")) : opts.parseAs) ?? "json";
778
+ if (response.status === 204 || response.headers.get("Content-Length") === "0") {
779
+ let emptyData;
780
+ switch (parseAs) {
781
+ case "arrayBuffer":
782
+ case "blob":
783
+ case "text":
784
+ emptyData = await response[parseAs]();
785
+ break;
786
+ case "formData":
787
+ emptyData = new FormData;
788
+ break;
789
+ case "stream":
790
+ emptyData = response.body;
791
+ break;
792
+ case "json":
793
+ default:
794
+ emptyData = {};
795
+ break;
796
+ }
797
+ return opts.responseStyle === "data" ? emptyData : {
798
+ data: emptyData,
799
+ ...result
800
+ };
801
+ }
802
+ let data;
794
803
  switch (parseAs) {
795
804
  case "arrayBuffer":
796
805
  case "blob":
806
+ case "formData":
797
807
  case "text":
798
- emptyData = await response[parseAs]();
808
+ data = await response[parseAs]();
799
809
  break;
800
- case "formData":
801
- emptyData = new FormData;
810
+ case "json": {
811
+ const text = await response.text();
812
+ data = text ? JSON.parse(text) : {};
802
813
  break;
814
+ }
803
815
  case "stream":
804
- emptyData = response.body;
805
- break;
806
- case "json":
807
- default:
808
- emptyData = {};
809
- break;
816
+ return opts.responseStyle === "data" ? response.body : {
817
+ data: response.body,
818
+ ...result
819
+ };
810
820
  }
811
- return opts.responseStyle === "data" ? emptyData : {
812
- data: emptyData,
821
+ if (parseAs === "json") {
822
+ if (opts.responseValidator) {
823
+ await opts.responseValidator(data);
824
+ }
825
+ if (opts.responseTransformer) {
826
+ data = await opts.responseTransformer(data);
827
+ }
828
+ }
829
+ return opts.responseStyle === "data" ? data : {
830
+ data,
813
831
  ...result
814
832
  };
815
833
  }
816
- let data;
817
- switch (parseAs) {
818
- case "arrayBuffer":
819
- case "blob":
820
- case "formData":
821
- case "text":
822
- data = await response[parseAs]();
823
- break;
824
- case "json": {
825
- const text = await response.text();
826
- data = text ? JSON.parse(text) : {};
827
- break;
834
+ const textError = await response.text();
835
+ let jsonError;
836
+ try {
837
+ jsonError = JSON.parse(textError);
838
+ } catch {}
839
+ throw jsonError ?? textError;
840
+ } catch (error) {
841
+ let finalError = error;
842
+ for (const fn of interceptors.error.fns) {
843
+ if (fn) {
844
+ finalError = await fn(finalError, response, request2, options);
828
845
  }
829
- case "stream":
830
- return opts.responseStyle === "data" ? response.body : {
831
- data: response.body,
832
- ...result
833
- };
834
846
  }
835
- if (parseAs === "json") {
836
- if (opts.responseValidator) {
837
- await opts.responseValidator(data);
838
- }
839
- if (opts.responseTransformer) {
840
- data = await opts.responseTransformer(data);
841
- }
847
+ finalError = finalError || {};
848
+ if (throwOnError) {
849
+ throw finalError;
842
850
  }
843
- return opts.responseStyle === "data" ? data : {
844
- data,
845
- ...result
851
+ return responseStyle === "data" ? undefined : {
852
+ error: finalError,
853
+ request: request2,
854
+ response
846
855
  };
847
856
  }
848
- const textError = await response.text();
849
- let jsonError;
850
- try {
851
- jsonError = JSON.parse(textError);
852
- } catch {}
853
- const error = jsonError ?? textError;
854
- let finalError = error;
855
- for (const fn of interceptors.error.fns) {
856
- if (fn) {
857
- finalError = await fn(error, response, request2, opts);
858
- }
859
- }
860
- finalError = finalError || {};
861
- if (opts.throwOnError) {
862
- throw finalError;
863
- }
864
- return opts.responseStyle === "data" ? undefined : {
865
- error: finalError,
866
- ...result
867
- };
868
857
  };
869
858
  const makeMethodFn = (method) => (options) => request({ ...options, method });
870
859
  const makeSseFn = (method) => async (options) => {
@@ -872,7 +861,6 @@ var createClient = (config = {}) => {
872
861
  return createSseClient({
873
862
  ...opts,
874
863
  body: opts.body,
875
- headers: opts.headers,
876
864
  method,
877
865
  onRequest: async (url2, init) => {
878
866
  let request2 = new Request(url2, init);
@@ -1011,6 +999,7 @@ class QBittorrentClient {
1011
999
  username;
1012
1000
  password;
1013
1001
  sid = null;
1002
+ cookieName = "SID";
1014
1003
  fetch;
1015
1004
  constructor(config) {
1016
1005
  if (!config.baseUrl) {
@@ -1019,16 +1008,40 @@ class QBittorrentClient {
1019
1008
  this.baseUrl = config.baseUrl.replace(/\/$/, "");
1020
1009
  this.username = config.username;
1021
1010
  this.password = config.password;
1022
- this.fetch = createResilientFetch({
1011
+ const baseFetch = createResilientFetch({
1023
1012
  timeout: config.timeout ?? DEFAULT_TIMEOUT_MS,
1024
1013
  retry: config.retry
1025
1014
  });
1015
+ this.fetch = (input, init) => this.fetchWithCookieName(baseFetch, input, init);
1026
1016
  client.setConfig({
1027
1017
  baseUrl: `${this.baseUrl}/api/v2`,
1028
1018
  auth: () => this.ensureAuth(),
1029
1019
  fetch: this.fetch
1030
1020
  });
1031
1021
  }
1022
+ async fetchWithCookieName(baseFetch, input, init) {
1023
+ if (this.cookieName === "SID") {
1024
+ return baseFetch(input, init);
1025
+ }
1026
+ if (input instanceof Request) {
1027
+ const cookie = input.headers.get("cookie");
1028
+ if (cookie?.includes("SID=")) {
1029
+ const headers = new Headers(input.headers);
1030
+ headers.set("cookie", cookie.replace(/(^|;\s*)SID=/, `$1${this.cookieName}=`));
1031
+ return baseFetch(new Request(input, { headers }), init);
1032
+ }
1033
+ return baseFetch(input, init);
1034
+ }
1035
+ if (init?.headers) {
1036
+ const headers = new Headers(init.headers);
1037
+ const cookie = headers.get("cookie");
1038
+ if (cookie?.includes("SID=")) {
1039
+ headers.set("cookie", cookie.replace(/(^|;\s*)SID=/, `$1${this.cookieName}=`));
1040
+ return baseFetch(input, { ...init, headers });
1041
+ }
1042
+ }
1043
+ return baseFetch(input, init);
1044
+ }
1032
1045
  async ensureAuth() {
1033
1046
  if (!this.sid) {
1034
1047
  await this.login();
@@ -1050,16 +1063,17 @@ class QBittorrentClient {
1050
1063
  if (!response.ok) {
1051
1064
  throw new ConnectionError(`qBittorrent login failed (${response.status})`);
1052
1065
  }
1053
- const text = await response.text();
1054
- if (text.trim() !== "Ok.") {
1066
+ const text = (await response.text()).trim();
1067
+ if (text && text !== "Ok.") {
1055
1068
  throw new ConnectionError("qBittorrent authentication failed: invalid username or password");
1056
1069
  }
1057
1070
  const setCookie = response.headers.get("set-cookie");
1058
- const sidMatch = setCookie?.match(/SID=([^;]+)/);
1071
+ const sidMatch = setCookie?.match(/(SID|QBT_SID_\d+)=([^;]+)/);
1059
1072
  if (!sidMatch) {
1060
1073
  throw new ConnectionError("qBittorrent login succeeded but no SID cookie received");
1061
1074
  }
1062
- this.sid = sidMatch[1];
1075
+ this.cookieName = sidMatch[1];
1076
+ this.sid = sidMatch[2];
1063
1077
  }
1064
1078
  async getAppVersion() {
1065
1079
  const result = await appVersionGet();
@@ -1104,3 +1118,6 @@ class QBittorrentClient {
1104
1118
  export {
1105
1119
  QBittorrentClient
1106
1120
  };
1121
+
1122
+ //# debugId=EEFE0D3C2E02FFD464756E2164756E21
1123
+ //# sourceMappingURL=qbittorrent.js.map