cross-seed 7.0.0-21 → 7.0.0-23
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/dist/action.js +7 -8
- package/dist/action.js.map +1 -1
- package/dist/arr.js +2 -2
- package/dist/arr.js.map +1 -1
- package/dist/bencode.d.ts +62 -0
- package/dist/bencode.js +248 -0
- package/dist/bencode.js.map +1 -0
- package/dist/clients/Deluge.d.ts +5 -10
- package/dist/clients/Deluge.js +115 -89
- package/dist/clients/Deluge.js.map +1 -1
- package/dist/clients/QBittorrent.d.ts +3 -0
- package/dist/clients/QBittorrent.js +43 -30
- package/dist/clients/QBittorrent.js.map +1 -1
- package/dist/clients/RTorrent.d.ts +3 -2
- package/dist/clients/RTorrent.js +120 -41
- package/dist/clients/RTorrent.js.map +1 -1
- package/dist/clients/TorrentClient.d.ts +3 -2
- package/dist/clients/TorrentClient.js +3 -5
- package/dist/clients/TorrentClient.js.map +1 -1
- package/dist/clients/Transmission.d.ts +1 -0
- package/dist/clients/Transmission.js +90 -40
- package/dist/clients/Transmission.js.map +1 -1
- package/dist/clients/qbittorrent-version.d.ts +6 -0
- package/dist/clients/qbittorrent-version.js +11 -0
- package/dist/clients/qbittorrent-version.js.map +1 -0
- package/dist/clients/scgi.d.ts +14 -0
- package/dist/clients/scgi.js +111 -0
- package/dist/clients/scgi.js.map +1 -0
- package/dist/cmd.js +1 -1
- package/dist/cmd.js.map +1 -1
- package/dist/configuration.js +49 -9
- package/dist/configuration.js.map +1 -1
- package/dist/constants.d.ts +10 -0
- package/dist/constants.js +12 -2
- package/dist/constants.js.map +1 -1
- package/dist/dataFiles.d.ts +1 -0
- package/dist/dataFiles.js +252 -60
- package/dist/dataFiles.js.map +1 -1
- package/dist/db.js +8 -4
- package/dist/db.js.map +1 -1
- package/dist/decide.js +8 -8
- package/dist/decide.js.map +1 -1
- package/dist/devLogin.js.map +1 -1
- package/dist/diff.js.map +1 -1
- package/dist/indexers.js +5 -4
- package/dist/indexers.js.map +1 -1
- package/dist/inject.js +5 -5
- package/dist/inject.js.map +1 -1
- package/dist/jobs.js +2 -1
- package/dist/jobs.js.map +1 -1
- package/dist/libraryInventory.d.ts +176 -0
- package/dist/libraryInventory.js +701 -0
- package/dist/libraryInventory.js.map +1 -0
- package/dist/logger.js +7 -5
- package/dist/logger.js.map +1 -1
- package/dist/migrations/09-clientAndDataSearchees.js +1 -0
- package/dist/migrations/09-clientAndDataSearchees.js.map +1 -1
- package/dist/migrations/17-api-key-settings-json.js +3 -1
- package/dist/migrations/17-api-key-settings-json.js.map +1 -1
- package/dist/migrations/18-library-inventory.d.ts +9 -0
- package/dist/migrations/18-library-inventory.js +48 -0
- package/dist/migrations/18-library-inventory.js.map +1 -0
- package/dist/migrations/19-library-files.d.ts +9 -0
- package/dist/migrations/19-library-files.js +26 -0
- package/dist/migrations/19-library-files.js.map +1 -0
- package/dist/migrations/migrations.d.ts +12 -5
- package/dist/migrations/migrations.js +5 -1
- package/dist/migrations/migrations.js.map +1 -1
- package/dist/parseTorrent.d.ts +1 -1
- package/dist/parseTorrent.js +18 -4
- package/dist/parseTorrent.js.map +1 -1
- package/dist/pipeline.js +12 -11
- package/dist/pipeline.js.map +1 -1
- package/dist/problems/linking.js +1 -1
- package/dist/problems/linking.js.map +1 -1
- package/dist/problems.js +2 -1
- package/dist/problems.js.map +1 -1
- package/dist/pushNotifier.js +10 -9
- package/dist/pushNotifier.js.map +1 -1
- package/dist/routes/baseApi.d.ts +8 -0
- package/dist/routes/baseApi.js +26 -52
- package/dist/routes/baseApi.js.map +1 -1
- package/dist/routes/devLogin.js +1 -0
- package/dist/routes/devLogin.js.map +1 -1
- package/dist/routes/indexerApi.js +1 -0
- package/dist/routes/indexerApi.js.map +1 -1
- package/dist/routes/staticFrontendPlugin.js +1 -0
- package/dist/routes/staticFrontendPlugin.js.map +1 -1
- package/dist/searchee.d.ts +14 -2
- package/dist/searchee.js +26 -9
- package/dist/searchee.js.map +1 -1
- package/dist/services/indexerService.js +8 -2
- package/dist/services/indexerService.js.map +1 -1
- package/dist/startup.d.ts +1 -0
- package/dist/startup.js +11 -4
- package/dist/startup.js.map +1 -1
- package/dist/torrent.js +302 -115
- package/dist/torrent.js.map +1 -1
- package/dist/torznab.d.ts +2 -2
- package/dist/torznab.js +15 -14
- package/dist/torznab.js.map +1 -1
- package/dist/trpc/routers/auth.js +1 -1
- package/dist/trpc/routers/auth.js.map +1 -1
- package/dist/trpc/routers/clients.js +8 -13
- package/dist/trpc/routers/clients.js.map +1 -1
- package/dist/trpc/routers/index.d.ts +51 -50
- package/dist/trpc/routers/index.js +2 -2
- package/dist/trpc/routers/index.js.map +1 -1
- package/dist/trpc/routers/jobs.js +1 -1
- package/dist/trpc/routers/jobs.js.map +1 -1
- package/dist/trpc/routers/library.d.ts +50 -0
- package/dist/trpc/routers/library.js +85 -0
- package/dist/trpc/routers/library.js.map +1 -0
- package/dist/trpc/routers/logs.js +6 -5
- package/dist/trpc/routers/logs.js.map +1 -1
- package/dist/trpc/routers/settings.js +78 -21
- package/dist/trpc/routers/settings.js.map +1 -1
- package/dist/trpc/routers/stats.d.ts +1 -0
- package/dist/trpc/routers/stats.js +11 -5
- package/dist/trpc/routers/stats.js.map +1 -1
- package/dist/userAuth.js +1 -1
- package/dist/userAuth.js.map +1 -1
- package/dist/utils/background.d.ts +7 -0
- package/dist/utils/background.js +14 -0
- package/dist/utils/background.js.map +1 -0
- package/dist/utils/logWatcher.js +3 -2
- package/dist/utils/logWatcher.js.map +1 -1
- package/dist/utils.d.ts +11 -1
- package/dist/utils.js +47 -8
- package/dist/utils.js.map +1 -1
- package/dist/webui/assets/DeleteOption-DkdJCiOu.js +1 -0
- package/dist/webui/assets/FieldInfo-rcCXc0d-.js +1 -0
- package/dist/webui/assets/Page-CKwSnUie.js +1 -0
- package/dist/webui/assets/array-field-DM2mAVqa.js +1 -0
- package/dist/webui/assets/badge-CLUazitN.js +1 -0
- package/dist/webui/assets/button-DoKPR9Fv.js +1 -0
- package/dist/webui/assets/check-BlfHpqkp.js +1 -0
- package/dist/webui/assets/clients-B5C80D0F.js +1 -0
- package/dist/webui/assets/connect-BM7yGLAl.js +2 -0
- package/dist/webui/assets/createLucideIcon-Cv-_CLkr.js +1 -0
- package/dist/webui/assets/debug-C8d57uIb.js +1 -0
- package/dist/webui/assets/directories-DkJnb01t.js +1 -0
- package/dist/webui/assets/dist-B7BqKb_s.js +1 -0
- package/dist/webui/assets/dist-CXZZv-cf.js +41 -0
- package/dist/webui/assets/dist-ChMQZgJB.js +1 -0
- package/dist/webui/assets/dist-DQ6Xm99Z.js +1 -0
- package/dist/webui/assets/duration-field-w-qiOS_S.js +1 -0
- package/dist/webui/assets/general-2HmkyF5T.js +1 -0
- package/dist/webui/assets/health-D6tv4ioy.js +1 -0
- package/dist/webui/assets/index-NlorOk2I.js +11 -0
- package/dist/webui/assets/index-UQKt4Igp.css +2 -0
- package/dist/webui/assets/input-BggK3IOz.js +1 -0
- package/dist/webui/assets/jobs-Do8vAIqy.js +1 -0
- package/dist/webui/assets/library-B1r1nAY-.js +1 -0
- package/dist/webui/assets/loader-circle-D988WNxu.js +1 -0
- package/dist/webui/assets/logs-_rm8bxf-.js +1 -0
- package/dist/webui/assets/number-field-CeKyqI7R.js +1 -0
- package/dist/webui/assets/react-dom-DtIef6y6.js +1 -0
- package/dist/webui/assets/required-indicator-Ba9NOQEP.js +1 -0
- package/dist/webui/assets/routes-Djgf7dZI.js +1 -0
- package/dist/webui/assets/search-DGY0ui92.js +1 -0
- package/dist/webui/assets/select-BzZ418Yt.js +1 -0
- package/dist/webui/assets/select-field-DsBowTDT.js +1 -0
- package/dist/webui/assets/settings-B4G8vHXc.js +1 -0
- package/dist/webui/assets/sidebar-Qy-rYdhU.js +5 -0
- package/dist/webui/assets/submit-button-Bx2Dvr03.js +1 -0
- package/dist/webui/assets/switch-CttdmVGp.js +1 -0
- package/dist/webui/assets/switch-field-p-JPVVvW.js +1 -0
- package/dist/webui/assets/table-Bs6CQscS.js +1 -0
- package/dist/webui/assets/{test-tube-CbcievIk.js → test-tube-DD9Yz2bZ.js} +1 -1
- package/dist/webui/assets/text-field-B0a3dEGb.js +1 -0
- package/dist/webui/assets/time-KFQKyrl-.js +1 -0
- package/dist/webui/assets/trackers-DG-YCaaO.js +7 -0
- package/dist/webui/assets/{trash-D083IWKI.js → trash-PHXIGUCt.js} +1 -1
- package/dist/webui/assets/use-settings-form-submit-CDmMUcwW.js +57 -0
- package/dist/webui/assets/useSelector-BoN-mufS.js +2 -0
- package/dist/webui/assets/utils-P-unlvb4.js +1 -0
- package/dist/webui/assets/with-selector-fbK2t2oY.js +1 -0
- package/dist/webui/index.html +12 -14
- package/node_modules/@cross-seed/shared/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@cross-seed/shared/package.json +6 -2
- package/node_modules/zod/README.md +30 -20
- package/node_modules/zod/compile.cjs +96 -0
- package/node_modules/zod/compile.d.cts +1 -0
- package/node_modules/zod/compile.d.ts +1 -0
- package/node_modules/zod/compile.js +52 -0
- package/node_modules/zod/index.cjs +21 -2
- package/node_modules/zod/index.d.cts +1 -2
- package/node_modules/zod/index.d.ts +1 -2
- package/node_modules/zod/index.js +5 -2
- package/node_modules/zod/locales/index.cjs +19 -0
- package/node_modules/zod/locales/package.json +2 -1
- package/node_modules/zod/mini/index.cjs +19 -0
- package/node_modules/zod/mini/package.json +2 -1
- package/node_modules/zod/package.json +20 -8
- package/node_modules/zod/src/compile.ts +56 -0
- package/node_modules/zod/src/index.ts +5 -2
- package/node_modules/zod/src/v3/ZodError.ts +22 -12
- package/node_modules/zod/src/v3/helpers/errorUtil.ts +1 -1
- package/node_modules/zod/src/v3/tests/all-errors.test.ts +3 -3
- package/node_modules/zod/src/v3/tests/error.test.ts +35 -0
- package/node_modules/zod/src/v3/tests/intersection.test.ts +18 -0
- package/node_modules/zod/src/v3/tests/language-server.test.ts +1 -2
- package/node_modules/zod/src/v3/tests/object.test.ts +8 -11
- package/node_modules/zod/src/v3/tests/partials.test.ts +3 -3
- package/node_modules/zod/src/v3/tests/readonly.test.ts +0 -80
- package/node_modules/zod/src/v3/tests/string.test.ts +6 -0
- package/node_modules/zod/src/v3/types.ts +5 -5
- package/node_modules/zod/src/v4/classic/checks.ts +1 -0
- package/node_modules/zod/src/v4/classic/compat.ts +26 -18
- package/node_modules/zod/src/v4/classic/deep-partial.ts +76 -0
- package/node_modules/zod/src/v4/classic/errors.ts +60 -45
- package/node_modules/zod/src/v4/classic/external.ts +15 -9
- package/node_modules/zod/src/v4/classic/from-json-schema.ts +389 -88
- package/node_modules/zod/src/v4/classic/in-out.ts +45 -0
- package/node_modules/zod/src/v4/classic/index.ts +2 -2
- package/node_modules/zod/src/v4/classic/iso.ts +2 -72
- package/node_modules/zod/src/v4/classic/parse.ts +16 -10
- package/node_modules/zod/src/v4/classic/schemas.ts +863 -335
- package/node_modules/zod/src/v4/classic/tests/apply.test.ts +27 -0
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +29 -2
- package/node_modules/zod/src/v4/classic/tests/assignability.test.ts +192 -0
- package/node_modules/zod/src/v4/classic/tests/bigint.test.ts +36 -1
- package/node_modules/zod/src/v4/classic/tests/catch.test.ts +328 -0
- package/node_modules/zod/src/v4/classic/tests/codec-examples.test.ts +1 -2
- package/node_modules/zod/src/v4/classic/tests/codec.test.ts +144 -2
- package/node_modules/zod/src/v4/classic/tests/continuability.test.ts +4 -4
- package/node_modules/zod/src/v4/classic/tests/credit-card.test.ts +76 -0
- package/node_modules/zod/src/v4/classic/tests/cyclic-data.test.ts +985 -0
- package/node_modules/zod/src/v4/classic/tests/date.test.ts +30 -0
- package/node_modules/zod/src/v4/classic/tests/datetime.test.ts +31 -17
- package/node_modules/zod/src/v4/classic/tests/deep-partial.test.ts +380 -0
- package/node_modules/zod/src/v4/classic/tests/default-locale.test.ts +32 -0
- package/node_modules/zod/src/v4/classic/tests/default.test.ts +90 -0
- package/node_modules/zod/src/v4/classic/tests/detached-methods.test.ts +221 -0
- package/node_modules/zod/src/v4/classic/tests/discriminated-unions.test.ts +291 -10
- package/node_modules/zod/src/v4/classic/tests/enum.test.ts +20 -0
- package/node_modules/zod/src/v4/classic/tests/error-utils.test.ts +324 -2
- package/node_modules/zod/src/v4/classic/tests/error.test.ts +403 -6
- package/node_modules/zod/src/v4/classic/tests/from-json-schema.test.ts +743 -10
- package/node_modules/zod/src/v4/classic/tests/function.test.ts +37 -6
- package/node_modules/zod/src/v4/classic/tests/global-config.test.ts +32 -0
- package/node_modules/zod/src/v4/classic/tests/hash.test.ts +1 -2
- package/node_modules/zod/src/v4/classic/tests/iban.test.ts +81 -0
- package/node_modules/zod/src/v4/classic/tests/in-out.test.ts +159 -0
- package/node_modules/zod/src/v4/classic/tests/index.test.ts +23 -4
- package/node_modules/zod/src/v4/classic/tests/instance-footprint.test.ts +319 -0
- package/node_modules/zod/src/v4/classic/tests/instanceof.test.ts +67 -0
- package/node_modules/zod/src/v4/classic/tests/intersection.test.ts +136 -0
- package/node_modules/zod/src/v4/classic/tests/issue-schema.test.ts +215 -0
- package/node_modules/zod/src/v4/classic/tests/jitless-allows-eval.test.ts +39 -0
- package/node_modules/zod/src/v4/classic/tests/lazy.test.ts +36 -1
- package/node_modules/zod/src/v4/classic/tests/literal.test.ts +12 -1
- package/node_modules/zod/src/v4/classic/tests/locales_ka.test.ts +29 -0
- package/node_modules/zod/src/v4/classic/tests/locales_ro.test.ts +24 -0
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +19 -0
- package/node_modules/zod/src/v4/classic/tests/number.test.ts +138 -7
- package/node_modules/zod/src/v4/classic/tests/object.test.ts +378 -12
- package/node_modules/zod/src/v4/classic/tests/optin-ladder.test.ts +235 -0
- package/node_modules/zod/src/v4/classic/tests/optional.test.ts +156 -13
- package/node_modules/zod/src/v4/classic/tests/partial.test.ts +71 -1
- package/node_modules/zod/src/v4/classic/tests/prefault.test.ts +71 -1
- package/node_modules/zod/src/v4/classic/tests/preprocess-types.test.ts +44 -0
- package/node_modules/zod/src/v4/classic/tests/preprocess.test.ts +69 -0
- package/node_modules/zod/src/v4/classic/tests/properties.test.ts +141 -0
- package/node_modules/zod/src/v4/classic/tests/readonly.test.ts +0 -68
- package/node_modules/zod/src/v4/classic/tests/record.test.ts +269 -16
- package/node_modules/zod/src/v4/classic/tests/recursive-types.test.ts +126 -1
- package/node_modules/zod/src/v4/classic/tests/redos.test.ts +68 -0
- package/node_modules/zod/src/v4/classic/tests/refine.test.ts +123 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +15 -0
- package/node_modules/zod/src/v4/classic/tests/standard-schema.test.ts +19 -0
- package/node_modules/zod/src/v4/classic/tests/string.test.ts +269 -4
- package/node_modules/zod/src/v4/classic/tests/stringbool.test.ts +18 -0
- package/node_modules/zod/src/v4/classic/tests/template-literal.test.ts +48 -7
- package/node_modules/zod/src/v4/classic/tests/to-json-schema.test.ts +1948 -205
- package/node_modules/zod/src/v4/classic/tests/transform.test.ts +17 -0
- package/node_modules/zod/src/v4/classic/tests/tuple.test.ts +330 -2
- package/node_modules/zod/src/v4/classic/tests/union.test.ts +93 -2
- package/node_modules/zod/src/v4/classic/tests/validate.test.ts +645 -0
- package/node_modules/zod/src/v4/classic/tests/validations.test.ts +2 -2
- package/node_modules/zod/src/v4/core/api.ts +111 -34
- package/node_modules/zod/src/v4/core/checks.ts +120 -147
- package/node_modules/zod/src/v4/core/compile.ts +2322 -0
- package/node_modules/zod/src/v4/core/core.ts +116 -24
- package/node_modules/zod/src/v4/core/doc.ts +17 -9
- package/node_modules/zod/src/v4/core/errors.ts +138 -43
- package/node_modules/zod/src/v4/core/index.ts +3 -0
- package/node_modules/zod/src/v4/core/json-schema-generator.ts +8 -3
- package/node_modules/zod/src/v4/core/json-schema-processors.ts +440 -173
- package/node_modules/zod/src/v4/core/json-schema.ts +2 -1
- package/node_modules/zod/src/v4/core/memoizer.ts +331 -0
- package/node_modules/zod/src/v4/core/parse.ts +167 -53
- package/node_modules/zod/src/v4/core/regexes.ts +50 -16
- package/node_modules/zod/src/v4/core/registries.ts +2 -2
- package/node_modules/zod/src/v4/core/schemas.ts +1219 -531
- package/node_modules/zod/src/v4/core/tests/cached.test.ts +54 -0
- package/node_modules/zod/src/v4/core/tests/compile-differential.test.ts +1004 -0
- package/node_modules/zod/src/v4/core/tests/compile-generative.test.ts +445 -0
- package/node_modules/zod/src/v4/core/tests/compile-global.test.ts +89 -0
- package/node_modules/zod/src/v4/core/tests/compile-off-by-default.test.ts +26 -0
- package/node_modules/zod/src/v4/core/tests/compile-stats.test.ts +34 -0
- package/node_modules/zod/src/v4/core/tests/compile.test.ts +2036 -0
- package/node_modules/zod/src/v4/core/tests/email-regex.test.ts +140 -0
- package/node_modules/zod/src/v4/core/tests/locales/el.test.ts +214 -0
- package/node_modules/zod/src/v4/core/tests/locales/es.test.ts +1 -2
- package/node_modules/zod/src/v4/core/tests/locales/fr.test.ts +72 -0
- package/node_modules/zod/src/v4/core/tests/locales/hr.test.ts +163 -0
- package/node_modules/zod/src/v4/core/tests/locales/parity.test.ts +42 -0
- package/node_modules/zod/src/v4/core/tests/locales/tg.test.ts +85 -0
- package/node_modules/zod/src/v4/core/tests/locales/tk.test.ts +69 -0
- package/node_modules/zod/src/v4/core/tests/locales/uz.test.ts +22 -0
- package/node_modules/zod/src/v4/core/tests/polyfill-collision.test.ts +46 -0
- package/node_modules/zod/src/v4/core/tests/record-constructor.test.ts +58 -0
- package/node_modules/zod/src/v4/core/tests/treeshake.test.ts +51 -0
- package/node_modules/zod/src/v4/core/tests/url-no-canparse.test.ts +133 -0
- package/node_modules/zod/src/v4/core/to-json-schema.ts +288 -44
- package/node_modules/zod/src/v4/core/util.ts +506 -179
- package/node_modules/zod/src/v4/core/versions.ts +2 -2
- package/node_modules/zod/src/v4/core/visit.ts +193 -0
- package/node_modules/zod/src/v4/index.ts +3 -3
- package/node_modules/zod/src/v4/locales/ar.ts +5 -0
- package/node_modules/zod/src/v4/locales/az.ts +5 -0
- package/node_modules/zod/src/v4/locales/be.ts +12 -0
- package/node_modules/zod/src/v4/locales/bg.ts +5 -0
- package/node_modules/zod/src/v4/locales/bn.ts +123 -0
- package/node_modules/zod/src/v4/locales/ca.ts +5 -0
- package/node_modules/zod/src/v4/locales/ckb.ts +140 -0
- package/node_modules/zod/src/v4/locales/cs.ts +5 -0
- package/node_modules/zod/src/v4/locales/da.ts +7 -2
- package/node_modules/zod/src/v4/locales/de.ts +5 -0
- package/node_modules/zod/src/v4/locales/el.ts +124 -0
- package/node_modules/zod/src/v4/locales/en.ts +21 -4
- package/node_modules/zod/src/v4/locales/eo.ts +5 -0
- package/node_modules/zod/src/v4/locales/es.ts +4 -0
- package/node_modules/zod/src/v4/locales/fa.ts +5 -0
- package/node_modules/zod/src/v4/locales/fi.ts +5 -0
- package/node_modules/zod/src/v4/locales/fr-CA.ts +5 -0
- package/node_modules/zod/src/v4/locales/fr.ts +41 -18
- package/node_modules/zod/src/v4/locales/gu.ts +123 -0
- package/node_modules/zod/src/v4/locales/he.ts +8 -1
- package/node_modules/zod/src/v4/locales/hi.ts +126 -0
- package/node_modules/zod/src/v4/locales/hr.ts +135 -0
- package/node_modules/zod/src/v4/locales/hu.ts +5 -0
- package/node_modules/zod/src/v4/locales/hy.ts +11 -0
- package/node_modules/zod/src/v4/locales/id.ts +5 -0
- package/node_modules/zod/src/v4/locales/index.ts +14 -0
- package/node_modules/zod/src/v4/locales/is.ts +5 -0
- package/node_modules/zod/src/v4/locales/it.ts +6 -1
- package/node_modules/zod/src/v4/locales/ja.ts +5 -0
- package/node_modules/zod/src/v4/locales/ka.ts +13 -8
- package/node_modules/zod/src/v4/locales/km.ts +5 -0
- package/node_modules/zod/src/v4/locales/kn.ts +126 -0
- package/node_modules/zod/src/v4/locales/ko.ts +5 -0
- package/node_modules/zod/src/v4/locales/lt.ts +4 -0
- package/node_modules/zod/src/v4/locales/mk.ts +5 -0
- package/node_modules/zod/src/v4/locales/ms.ts +5 -0
- package/node_modules/zod/src/v4/locales/ne.ts +128 -0
- package/node_modules/zod/src/v4/locales/nl.ts +5 -0
- package/node_modules/zod/src/v4/locales/nn.ts +121 -0
- package/node_modules/zod/src/v4/locales/no.ts +7 -2
- package/node_modules/zod/src/v4/locales/ota.ts +5 -0
- package/node_modules/zod/src/v4/locales/pl.ts +5 -0
- package/node_modules/zod/src/v4/locales/ps.ts +5 -0
- package/node_modules/zod/src/v4/locales/pt-BR.ts +161 -0
- package/node_modules/zod/src/v4/locales/pt.ts +101 -58
- package/node_modules/zod/src/v4/locales/ro.ts +132 -0
- package/node_modules/zod/src/v4/locales/ru.ts +12 -0
- package/node_modules/zod/src/v4/locales/sk.ts +123 -0
- package/node_modules/zod/src/v4/locales/sl.ts +5 -0
- package/node_modules/zod/src/v4/locales/sv.ts +7 -2
- package/node_modules/zod/src/v4/locales/ta.ts +5 -0
- package/node_modules/zod/src/v4/locales/tg.ts +135 -0
- package/node_modules/zod/src/v4/locales/th.ts +5 -0
- package/node_modules/zod/src/v4/locales/tk.ts +113 -0
- package/node_modules/zod/src/v4/locales/tr.ts +5 -0
- package/node_modules/zod/src/v4/locales/uk.ts +5 -0
- package/node_modules/zod/src/v4/locales/ur.ts +5 -0
- package/node_modules/zod/src/v4/locales/uz.ts +4 -0
- package/node_modules/zod/src/v4/locales/vi.ts +5 -0
- package/node_modules/zod/src/v4/locales/yo.ts +5 -0
- package/node_modules/zod/src/v4/locales/zh-CN.ts +5 -0
- package/node_modules/zod/src/v4/locales/zh-TW.ts +5 -0
- package/node_modules/zod/src/v4/mini/checks.ts +1 -0
- package/node_modules/zod/src/v4/mini/deep-partial.ts +73 -0
- package/node_modules/zod/src/v4/mini/external.ts +13 -1
- package/node_modules/zod/src/v4/mini/in-out.ts +45 -0
- package/node_modules/zod/src/v4/mini/parse.ts +2 -0
- package/node_modules/zod/src/v4/mini/schemas.ts +214 -79
- package/node_modules/zod/src/v4/mini/tests/apply.test.ts +33 -0
- package/node_modules/zod/src/v4/mini/tests/assignability.test.ts +62 -1
- package/node_modules/zod/src/v4/mini/tests/checks.test.ts +14 -0
- package/node_modules/zod/src/v4/mini/tests/codec.test.ts +54 -1
- package/node_modules/zod/src/v4/mini/tests/computed.test.ts +11 -17
- package/node_modules/zod/src/v4/mini/tests/cyclic-data.test.ts +84 -0
- package/node_modules/zod/src/v4/mini/tests/deep-partial.test.ts +54 -0
- package/node_modules/zod/src/v4/mini/tests/error.test.ts +23 -4
- package/node_modules/zod/src/v4/mini/tests/functions.test.ts +9 -0
- package/node_modules/zod/src/v4/mini/tests/index.test.ts +187 -4
- package/node_modules/zod/src/v4/mini/tests/number.test.ts +14 -0
- package/node_modules/zod/src/v4/mini/tests/object.test.ts +74 -9
- package/node_modules/zod/src/v4/mini/tests/recursive-types.test.ts +67 -1
- package/node_modules/zod/src/v4/mini/tests/string.test.ts +49 -0
- package/node_modules/zod/v3/ZodError.cjs +41 -12
- package/node_modules/zod/v3/ZodError.d.cts +1 -1
- package/node_modules/zod/v3/ZodError.d.ts +1 -1
- package/node_modules/zod/v3/ZodError.js +22 -12
- package/node_modules/zod/v3/errors.cjs +19 -0
- package/node_modules/zod/v3/external.cjs +19 -0
- package/node_modules/zod/v3/helpers/enumUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/errorUtil.cjs +20 -1
- package/node_modules/zod/v3/helpers/errorUtil.js +1 -1
- package/node_modules/zod/v3/helpers/parseUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/partialUtil.cjs +19 -0
- package/node_modules/zod/v3/helpers/typeAliases.cjs +19 -0
- package/node_modules/zod/v3/helpers/util.cjs +19 -0
- package/node_modules/zod/v3/index.cjs +19 -0
- package/node_modules/zod/v3/package.json +2 -1
- package/node_modules/zod/v3/standard-schema.cjs +19 -0
- package/node_modules/zod/v3/types.cjs +26 -5
- package/node_modules/zod/v3/types.js +7 -5
- package/node_modules/zod/v4/classic/checks.cjs +21 -1
- package/node_modules/zod/v4/classic/checks.d.cts +1 -1
- package/node_modules/zod/v4/classic/checks.d.ts +1 -1
- package/node_modules/zod/v4/classic/checks.js +1 -1
- package/node_modules/zod/v4/classic/coerce.cjs +19 -0
- package/node_modules/zod/v4/classic/compat.cjs +19 -0
- package/node_modules/zod/v4/classic/compat.d.cts +9 -11
- package/node_modules/zod/v4/classic/compat.d.ts +9 -11
- package/node_modules/zod/v4/classic/deep-partial.cjs +58 -0
- package/node_modules/zod/v4/classic/deep-partial.d.cts +14 -0
- package/node_modules/zod/v4/classic/deep-partial.d.ts +14 -0
- package/node_modules/zod/v4/classic/deep-partial.js +13 -0
- package/node_modules/zod/v4/classic/errors.cjs +62 -34
- package/node_modules/zod/v4/classic/errors.d.cts +3 -4
- package/node_modules/zod/v4/classic/errors.d.ts +3 -4
- package/node_modules/zod/v4/classic/errors.js +44 -35
- package/node_modules/zod/v4/classic/external.cjs +51 -27
- package/node_modules/zod/v4/classic/external.d.cts +6 -2
- package/node_modules/zod/v4/classic/external.d.ts +6 -2
- package/node_modules/zod/v4/classic/external.js +5 -8
- package/node_modules/zod/v4/classic/from-json-schema.cjs +394 -78
- package/node_modules/zod/v4/classic/from-json-schema.js +375 -78
- package/node_modules/zod/v4/classic/in-out.cjs +82 -0
- package/node_modules/zod/v4/classic/in-out.d.cts +8 -0
- package/node_modules/zod/v4/classic/in-out.d.ts +8 -0
- package/node_modules/zod/v4/classic/in-out.js +36 -0
- package/node_modules/zod/v4/classic/index.cjs +21 -2
- package/node_modules/zod/v4/classic/index.d.cts +1 -2
- package/node_modules/zod/v4/classic/index.d.ts +1 -2
- package/node_modules/zod/v4/classic/index.js +2 -2
- package/node_modules/zod/v4/classic/iso.cjs +30 -22
- package/node_modules/zod/v4/classic/iso.d.cts +2 -17
- package/node_modules/zod/v4/classic/iso.d.ts +2 -17
- package/node_modules/zod/v4/classic/iso.js +2 -17
- package/node_modules/zod/v4/classic/package.json +2 -1
- package/node_modules/zod/v4/classic/parse.cjs +23 -1
- package/node_modules/zod/v4/classic/parse.d.cts +17 -4
- package/node_modules/zod/v4/classic/parse.d.ts +17 -4
- package/node_modules/zod/v4/classic/parse.js +1 -0
- package/node_modules/zod/v4/classic/schemas.cjs +629 -225
- package/node_modules/zod/v4/classic/schemas.d.cts +104 -27
- package/node_modules/zod/v4/classic/schemas.d.ts +104 -27
- package/node_modules/zod/v4/classic/schemas.js +601 -223
- package/node_modules/zod/v4/core/api.cjs +73 -26
- package/node_modules/zod/v4/core/api.d.cts +40 -9
- package/node_modules/zod/v4/core/api.d.ts +40 -9
- package/node_modules/zod/v4/core/api.js +51 -26
- package/node_modules/zod/v4/core/checks.cjs +88 -128
- package/node_modules/zod/v4/core/checks.d.cts +30 -14
- package/node_modules/zod/v4/core/checks.d.ts +30 -14
- package/node_modules/zod/v4/core/checks.js +68 -127
- package/node_modules/zod/v4/core/compile.cjs +1916 -0
- package/node_modules/zod/v4/core/compile.d.cts +65 -0
- package/node_modules/zod/v4/core/compile.d.ts +65 -0
- package/node_modules/zod/v4/core/compile.js +1866 -0
- package/node_modules/zod/v4/core/core.cjs +104 -20
- package/node_modules/zod/v4/core/core.d.cts +16 -4
- package/node_modules/zod/v4/core/core.d.ts +16 -4
- package/node_modules/zod/v4/core/core.js +87 -22
- package/node_modules/zod/v4/core/doc.cjs +31 -9
- package/node_modules/zod/v4/core/doc.d.cts +3 -1
- package/node_modules/zod/v4/core/doc.d.ts +3 -1
- package/node_modules/zod/v4/core/doc.js +12 -9
- package/node_modules/zod/v4/core/errors.cjs +146 -42
- package/node_modules/zod/v4/core/errors.d.cts +5 -0
- package/node_modules/zod/v4/core/errors.d.ts +5 -0
- package/node_modules/zod/v4/core/errors.js +127 -42
- package/node_modules/zod/v4/core/index.cjs +24 -1
- package/node_modules/zod/v4/core/index.d.cts +3 -0
- package/node_modules/zod/v4/core/index.d.ts +3 -0
- package/node_modules/zod/v4/core/index.js +3 -0
- package/node_modules/zod/v4/core/json-schema-generator.cjs +24 -1
- package/node_modules/zod/v4/core/json-schema-generator.d.cts +2 -2
- package/node_modules/zod/v4/core/json-schema-generator.d.ts +2 -2
- package/node_modules/zod/v4/core/json-schema-generator.js +6 -2
- package/node_modules/zod/v4/core/json-schema-processors.cjs +454 -173
- package/node_modules/zod/v4/core/json-schema-processors.d.cts +16 -0
- package/node_modules/zod/v4/core/json-schema-processors.d.ts +16 -0
- package/node_modules/zod/v4/core/json-schema-processors.js +413 -175
- package/node_modules/zod/v4/core/json-schema.cjs +19 -0
- package/node_modules/zod/v4/core/json-schema.d.cts +2 -1
- package/node_modules/zod/v4/core/json-schema.d.ts +2 -1
- package/node_modules/zod/v4/core/memoizer.cjs +360 -0
- package/node_modules/zod/v4/core/memoizer.d.cts +15 -0
- package/node_modules/zod/v4/core/memoizer.d.ts +15 -0
- package/node_modules/zod/v4/core/memoizer.js +311 -0
- package/node_modules/zod/v4/core/package.json +2 -1
- package/node_modules/zod/v4/core/parse.cjs +151 -49
- package/node_modules/zod/v4/core/parse.d.cts +14 -11
- package/node_modules/zod/v4/core/parse.d.ts +14 -11
- package/node_modules/zod/v4/core/parse.js +130 -48
- package/node_modules/zod/v4/core/regexes.cjs +61 -18
- package/node_modules/zod/v4/core/regexes.d.cts +11 -0
- package/node_modules/zod/v4/core/regexes.d.ts +11 -0
- package/node_modules/zod/v4/core/regexes.js +39 -16
- package/node_modules/zod/v4/core/registries.cjs +19 -0
- package/node_modules/zod/v4/core/registries.js +2 -2
- package/node_modules/zod/v4/core/schemas.cjs +957 -382
- package/node_modules/zod/v4/core/schemas.d.cts +154 -25
- package/node_modules/zod/v4/core/schemas.d.ts +154 -25
- package/node_modules/zod/v4/core/schemas.js +925 -382
- package/node_modules/zod/v4/core/standard-schema.cjs +19 -0
- package/node_modules/zod/v4/core/to-json-schema.cjs +275 -40
- package/node_modules/zod/v4/core/to-json-schema.d.cts +45 -5
- package/node_modules/zod/v4/core/to-json-schema.d.ts +45 -5
- package/node_modules/zod/v4/core/to-json-schema.js +253 -39
- package/node_modules/zod/v4/core/util.cjs +428 -174
- package/node_modules/zod/v4/core/util.d.cts +82 -1
- package/node_modules/zod/v4/core/util.d.ts +82 -1
- package/node_modules/zod/v4/core/util.js +397 -175
- package/node_modules/zod/v4/core/versions.cjs +21 -2
- package/node_modules/zod/v4/core/versions.d.cts +1 -1
- package/node_modules/zod/v4/core/versions.d.ts +1 -1
- package/node_modules/zod/v4/core/versions.js +2 -2
- package/node_modules/zod/v4/core/visit.cjs +214 -0
- package/node_modules/zod/v4/core/visit.d.cts +30 -0
- package/node_modules/zod/v4/core/visit.d.ts +30 -0
- package/node_modules/zod/v4/core/visit.js +169 -0
- package/node_modules/zod/v4/index.cjs +34 -5
- package/node_modules/zod/v4/index.d.cts +2 -2
- package/node_modules/zod/v4/index.d.ts +2 -2
- package/node_modules/zod/v4/index.js +3 -2
- package/node_modules/zod/v4/locales/ar.cjs +5 -0
- package/node_modules/zod/v4/locales/ar.js +5 -0
- package/node_modules/zod/v4/locales/az.cjs +5 -0
- package/node_modules/zod/v4/locales/az.js +5 -0
- package/node_modules/zod/v4/locales/be.cjs +12 -0
- package/node_modules/zod/v4/locales/be.js +12 -0
- package/node_modules/zod/v4/locales/bg.cjs +5 -0
- package/node_modules/zod/v4/locales/bg.js +5 -0
- package/node_modules/zod/v4/locales/bn.cjs +140 -0
- package/node_modules/zod/v4/locales/bn.d.cts +5 -0
- package/node_modules/zod/v4/locales/bn.d.ts +4 -0
- package/node_modules/zod/v4/locales/bn.js +113 -0
- package/node_modules/zod/v4/locales/ca.cjs +5 -0
- package/node_modules/zod/v4/locales/ca.js +5 -0
- package/node_modules/zod/v4/locales/ckb.cjs +160 -0
- package/node_modules/zod/v4/locales/ckb.d.cts +5 -0
- package/node_modules/zod/v4/locales/ckb.d.ts +4 -0
- package/node_modules/zod/v4/locales/ckb.js +133 -0
- package/node_modules/zod/v4/locales/cs.cjs +5 -0
- package/node_modules/zod/v4/locales/cs.js +5 -0
- package/node_modules/zod/v4/locales/da.cjs +7 -2
- package/node_modules/zod/v4/locales/da.js +7 -2
- package/node_modules/zod/v4/locales/de.cjs +5 -0
- package/node_modules/zod/v4/locales/de.js +5 -0
- package/node_modules/zod/v4/locales/el.cjs +139 -0
- package/node_modules/zod/v4/locales/el.d.cts +5 -0
- package/node_modules/zod/v4/locales/el.d.ts +4 -0
- package/node_modules/zod/v4/locales/el.js +112 -0
- package/node_modules/zod/v4/locales/en.cjs +20 -4
- package/node_modules/zod/v4/locales/en.js +20 -4
- package/node_modules/zod/v4/locales/eo.cjs +5 -0
- package/node_modules/zod/v4/locales/eo.js +5 -0
- package/node_modules/zod/v4/locales/es.cjs +4 -0
- package/node_modules/zod/v4/locales/es.js +4 -0
- package/node_modules/zod/v4/locales/fa.cjs +5 -0
- package/node_modules/zod/v4/locales/fa.js +5 -0
- package/node_modules/zod/v4/locales/fi.cjs +5 -0
- package/node_modules/zod/v4/locales/fi.js +5 -0
- package/node_modules/zod/v4/locales/fr-CA.cjs +5 -0
- package/node_modules/zod/v4/locales/fr-CA.js +5 -0
- package/node_modules/zod/v4/locales/fr.cjs +38 -17
- package/node_modules/zod/v4/locales/fr.js +38 -17
- package/node_modules/zod/v4/locales/gu.cjs +140 -0
- package/node_modules/zod/v4/locales/gu.d.cts +5 -0
- package/node_modules/zod/v4/locales/gu.d.ts +4 -0
- package/node_modules/zod/v4/locales/gu.js +113 -0
- package/node_modules/zod/v4/locales/he.cjs +7 -0
- package/node_modules/zod/v4/locales/he.js +7 -0
- package/node_modules/zod/v4/locales/hi.cjs +138 -0
- package/node_modules/zod/v4/locales/hi.d.cts +5 -0
- package/node_modules/zod/v4/locales/hi.d.ts +4 -0
- package/node_modules/zod/v4/locales/hi.js +111 -0
- package/node_modules/zod/v4/locales/hr.cjs +153 -0
- package/node_modules/zod/v4/locales/hr.d.cts +5 -0
- package/node_modules/zod/v4/locales/hr.d.ts +4 -0
- package/node_modules/zod/v4/locales/hr.js +126 -0
- package/node_modules/zod/v4/locales/hu.cjs +5 -0
- package/node_modules/zod/v4/locales/hu.js +5 -0
- package/node_modules/zod/v4/locales/hy.cjs +11 -0
- package/node_modules/zod/v4/locales/hy.js +11 -0
- package/node_modules/zod/v4/locales/id.cjs +5 -0
- package/node_modules/zod/v4/locales/id.js +5 -0
- package/node_modules/zod/v4/locales/index.cjs +49 -1
- package/node_modules/zod/v4/locales/index.d.cts +14 -0
- package/node_modules/zod/v4/locales/index.d.ts +14 -0
- package/node_modules/zod/v4/locales/index.js +14 -0
- package/node_modules/zod/v4/locales/is.cjs +5 -0
- package/node_modules/zod/v4/locales/is.js +5 -0
- package/node_modules/zod/v4/locales/it.cjs +6 -1
- package/node_modules/zod/v4/locales/it.js +6 -1
- package/node_modules/zod/v4/locales/ja.cjs +5 -0
- package/node_modules/zod/v4/locales/ja.js +5 -0
- package/node_modules/zod/v4/locales/ka.cjs +13 -8
- package/node_modules/zod/v4/locales/ka.js +13 -8
- package/node_modules/zod/v4/locales/km.cjs +5 -0
- package/node_modules/zod/v4/locales/km.js +5 -0
- package/node_modules/zod/v4/locales/kn.cjs +143 -0
- package/node_modules/zod/v4/locales/kn.d.cts +5 -0
- package/node_modules/zod/v4/locales/kn.d.ts +4 -0
- package/node_modules/zod/v4/locales/kn.js +116 -0
- package/node_modules/zod/v4/locales/ko.cjs +5 -0
- package/node_modules/zod/v4/locales/ko.js +5 -0
- package/node_modules/zod/v4/locales/lt.cjs +4 -0
- package/node_modules/zod/v4/locales/lt.js +4 -0
- package/node_modules/zod/v4/locales/mk.cjs +5 -0
- package/node_modules/zod/v4/locales/mk.js +5 -0
- package/node_modules/zod/v4/locales/ms.cjs +5 -0
- package/node_modules/zod/v4/locales/ms.js +5 -0
- package/node_modules/zod/v4/locales/ne.cjs +138 -0
- package/node_modules/zod/v4/locales/ne.d.cts +5 -0
- package/node_modules/zod/v4/locales/ne.d.ts +4 -0
- package/node_modules/zod/v4/locales/ne.js +111 -0
- package/node_modules/zod/v4/locales/nl.cjs +5 -0
- package/node_modules/zod/v4/locales/nl.js +5 -0
- package/node_modules/zod/v4/locales/nn.cjs +140 -0
- package/node_modules/zod/v4/locales/nn.d.cts +5 -0
- package/node_modules/zod/v4/locales/nn.d.ts +4 -0
- package/node_modules/zod/v4/locales/nn.js +113 -0
- package/node_modules/zod/v4/locales/no.cjs +7 -2
- package/node_modules/zod/v4/locales/no.js +7 -2
- package/node_modules/zod/v4/locales/ota.cjs +5 -0
- package/node_modules/zod/v4/locales/ota.js +5 -0
- package/node_modules/zod/v4/locales/package.json +2 -1
- package/node_modules/zod/v4/locales/pl.cjs +5 -0
- package/node_modules/zod/v4/locales/pl.js +5 -0
- package/node_modules/zod/v4/locales/ps.cjs +5 -0
- package/node_modules/zod/v4/locales/ps.js +5 -0
- package/node_modules/zod/v4/locales/pt-BR.cjs +170 -0
- package/node_modules/zod/v4/locales/pt-BR.d.cts +5 -0
- package/node_modules/zod/v4/locales/pt-BR.d.ts +4 -0
- package/node_modules/zod/v4/locales/pt-BR.js +143 -0
- package/node_modules/zod/v4/locales/pt.cjs +89 -55
- package/node_modules/zod/v4/locales/pt.js +89 -55
- package/node_modules/zod/v4/locales/ro.cjs +149 -0
- package/node_modules/zod/v4/locales/ro.d.cts +5 -0
- package/node_modules/zod/v4/locales/ro.d.ts +4 -0
- package/node_modules/zod/v4/locales/ro.js +122 -0
- package/node_modules/zod/v4/locales/ru.cjs +12 -0
- package/node_modules/zod/v4/locales/ru.js +12 -0
- package/node_modules/zod/v4/locales/sk.cjs +143 -0
- package/node_modules/zod/v4/locales/sk.d.cts +5 -0
- package/node_modules/zod/v4/locales/sk.d.ts +4 -0
- package/node_modules/zod/v4/locales/sk.js +116 -0
- package/node_modules/zod/v4/locales/sl.cjs +5 -0
- package/node_modules/zod/v4/locales/sl.js +5 -0
- package/node_modules/zod/v4/locales/sv.cjs +7 -2
- package/node_modules/zod/v4/locales/sv.js +7 -2
- package/node_modules/zod/v4/locales/ta.cjs +5 -0
- package/node_modules/zod/v4/locales/ta.js +5 -0
- package/node_modules/zod/v4/locales/tg.cjs +144 -0
- package/node_modules/zod/v4/locales/tg.d.cts +5 -0
- package/node_modules/zod/v4/locales/tg.d.ts +4 -0
- package/node_modules/zod/v4/locales/tg.js +117 -0
- package/node_modules/zod/v4/locales/th.cjs +5 -0
- package/node_modules/zod/v4/locales/th.js +5 -0
- package/node_modules/zod/v4/locales/tk.cjs +134 -0
- package/node_modules/zod/v4/locales/tk.d.cts +5 -0
- package/node_modules/zod/v4/locales/tk.d.ts +4 -0
- package/node_modules/zod/v4/locales/tk.js +107 -0
- package/node_modules/zod/v4/locales/tr.cjs +5 -0
- package/node_modules/zod/v4/locales/tr.js +5 -0
- package/node_modules/zod/v4/locales/uk.cjs +5 -0
- package/node_modules/zod/v4/locales/uk.js +5 -0
- package/node_modules/zod/v4/locales/ur.cjs +5 -0
- package/node_modules/zod/v4/locales/ur.js +5 -0
- package/node_modules/zod/v4/locales/uz.cjs +4 -0
- package/node_modules/zod/v4/locales/uz.js +4 -0
- package/node_modules/zod/v4/locales/vi.cjs +5 -0
- package/node_modules/zod/v4/locales/vi.js +5 -0
- package/node_modules/zod/v4/locales/yo.cjs +5 -0
- package/node_modules/zod/v4/locales/yo.js +5 -0
- package/node_modules/zod/v4/locales/zh-CN.cjs +5 -0
- package/node_modules/zod/v4/locales/zh-CN.js +5 -0
- package/node_modules/zod/v4/locales/zh-TW.cjs +5 -0
- package/node_modules/zod/v4/locales/zh-TW.js +5 -0
- package/node_modules/zod/v4/mini/checks.cjs +21 -1
- package/node_modules/zod/v4/mini/checks.d.cts +1 -1
- package/node_modules/zod/v4/mini/checks.d.ts +1 -1
- package/node_modules/zod/v4/mini/checks.js +1 -1
- package/node_modules/zod/v4/mini/coerce.cjs +19 -0
- package/node_modules/zod/v4/mini/deep-partial.cjs +58 -0
- package/node_modules/zod/v4/mini/deep-partial.d.cts +14 -0
- package/node_modules/zod/v4/mini/deep-partial.d.ts +14 -0
- package/node_modules/zod/v4/mini/deep-partial.js +13 -0
- package/node_modules/zod/v4/mini/external.cjs +33 -1
- package/node_modules/zod/v4/mini/external.d.cts +6 -2
- package/node_modules/zod/v4/mini/external.d.ts +6 -2
- package/node_modules/zod/v4/mini/external.js +3 -1
- package/node_modules/zod/v4/mini/in-out.cjs +82 -0
- package/node_modules/zod/v4/mini/in-out.d.cts +8 -0
- package/node_modules/zod/v4/mini/in-out.d.ts +8 -0
- package/node_modules/zod/v4/mini/in-out.js +36 -0
- package/node_modules/zod/v4/mini/index.cjs +19 -0
- package/node_modules/zod/v4/mini/iso.cjs +19 -0
- package/node_modules/zod/v4/mini/package.json +2 -1
- package/node_modules/zod/v4/mini/parse.cjs +22 -1
- package/node_modules/zod/v4/mini/parse.d.cts +1 -1
- package/node_modules/zod/v4/mini/parse.d.ts +1 -1
- package/node_modules/zod/v4/mini/parse.js +1 -1
- package/node_modules/zod/v4/mini/schemas.cjs +151 -50
- package/node_modules/zod/v4/mini/schemas.d.cts +75 -22
- package/node_modules/zod/v4/mini/schemas.d.ts +75 -22
- package/node_modules/zod/v4/mini/schemas.js +125 -48
- package/node_modules/zod/v4/package.json +2 -1
- package/node_modules/zod/v4-mini/index.cjs +19 -0
- package/node_modules/zod/v4-mini/package.json +2 -1
- package/package.json +16 -14
- package/dist/trpc/routers/searchees.d.ts +0 -51
- package/dist/trpc/routers/searchees.js +0 -156
- package/dist/trpc/routers/searchees.js.map +0 -1
- package/dist/webui/assets/ClientOnly-CzZIsGML.js +0 -1
- package/dist/webui/assets/DeleteOption-dxKSbv6N.js +0 -1
- package/dist/webui/assets/FieldInfo-FLjtPgL4.js +0 -1
- package/dist/webui/assets/Page-C7KClZ28.js +0 -1
- package/dist/webui/assets/array-field-DGB7Lbh7.js +0 -1
- package/dist/webui/assets/badge-hukNSIir.js +0 -1
- package/dist/webui/assets/button-1cIaa9Lf.js +0 -1
- package/dist/webui/assets/check-CUrWQ2C7.js +0 -1
- package/dist/webui/assets/chevron-down-CVVogpPh.js +0 -1
- package/dist/webui/assets/clients-CHdgqO4r.js +0 -1
- package/dist/webui/assets/connect-Cr6Q3W8U.js +0 -2
- package/dist/webui/assets/createLucideIcon-zYRS_Hrv.js +0 -1
- package/dist/webui/assets/debug-CEmoQ2W_.js +0 -1
- package/dist/webui/assets/directories-CNuHKfHz.js +0 -1
- package/dist/webui/assets/dist-Bbmh5Du9.js +0 -1
- package/dist/webui/assets/dist-DhH_lYkz.js +0 -1
- package/dist/webui/assets/dist-DzdkRn7I.js +0 -1
- package/dist/webui/assets/dist-b2njvUJz.js +0 -41
- package/dist/webui/assets/dist-d-Lt00zD.js +0 -1
- package/dist/webui/assets/duration-field-CnlQcr37.js +0 -1
- package/dist/webui/assets/form-context-B-ekdUc0.js +0 -1
- package/dist/webui/assets/form-validation-context-CPAPOloL.js +0 -1
- package/dist/webui/assets/general-Cs8dEydJ.js +0 -1
- package/dist/webui/assets/health-DugF7R6A.js +0 -1
- package/dist/webui/assets/index-DhV1H9AB.css +0 -2
- package/dist/webui/assets/index-DinSQfHc.js +0 -11
- package/dist/webui/assets/input-CsfmMUT5.js +0 -1
- package/dist/webui/assets/jobs-Cr1xWWzM.js +0 -1
- package/dist/webui/assets/library-BNsctrbc.js +0 -1
- package/dist/webui/assets/loader-circle-BQbzoYGJ.js +0 -1
- package/dist/webui/assets/logs-C1l3cu_j.js +0 -1
- package/dist/webui/assets/number-field-Ce3QdLSz.js +0 -1
- package/dist/webui/assets/react-dom-mEftaaxx.js +0 -1
- package/dist/webui/assets/required-indicator-BXf2UzTH.js +0 -1
- package/dist/webui/assets/routes-Bw2nXmFg.js +0 -1
- package/dist/webui/assets/search-D9W5vk_0.js +0 -1
- package/dist/webui/assets/select-CZn10WME.js +0 -1
- package/dist/webui/assets/select-field-DozTirAZ.js +0 -1
- package/dist/webui/assets/settings-BXbhXNDK.js +0 -1
- package/dist/webui/assets/sidebar-y9WJu7Jw.js +0 -5
- package/dist/webui/assets/submit-button-CBOzR0f_.js +0 -1
- package/dist/webui/assets/switch-D4S9As9u.js +0 -1
- package/dist/webui/assets/switch-field-2E9ctvy_.js +0 -1
- package/dist/webui/assets/table-B1Y18B60.js +0 -1
- package/dist/webui/assets/text-field-DV4EP-I8.js +0 -1
- package/dist/webui/assets/time-DjUFOA4D.js +0 -1
- package/dist/webui/assets/trackers-ULhLxA6-.js +0 -7
- package/dist/webui/assets/use-settings-form-submit-D87nmJRy.js +0 -79
- package/dist/webui/assets/useBaseQuery-BvrWhgOK.js +0 -1
- package/dist/webui/assets/useRouterState-CZfD5Xdv.js +0 -1
- package/dist/webui/assets/useStore-CusP06SD.js +0 -1
- package/node_modules/zod/src/v4/core/config.ts +0 -15
package/dist/torrent.js
CHANGED
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { distance } from "fastest-levenshtein";
|
|
2
|
-
import bencode from "bencode";
|
|
3
2
|
import { readdir, readFile, stat } from "fs/promises";
|
|
4
3
|
import { extname, join, resolve } from "path";
|
|
5
4
|
import { inspect } from "util";
|
|
5
|
+
import { decode } from "./bencode.js";
|
|
6
6
|
import { getClients, } from "./clients/TorrentClient.js";
|
|
7
7
|
import { isChildPath } from "./utils.js";
|
|
8
8
|
import { ALL_PARENTHESES_REGEX, ALL_SPACES_REGEX, ALL_SQUARE_BRACKETS_REGEX, LEVENSHTEIN_DIVISOR, MAX_PATH_BYTES, MediaType, MIN_VIDEO_QUERY_LENGTH, SAVED_TORRENTS_INFO_REGEX, USER_AGENT, } from "./constants.js";
|
|
9
9
|
import { getDataByFuzzyName, indexDataDirs, shouldIgnorePathHeuristically, } from "./dataFiles.js";
|
|
10
10
|
import { db } from "./db.js";
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
11
|
+
import { createClientLibrarySourceKey, createDataLibrarySourceKey, createTorrentLibraryItemInput, createTorrentLibrarySourceKey, beginLibraryScan, getLibraryScan, failLibraryScan, LibraryItemSource, LibraryScanStatus, markLibraryItemsMissingBySourceKeys, syncLibraryItems, } from "./libraryInventory.js";
|
|
12
|
+
import { Label, logger } from "./logger.js";
|
|
13
|
+
import { Metafile, updateMetafileMetadata, } from "./parseTorrent.js";
|
|
13
14
|
import { isOk, resultOf, resultOfErr } from "./Result.js";
|
|
14
15
|
import { getRuntimeConfig } from "./runtimeConfig.js";
|
|
15
16
|
import { createSearcheeFromDB, createSearcheeFromPath, createSearcheeFromTorrentFile, getAnimeKeys, getEpisodeKeys, getLargestFile, getMovieKeys, getSeasonKeys, } from "./searchee.js";
|
|
16
|
-
import { createKeyTitle, exists, filterAsync, filterAsyncYield, flatMapAsync, getLogString, inBatches,
|
|
17
|
+
import { createKeyTitle, exists, filterAsync, filterAsyncYield, flatMapAsync, getLogString, inBatches, errorMessage, isTruthy, mapAsync, notExists, stripExtension, wait, } from "./utils.js";
|
|
17
18
|
export var SnatchError;
|
|
18
19
|
(function (SnatchError) {
|
|
19
20
|
SnatchError["ABORTED"] = "ABORTED";
|
|
@@ -29,7 +30,7 @@ function isRecoverableTorrentDirError(error) {
|
|
|
29
30
|
return ["ENOENT", "ENOTDIR", "EACCES", "EPERM"].includes(code ?? "");
|
|
30
31
|
}
|
|
31
32
|
function logRecoverableTorrentDirError(torrentDir, error) {
|
|
32
|
-
const message =
|
|
33
|
+
const message = errorMessage(error);
|
|
33
34
|
logger.warn({
|
|
34
35
|
label: Label.INDEX,
|
|
35
36
|
message: `Skipping torrentDir indexing for "${torrentDir}": ${message}`,
|
|
@@ -45,7 +46,7 @@ export async function parseTorrentWithMetadata(filePath, torrentInfos) {
|
|
|
45
46
|
if (clients[0]?.clientType === Label.QBITTORRENT) {
|
|
46
47
|
const fastResumePath = filePath.replace(extname(filePath), ".fastresume");
|
|
47
48
|
if (await exists(fastResumePath)) {
|
|
48
|
-
updateMetafileMetadata(meta,
|
|
49
|
+
updateMetafileMetadata(meta, decode(await readFile(fastResumePath)));
|
|
49
50
|
return meta;
|
|
50
51
|
}
|
|
51
52
|
else {
|
|
@@ -91,14 +92,15 @@ async function snatchOnce(candidate) {
|
|
|
91
92
|
});
|
|
92
93
|
}
|
|
93
94
|
catch (e) {
|
|
94
|
-
|
|
95
|
+
const errName = e instanceof Error ? e.name : "";
|
|
96
|
+
if (errName === "AbortError" || errName === "TimeoutError") {
|
|
95
97
|
logger.debug(`${candidate.name}: ${url}`);
|
|
96
98
|
return {
|
|
97
99
|
snatchError: SnatchError.ABORTED,
|
|
98
100
|
extra: `snatch timed out`,
|
|
99
101
|
};
|
|
100
102
|
}
|
|
101
|
-
else if (isMagnetRedirectError(e)) {
|
|
103
|
+
else if (e instanceof Error && isMagnetRedirectError(e)) {
|
|
102
104
|
logger.debug(`${candidate.name}: ${url}`);
|
|
103
105
|
return { snatchError: SnatchError.MAGNET_LINK };
|
|
104
106
|
}
|
|
@@ -281,7 +283,10 @@ export async function cacheEnsembleTorrentEntry(searchee, torrentSavePaths) {
|
|
|
281
283
|
savePath = torrentSavePaths.get(searchee.infoHash);
|
|
282
284
|
}
|
|
283
285
|
else {
|
|
284
|
-
const
|
|
286
|
+
const client = getClients()[0];
|
|
287
|
+
if (!client)
|
|
288
|
+
return null;
|
|
289
|
+
const downloadDirResult = await client.getDownloadDir(searchee, {
|
|
285
290
|
onlyCompleted: false,
|
|
286
291
|
});
|
|
287
292
|
if (downloadDirResult.isErr()) {
|
|
@@ -302,6 +307,29 @@ export async function cacheEnsembleTorrentEntry(searchee, torrentSavePaths) {
|
|
|
302
307
|
element: ensemblePiece.element,
|
|
303
308
|
}));
|
|
304
309
|
}
|
|
310
|
+
async function scanClientInventory(client, newSearcheesOnly) {
|
|
311
|
+
const scan = await beginLibraryScan({
|
|
312
|
+
source: LibraryItemSource.CLIENT,
|
|
313
|
+
sourceInstance: client.clientHost,
|
|
314
|
+
});
|
|
315
|
+
try {
|
|
316
|
+
const result = await client.getClientSearchees({
|
|
317
|
+
newSearcheesOnly,
|
|
318
|
+
includeFiles: true,
|
|
319
|
+
includeTrackers: true,
|
|
320
|
+
libraryScanId: scan.id,
|
|
321
|
+
});
|
|
322
|
+
if ((await getLibraryScan(scan.id))?.status !==
|
|
323
|
+
LibraryScanStatus.SUCCEEDED) {
|
|
324
|
+
throw new Error("Client did not complete its inventory refresh; preserving previous inventory");
|
|
325
|
+
}
|
|
326
|
+
return result;
|
|
327
|
+
}
|
|
328
|
+
catch (error) {
|
|
329
|
+
await failLibraryScan(scan.id, error);
|
|
330
|
+
throw error;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
305
333
|
async function indexTorrents(options) {
|
|
306
334
|
const { seasonFromEpisodes, torrentDir, useClientTorrents } = getRuntimeConfig();
|
|
307
335
|
if (!useClientTorrents && !torrentDir)
|
|
@@ -316,7 +344,7 @@ async function indexTorrents(options) {
|
|
|
316
344
|
message: "Indexing torrentDir for reverse lookup...",
|
|
317
345
|
});
|
|
318
346
|
try {
|
|
319
|
-
searchees = await
|
|
347
|
+
searchees = await loadTorrentDirIncremental(torrentDir);
|
|
320
348
|
}
|
|
321
349
|
catch (error) {
|
|
322
350
|
if (!isRecoverableTorrentDirError(error))
|
|
@@ -324,29 +352,35 @@ async function indexTorrents(options) {
|
|
|
324
352
|
logRecoverableTorrentDirError(torrentDir, error);
|
|
325
353
|
searchees = [];
|
|
326
354
|
}
|
|
327
|
-
if (clients.length) {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
355
|
+
if (clients.length && seasonFromEpisodes) {
|
|
356
|
+
try {
|
|
357
|
+
infoHashPathMap = await clients[0].getAllDownloadDirs({
|
|
358
|
+
metas: searchees,
|
|
359
|
+
onlyCompleted: false,
|
|
360
|
+
v1HashOnly: true,
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
catch (error) {
|
|
364
|
+
infoHashPathMap = new Map();
|
|
365
|
+
logger.warn({
|
|
366
|
+
label: Label.INDEX,
|
|
367
|
+
message: `Skipping client-dependent episode grouping: ${errorMessage(error)}`,
|
|
368
|
+
});
|
|
369
|
+
}
|
|
333
370
|
}
|
|
334
371
|
}
|
|
335
372
|
else {
|
|
336
373
|
logger.info("Indexing client torrents for reverse lookup...");
|
|
337
374
|
searchees = await flatMapAsync(clients, async (client) => {
|
|
338
375
|
try {
|
|
339
|
-
const { searchees } = await client
|
|
340
|
-
includeFiles: true,
|
|
341
|
-
includeTrackers: true,
|
|
342
|
-
});
|
|
376
|
+
const { searchees } = await scanClientInventory(client, false);
|
|
343
377
|
return searchees;
|
|
344
378
|
}
|
|
345
379
|
catch (e) {
|
|
346
380
|
const message = e instanceof Error ? e.message : String(e ?? "");
|
|
347
381
|
logger.warn({
|
|
348
382
|
label: client.label,
|
|
349
|
-
message: `Indexing client torrents failed;
|
|
383
|
+
message: `Indexing client torrents failed; keeping previous inventory until next retry: ${message}`,
|
|
350
384
|
});
|
|
351
385
|
logger.debug(e);
|
|
352
386
|
return [];
|
|
@@ -369,17 +403,14 @@ async function indexTorrents(options) {
|
|
|
369
403
|
else {
|
|
370
404
|
searchees = await flatMapAsync(clients, async (client) => {
|
|
371
405
|
try {
|
|
372
|
-
return (await client
|
|
373
|
-
|
|
374
|
-
includeFiles: true,
|
|
375
|
-
includeTrackers: true,
|
|
376
|
-
})).newSearchees;
|
|
406
|
+
return (await scanClientInventory(client, true))
|
|
407
|
+
.newSearchees;
|
|
377
408
|
}
|
|
378
409
|
catch (e) {
|
|
379
410
|
const message = e instanceof Error ? e.message : String(e ?? "");
|
|
380
411
|
logger.warn({
|
|
381
412
|
label: client.label,
|
|
382
|
-
message: `Indexing client torrents failed;
|
|
413
|
+
message: `Indexing client torrents failed; keeping previous inventory until next retry: ${message}`,
|
|
383
414
|
});
|
|
384
415
|
logger.debug(e);
|
|
385
416
|
return [];
|
|
@@ -398,65 +429,80 @@ async function indexTorrents(options) {
|
|
|
398
429
|
});
|
|
399
430
|
}
|
|
400
431
|
async function indexTorrentDir(dir) {
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
await db("torrent")
|
|
425
|
-
.insert({
|
|
426
|
-
file_path: filePath,
|
|
427
|
-
info_hash: meta.infoHash,
|
|
428
|
-
name: meta.name,
|
|
429
|
-
})
|
|
430
|
-
.onConflict("file_path")
|
|
431
|
-
.ignore();
|
|
432
|
-
const res = await createSearcheeFromTorrentFile(filePath, []);
|
|
433
|
-
if (res.isOk())
|
|
434
|
-
newSearchees.push(res.unwrap());
|
|
435
|
-
}
|
|
436
|
-
const rows = await db("torrent").select("file_path", "info_hash");
|
|
437
|
-
const toDelete = rows.filter((row) => !dirContents.has(row.file_path));
|
|
438
|
-
await inBatches(toDelete, async (batch) => {
|
|
439
|
-
await db("torrent")
|
|
440
|
-
.whereIn("file_path", batch.map((row) => row.file_path))
|
|
441
|
-
.del();
|
|
442
|
-
await db("ensemble")
|
|
443
|
-
.whereIn("info_hash", batch.map((row) => row.info_hash))
|
|
444
|
-
.del();
|
|
432
|
+
return loadTorrentDirIncremental(dir, { includeUnchanged: false });
|
|
433
|
+
}
|
|
434
|
+
let activeIndexing;
|
|
435
|
+
let startupIndexingRequested = false;
|
|
436
|
+
export function indexTorrentsAndDataDirs(options = { startup: false }) {
|
|
437
|
+
startupIndexingRequested ||= options.startup;
|
|
438
|
+
if (activeIndexing)
|
|
439
|
+
return activeIndexing;
|
|
440
|
+
activeIndexing = (async () => {
|
|
441
|
+
do {
|
|
442
|
+
const startup = startupIndexingRequested;
|
|
443
|
+
startupIndexingRequested = false;
|
|
444
|
+
try {
|
|
445
|
+
await runIndexing({ startup });
|
|
446
|
+
}
|
|
447
|
+
catch (error) {
|
|
448
|
+
// A settings update queued during a failed scan still gets a turn.
|
|
449
|
+
if (!startupIndexingRequested)
|
|
450
|
+
throw error;
|
|
451
|
+
}
|
|
452
|
+
} while (startupIndexingRequested);
|
|
453
|
+
})().finally(() => {
|
|
454
|
+
activeIndexing = undefined;
|
|
445
455
|
});
|
|
446
|
-
return
|
|
456
|
+
return activeIndexing;
|
|
447
457
|
}
|
|
448
|
-
|
|
458
|
+
async function runIndexing(options) {
|
|
449
459
|
if (options.startup) {
|
|
450
460
|
const { dataDirs, seasonFromEpisodes, torrentDir, useClientTorrents } = getRuntimeConfig();
|
|
461
|
+
const configuredSources = new Map([
|
|
462
|
+
[LibraryItemSource.DATA, new Set(dataDirs)],
|
|
463
|
+
[
|
|
464
|
+
LibraryItemSource.TORRENT,
|
|
465
|
+
new Set(torrentDir ? [torrentDir] : []),
|
|
466
|
+
],
|
|
467
|
+
[
|
|
468
|
+
LibraryItemSource.CLIENT,
|
|
469
|
+
new Set(useClientTorrents
|
|
470
|
+
? getClients().map((client) => client.clientHost)
|
|
471
|
+
: []),
|
|
472
|
+
],
|
|
473
|
+
]);
|
|
474
|
+
const activeItems = await db("library_item")
|
|
475
|
+
.whereNull("missing_since")
|
|
476
|
+
.select("source", "source_instance", "source_key", "info_hash");
|
|
477
|
+
const removedItems = activeItems.filter((item) => !configuredSources
|
|
478
|
+
.get(item.source)
|
|
479
|
+
?.has(item.source_instance ?? ""));
|
|
480
|
+
const removedTorrentHashes = removedItems.filter((item) => item.source ===
|
|
481
|
+
LibraryItemSource.TORRENT);
|
|
482
|
+
await inBatches(removedTorrentHashes.map((item) => item.info_hash).filter(isTruthy), async (hashes) => {
|
|
483
|
+
await db("ensemble")
|
|
484
|
+
.whereNull("client_host")
|
|
485
|
+
.whereIn("info_hash", hashes)
|
|
486
|
+
.del();
|
|
487
|
+
});
|
|
488
|
+
await markLibraryItemsMissingBySourceKeys(removedItems.map((item) => item.source_key));
|
|
451
489
|
if (!useClientTorrents) {
|
|
452
|
-
const
|
|
490
|
+
const clientRows = await db("client_searchee").select("client_host", "info_hash");
|
|
491
|
+
const hashes = clientRows.map((r) => r.info_hash);
|
|
453
492
|
await inBatches(hashes, async (batch) => {
|
|
454
493
|
await db("ensemble").whereIn("info_hash", batch).del();
|
|
455
494
|
});
|
|
495
|
+
await markLibraryItemsMissingBySourceKeys(clientRows.map((row) => createClientLibrarySourceKey({
|
|
496
|
+
clientHost: row.client_host,
|
|
497
|
+
infoHash: row.info_hash,
|
|
498
|
+
})));
|
|
456
499
|
await db("client_searchee").del();
|
|
457
500
|
}
|
|
458
501
|
else {
|
|
459
502
|
const clientHosts = getClients().map((client) => client.clientHost);
|
|
503
|
+
const clientRowsToDelete = await db("client_searchee")
|
|
504
|
+
.select("client_host", "info_hash")
|
|
505
|
+
.whereNotIn("client_host", clientHosts);
|
|
460
506
|
await db("client_searchee")
|
|
461
507
|
.whereNotIn("client_host", clientHosts)
|
|
462
508
|
.del();
|
|
@@ -464,13 +510,18 @@ export async function indexTorrentsAndDataDirs(options = { startup: false }) {
|
|
|
464
510
|
.whereNotNull("client_host")
|
|
465
511
|
.whereNotIn("client_host", clientHosts)
|
|
466
512
|
.del();
|
|
513
|
+
await markLibraryItemsMissingBySourceKeys(clientRowsToDelete.map((row) => createClientLibrarySourceKey({
|
|
514
|
+
clientHost: row.client_host,
|
|
515
|
+
infoHash: row.info_hash,
|
|
516
|
+
})));
|
|
467
517
|
}
|
|
468
518
|
if (!torrentDir) {
|
|
469
|
-
const
|
|
519
|
+
const torrentRows = await getTorrentLibraryEntries();
|
|
520
|
+
const hashes = torrentRows.map((r) => r.info_hash).filter(isTruthy);
|
|
470
521
|
await inBatches(hashes, async (batch) => {
|
|
471
522
|
await db("ensemble").whereIn("info_hash", batch).del();
|
|
472
523
|
});
|
|
473
|
-
await
|
|
524
|
+
await markLibraryItemsMissingBySourceKeys(torrentRows.map((row) => createTorrentLibrarySourceKey(row.file_path)));
|
|
474
525
|
}
|
|
475
526
|
if (!dataDirs.length) {
|
|
476
527
|
const paths = (await db("data").select("path")).map((r) => r.path);
|
|
@@ -479,6 +530,7 @@ export async function indexTorrentsAndDataDirs(options = { startup: false }) {
|
|
|
479
530
|
.whereIn("path", batch)
|
|
480
531
|
.whereNull("client_host")
|
|
481
532
|
.del();
|
|
533
|
+
await markLibraryItemsMissingBySourceKeys(batch.map(createDataLibrarySourceKey));
|
|
482
534
|
});
|
|
483
535
|
await db("data").del();
|
|
484
536
|
}
|
|
@@ -491,41 +543,44 @@ export async function indexTorrentsAndDataDirs(options = { startup: false }) {
|
|
|
491
543
|
.whereIn("path", batch)
|
|
492
544
|
.whereNull("client_host")
|
|
493
545
|
.del();
|
|
546
|
+
await markLibraryItemsMissingBySourceKeys(batch.map(createDataLibrarySourceKey));
|
|
494
547
|
});
|
|
495
548
|
}
|
|
496
549
|
if (!seasonFromEpisodes)
|
|
497
550
|
await db("ensemble").del();
|
|
498
551
|
}
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
552
|
+
const maxRetries = 3;
|
|
553
|
+
for (let attempt = 1; attempt <= maxRetries; attempt++) {
|
|
554
|
+
try {
|
|
555
|
+
await indexDataDirs(options); // Running together may increase failures
|
|
556
|
+
await indexTorrents(options); // Run second so this data is more fresh
|
|
557
|
+
break;
|
|
558
|
+
}
|
|
559
|
+
catch (e) {
|
|
560
|
+
const log = {
|
|
561
|
+
label: Label.INDEX,
|
|
562
|
+
message: `Indexing failed (${maxRetries - attempt}): ${errorMessage(e)}`,
|
|
563
|
+
};
|
|
564
|
+
logger.debug(e);
|
|
565
|
+
if (attempt < maxRetries) {
|
|
566
|
+
logger.verbose(log);
|
|
506
567
|
}
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
};
|
|
512
|
-
logger.debug(e);
|
|
513
|
-
if (attempt < maxRetries) {
|
|
514
|
-
logger.verbose(log);
|
|
515
|
-
}
|
|
516
|
-
else {
|
|
517
|
-
logger.error(log);
|
|
518
|
-
if (options.startup)
|
|
519
|
-
throw e;
|
|
520
|
-
}
|
|
568
|
+
else {
|
|
569
|
+
logger.error(log);
|
|
570
|
+
if (options.startup)
|
|
571
|
+
throw e;
|
|
521
572
|
}
|
|
522
573
|
}
|
|
523
|
-
}
|
|
574
|
+
}
|
|
524
575
|
}
|
|
525
576
|
export async function getInfoHashesToExclude() {
|
|
526
577
|
const { useClientTorrents } = getRuntimeConfig();
|
|
527
|
-
|
|
528
|
-
|
|
578
|
+
if (!useClientTorrents) {
|
|
579
|
+
return new Set((await getTorrentLibraryEntries())
|
|
580
|
+
.map((e) => e.info_hash)
|
|
581
|
+
.filter(isTruthy));
|
|
582
|
+
}
|
|
583
|
+
return new Set((await db("client_searchee").select("info_hash")).map((e) => e.info_hash));
|
|
529
584
|
}
|
|
530
585
|
export async function loadTorrentDirLight(torrentDir) {
|
|
531
586
|
const torrentFilePaths = await findAllTorrentFilesInDir(torrentDir);
|
|
@@ -537,11 +592,135 @@ export async function loadTorrentDirLight(torrentDir) {
|
|
|
537
592
|
for (const torrentFilePath of torrentFilePaths) {
|
|
538
593
|
const searcheeResult = await createSearcheeFromTorrentFile(torrentFilePath, torrentInfos);
|
|
539
594
|
if (searcheeResult.isOk()) {
|
|
540
|
-
searchees.push(
|
|
595
|
+
searchees.push({
|
|
596
|
+
...searcheeResult.unwrap(),
|
|
597
|
+
path: torrentFilePath,
|
|
598
|
+
});
|
|
541
599
|
}
|
|
542
600
|
}
|
|
543
601
|
return searchees;
|
|
544
602
|
}
|
|
603
|
+
function createTorrentFileFingerprint(filePath, stats) {
|
|
604
|
+
return JSON.stringify({
|
|
605
|
+
path: filePath,
|
|
606
|
+
size: stats.size,
|
|
607
|
+
mtimeMs: stats.mtimeMs,
|
|
608
|
+
});
|
|
609
|
+
}
|
|
610
|
+
function createSearcheeFromTorrentLibraryItem(row) {
|
|
611
|
+
if (!row.info_hash || !row.path)
|
|
612
|
+
return null;
|
|
613
|
+
return {
|
|
614
|
+
infoHash: row.info_hash,
|
|
615
|
+
path: row.path,
|
|
616
|
+
name: row.name,
|
|
617
|
+
title: row.title,
|
|
618
|
+
files: JSON.parse(row.files),
|
|
619
|
+
length: row.length,
|
|
620
|
+
category: row.category ?? undefined,
|
|
621
|
+
tags: row.tags ? JSON.parse(row.tags) : undefined,
|
|
622
|
+
trackers: row.trackers
|
|
623
|
+
? JSON.parse(row.trackers)
|
|
624
|
+
: undefined,
|
|
625
|
+
};
|
|
626
|
+
}
|
|
627
|
+
async function getTorrentLibraryEntries() {
|
|
628
|
+
const rows = await db("library_item")
|
|
629
|
+
.where({
|
|
630
|
+
source: LibraryItemSource.TORRENT,
|
|
631
|
+
missing_since: null,
|
|
632
|
+
})
|
|
633
|
+
.whereNotNull("path")
|
|
634
|
+
.select("title", "name", "path", "info_hash");
|
|
635
|
+
return rows
|
|
636
|
+
.filter((row) => row.path !== null)
|
|
637
|
+
.map((row) => ({
|
|
638
|
+
title: row.title,
|
|
639
|
+
name: row.name,
|
|
640
|
+
file_path: row.path,
|
|
641
|
+
info_hash: row.info_hash,
|
|
642
|
+
}));
|
|
643
|
+
}
|
|
644
|
+
async function loadTorrentDirIncremental(torrentDir, options = { includeUnchanged: true }) {
|
|
645
|
+
const scan = await beginLibraryScan({
|
|
646
|
+
source: LibraryItemSource.TORRENT,
|
|
647
|
+
sourceInstance: torrentDir,
|
|
648
|
+
});
|
|
649
|
+
try {
|
|
650
|
+
const torrentFilePaths = await findAllTorrentFilesInDir(torrentDir);
|
|
651
|
+
const sourceKeys = torrentFilePaths.map(createTorrentLibrarySourceKey);
|
|
652
|
+
const existingRows = await db("library_item")
|
|
653
|
+
.where({
|
|
654
|
+
source: LibraryItemSource.TORRENT,
|
|
655
|
+
source_instance: torrentDir,
|
|
656
|
+
})
|
|
657
|
+
.whereIn("source_key", sourceKeys)
|
|
658
|
+
.select("source_key", "info_hash", "path", "name", "title", "files", "length", "category", "tags", "trackers", "content_fingerprint", "missing_since");
|
|
659
|
+
const existingBySourceKey = new Map(existingRows.map((row) => [row.source_key, row]));
|
|
660
|
+
const searchees = [];
|
|
661
|
+
const sourceKeysSeen = [];
|
|
662
|
+
const pathsToParse = [];
|
|
663
|
+
for (const filePath of torrentFilePaths) {
|
|
664
|
+
const fingerprint = createTorrentFileFingerprint(filePath, await stat(filePath));
|
|
665
|
+
const sourceKey = createTorrentLibrarySourceKey(filePath);
|
|
666
|
+
const existing = existingBySourceKey.get(sourceKey);
|
|
667
|
+
if (existing &&
|
|
668
|
+
existing.missing_since === null &&
|
|
669
|
+
existing.content_fingerprint === fingerprint) {
|
|
670
|
+
const searchee = createSearcheeFromTorrentLibraryItem(existing);
|
|
671
|
+
if (searchee) {
|
|
672
|
+
if (options.includeUnchanged)
|
|
673
|
+
searchees.push(searchee);
|
|
674
|
+
sourceKeysSeen.push(sourceKey);
|
|
675
|
+
continue;
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
pathsToParse.push({ filePath, fingerprint });
|
|
679
|
+
}
|
|
680
|
+
const client = getClients()[0];
|
|
681
|
+
let torrentInfos = [];
|
|
682
|
+
if (pathsToParse.length &&
|
|
683
|
+
client &&
|
|
684
|
+
client.clientType !== Label.QBITTORRENT) {
|
|
685
|
+
try {
|
|
686
|
+
torrentInfos = await client.getAllTorrents();
|
|
687
|
+
}
|
|
688
|
+
catch (error) {
|
|
689
|
+
logger.warn({
|
|
690
|
+
label: Label.INDEX,
|
|
691
|
+
message: `Client metadata unavailable; indexing torrent files without it: ${errorMessage(error)}`,
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
const itemsToUpsert = [];
|
|
696
|
+
for (const { filePath, fingerprint } of pathsToParse) {
|
|
697
|
+
const searcheeResult = await createSearcheeFromTorrentFile(filePath, torrentInfos);
|
|
698
|
+
if (searcheeResult.isOk()) {
|
|
699
|
+
const searchee = {
|
|
700
|
+
...searcheeResult.unwrap(),
|
|
701
|
+
path: filePath,
|
|
702
|
+
};
|
|
703
|
+
searchees.push(searchee);
|
|
704
|
+
itemsToUpsert.push(createTorrentLibraryItemInput(searchee, filePath, torrentDir, {
|
|
705
|
+
contentFingerprint: fingerprint,
|
|
706
|
+
}));
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
await syncLibraryItems({
|
|
710
|
+
scanId: scan.id,
|
|
711
|
+
source: LibraryItemSource.TORRENT,
|
|
712
|
+
sourceInstance: torrentDir,
|
|
713
|
+
itemsToUpsert,
|
|
714
|
+
sourceKeysSeen,
|
|
715
|
+
pruneMissing: true,
|
|
716
|
+
});
|
|
717
|
+
return searchees;
|
|
718
|
+
}
|
|
719
|
+
catch (error) {
|
|
720
|
+
await failLibraryScan(scan.id, error);
|
|
721
|
+
throw error;
|
|
722
|
+
}
|
|
723
|
+
}
|
|
545
724
|
function getKeysFromName(stem) {
|
|
546
725
|
const episodeKeys = getEpisodeKeys(stem);
|
|
547
726
|
if (episodeKeys) {
|
|
@@ -591,24 +770,24 @@ export async function getSimilarByName(name) {
|
|
|
591
770
|
}
|
|
592
771
|
const candidateMaxDistance = Math.floor(Math.min(...keyTitles.map((t) => t.length)) / LEVENSHTEIN_DIVISOR);
|
|
593
772
|
const filterEntries = async (dbEntries) => {
|
|
594
|
-
return filterAsyncYield(dbEntries,
|
|
773
|
+
return filterAsyncYield(dbEntries, (dbEntry) => {
|
|
595
774
|
const entry = getKeysFromName(dbEntry.title ?? dbEntry.name);
|
|
596
775
|
if (entry.element !== element)
|
|
597
|
-
return false;
|
|
776
|
+
return Promise.resolve(false);
|
|
598
777
|
if (!entry.keyTitles.length)
|
|
599
|
-
return false;
|
|
778
|
+
return Promise.resolve(false);
|
|
600
779
|
const maxDistance = Math.min(candidateMaxDistance, Math.floor(Math.min(...entry.keyTitles.map((t) => t.length)) /
|
|
601
780
|
LEVENSHTEIN_DIVISOR));
|
|
602
|
-
return entry.keyTitles.some((dbKeyTitle) => {
|
|
781
|
+
return Promise.resolve(entry.keyTitles.some((dbKeyTitle) => {
|
|
603
782
|
return keyTitles.some((keyTitle) => distance(keyTitle, dbKeyTitle) <= maxDistance);
|
|
604
|
-
});
|
|
783
|
+
}));
|
|
605
784
|
});
|
|
606
785
|
};
|
|
607
786
|
if (useClientTorrents) {
|
|
608
787
|
clientSearchees.push(...(await filterEntries(await db("client_searchee"))).map(createSearcheeFromDB));
|
|
609
788
|
}
|
|
610
789
|
else if (torrentDir) {
|
|
611
|
-
const filteredTorrentEntries = (await filterEntries(await
|
|
790
|
+
const filteredTorrentEntries = (await filterEntries(await getTorrentLibraryEntries()));
|
|
612
791
|
if (filteredTorrentEntries.length) {
|
|
613
792
|
const client = getClients()[0];
|
|
614
793
|
const torrentInfos = client && client.clientType !== Label.QBITTORRENT
|
|
@@ -646,23 +825,23 @@ async function getTorrentByFuzzyName(stem) {
|
|
|
646
825
|
const { useClientTorrents } = getRuntimeConfig();
|
|
647
826
|
const database = useClientTorrents
|
|
648
827
|
? await db("client_searchee")
|
|
649
|
-
: await
|
|
828
|
+
: await getTorrentLibraryEntries();
|
|
650
829
|
const fullMatch = createKeyTitle(stem);
|
|
651
830
|
// Attempt to filter torrents in DB to match incoming data before fuzzy check
|
|
652
831
|
let filteredNames = [];
|
|
653
832
|
if (fullMatch) {
|
|
654
|
-
filteredNames = await filterAsyncYield(database,
|
|
833
|
+
filteredNames = await filterAsyncYield(database, (dbEntry) => {
|
|
655
834
|
const dbMatch = createKeyTitle(stripExtension(dbEntry.title ?? dbEntry.name));
|
|
656
|
-
return fullMatch === dbMatch;
|
|
835
|
+
return Promise.resolve(fullMatch === dbMatch);
|
|
657
836
|
});
|
|
658
837
|
}
|
|
659
838
|
// If none match, proceed with fuzzy name check on all names.
|
|
660
839
|
filteredNames = filteredNames.length > 0 ? filteredNames : database;
|
|
661
840
|
const candidateMaxDistance = Math.floor(stem.length / LEVENSHTEIN_DIVISOR);
|
|
662
|
-
const potentialMatches = await filterAsyncYield(filteredNames,
|
|
841
|
+
const potentialMatches = await filterAsyncYield(filteredNames, (dbEntry) => {
|
|
663
842
|
const dbTitle = stripExtension(dbEntry.title ?? dbEntry.name);
|
|
664
843
|
const maxDistance = Math.min(candidateMaxDistance, Math.floor(dbTitle.length / LEVENSHTEIN_DIVISOR));
|
|
665
|
-
return distance(stem, dbTitle) <= maxDistance;
|
|
844
|
+
return Promise.resolve(distance(stem, dbTitle) <= maxDistance);
|
|
666
845
|
});
|
|
667
846
|
if (useClientTorrents)
|
|
668
847
|
return potentialMatches.map(createSearcheeFromDB);
|
|
@@ -676,8 +855,11 @@ async function getTorrentByFuzzyName(stem) {
|
|
|
676
855
|
}
|
|
677
856
|
export async function getTorrentByCriteria(criteria) {
|
|
678
857
|
const { useClientTorrents } = getRuntimeConfig();
|
|
679
|
-
const
|
|
680
|
-
|
|
858
|
+
const dbTorrents = useClientTorrents
|
|
859
|
+
? await db("client_searchee").where({
|
|
860
|
+
info_hash: criteria.infoHash,
|
|
861
|
+
})
|
|
862
|
+
: (await getTorrentLibraryEntries()).filter((entry) => entry.info_hash === criteria.infoHash);
|
|
681
863
|
if (!dbTorrents.length) {
|
|
682
864
|
const message = `Torrent client does not have any torrent with criteria ${inspect(criteria)}`;
|
|
683
865
|
throw new Error(message);
|
|
@@ -688,8 +870,13 @@ export async function getTorrentByCriteria(criteria) {
|
|
|
688
870
|
const torrentInfos = client && client.clientType !== Label.QBITTORRENT
|
|
689
871
|
? await client.getAllTorrents()
|
|
690
872
|
: [];
|
|
873
|
+
const torrentRow = dbTorrents[0];
|
|
874
|
+
const searchee = (await createSearcheeFromTorrentFile(torrentRow.file_path, torrentInfos)).unwrapOrThrow(new Error(`Failed to create searchee from ${torrentRow.file_path}`));
|
|
691
875
|
return [
|
|
692
|
-
|
|
876
|
+
{
|
|
877
|
+
...searchee,
|
|
878
|
+
path: torrentRow.file_path,
|
|
879
|
+
},
|
|
693
880
|
];
|
|
694
881
|
}
|
|
695
882
|
//# sourceMappingURL=torrent.js.map
|