cross-seed 6.0.0-17 → 6.0.0-19
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 +11 -4
- package/dist/action.js.map +1 -1
- package/dist/arr.js +3 -3
- package/dist/arr.js.map +1 -1
- package/dist/clients/Deluge.js +14 -16
- package/dist/clients/Deluge.js.map +1 -1
- package/dist/clients/QBittorrent.js +7 -6
- package/dist/clients/QBittorrent.js.map +1 -1
- package/dist/clients/RTorrent.js +6 -6
- package/dist/clients/RTorrent.js.map +1 -1
- package/dist/clients/TorrentClient.js.map +1 -1
- package/dist/clients/Transmission.js +6 -6
- package/dist/clients/Transmission.js.map +1 -1
- package/dist/cmd.js +0 -2
- package/dist/cmd.js.map +1 -1
- package/dist/config.template.cjs +27 -35
- package/dist/config.template.cjs.map +1 -1
- package/dist/configSchema.js +0 -1
- package/dist/configSchema.js.map +1 -1
- package/dist/configuration.js.map +1 -1
- package/dist/constants.js +32 -3
- package/dist/constants.js.map +1 -1
- package/dist/dataFiles.js +4 -5
- package/dist/dataFiles.js.map +1 -1
- package/dist/pipeline.js +133 -56
- package/dist/pipeline.js.map +1 -1
- package/dist/preFilter.js +79 -36
- package/dist/preFilter.js.map +1 -1
- package/dist/pushNotifier.js.map +1 -1
- package/dist/runtimeConfig.js.map +1 -1
- package/dist/searchee.js +129 -7
- package/dist/searchee.js.map +1 -1
- package/dist/torrent.js +61 -11
- package/dist/torrent.js.map +1 -1
- package/dist/torznab.js +53 -15
- package/dist/torznab.js.map +1 -1
- package/dist/utils.js +17 -14
- package/dist/utils.js.map +1 -1
- package/package.json +2 -1
package/dist/config.template.cjs
CHANGED
@@ -44,12 +44,12 @@ module.exports = {
|
|
44
44
|
sonarr: undefined,
|
45
45
|
/**
|
46
46
|
* URL(s) to your Radarr instance(s), included in the same way as torznab
|
47
|
-
* URLs but for your
|
47
|
+
* URLs but for your Radarr: note that api is not at the end. see below.
|
48
48
|
*
|
49
49
|
* You should order these in most likely to match -> least likely order.
|
50
50
|
* They are searched sequentially as they are listed.
|
51
51
|
*
|
52
|
-
* This apikey parameter comes from
|
52
|
+
* This apikey parameter comes from Radarr
|
53
53
|
*
|
54
54
|
* Example: radarr: ["http://radarr:7878/?apikey=12345"],
|
55
55
|
*
|
@@ -119,8 +119,9 @@ module.exports = {
|
|
119
119
|
* to your downloaded torrent data to find matches, rather than relying
|
120
120
|
* entirely on the .torrent files themselves for matching.
|
121
121
|
*
|
122
|
-
* If directories are entered, they must all be
|
122
|
+
* If directories are entered, they must all be in a single option and they
|
123
123
|
* need to be surrounded by brackets.
|
124
|
+
*
|
124
125
|
* Windows users will need to use double backslash in all paths in this
|
125
126
|
* config.
|
126
127
|
*
|
@@ -132,12 +133,11 @@ module.exports = {
|
|
132
133
|
dataDirs: [],
|
133
134
|
/**
|
134
135
|
* Defines what qBittorrent or Deluge category to set on linked torrents
|
135
|
-
* Default is "cross-seed-link".
|
136
136
|
*
|
137
137
|
* qBittorrent: If you have linking enabled, all torrents will be injected
|
138
138
|
* to this category.
|
139
139
|
*
|
140
|
-
* Default is "cross-seed-
|
140
|
+
* Default is "cross-seed-link".
|
141
141
|
*/
|
142
142
|
linkCategory: "cross-seed-link",
|
143
143
|
/**
|
@@ -195,7 +195,7 @@ module.exports = {
|
|
195
195
|
* searchees. Setting this to higher values will result in more searchees
|
196
196
|
* and more API hits to your indexers.
|
197
197
|
*/
|
198
|
-
maxDataDepth:
|
198
|
+
maxDataDepth: 2,
|
199
199
|
/**
|
200
200
|
* Directory containing .torrent files.
|
201
201
|
* For qBittorrent, this is BT_Backup.
|
@@ -214,47 +214,39 @@ module.exports = {
|
|
214
214
|
*/
|
215
215
|
outputDir: ".",
|
216
216
|
/**
|
217
|
-
* Whether to
|
218
|
-
* packs.
|
219
|
-
* This option overrides includeSingleEpisodes when set to true.
|
220
|
-
*/
|
221
|
-
includeEpisodes: false,
|
222
|
-
/**
|
223
|
-
* Whether to include single episode torrents in the search (not those from
|
217
|
+
* Whether to include single episode torrents in a search (not those from
|
224
218
|
* season packs).
|
225
|
-
*
|
219
|
+
*
|
220
|
+
* This setting does not affect matching episodes from rss and
|
221
|
+
* announce.
|
226
222
|
*/
|
227
223
|
includeSingleEpisodes: false,
|
228
224
|
/**
|
229
|
-
* Include torrents which
|
230
|
-
* This option does not override includeEpisodes or includeSingleEpisodes.
|
225
|
+
* Include torrents which are comprised of non-video files.
|
231
226
|
*
|
232
|
-
* If this option is set to false, any folders or torrents
|
233
|
-
*
|
227
|
+
* If this option is set to false, any folders or torrents whose
|
228
|
+
* totalNonVideoFilesSize / totalSize > fuzzySizeThreshold
|
229
|
+
* will be excluded.
|
234
230
|
*
|
235
|
-
* For example, if you have .srt or .nfo files inside
|
236
|
-
*
|
231
|
+
* For example, if you have .srt or .nfo files inside a torrent, using
|
232
|
+
* false will still allow the torrent to be considered for cross-seeding
|
233
|
+
* while disallowing torrents that are music, games, books, etc.
|
237
234
|
* For full disc based folders (not .ISO) you may wish to set this as true.
|
238
|
-
* You may also want to set this as false to exclude things like music,
|
239
|
-
* games, or books.
|
240
235
|
*
|
241
|
-
* To search for
|
236
|
+
* To search for all video media except individual episodes, use:
|
242
237
|
*
|
243
|
-
* includeEpisodes: false
|
244
238
|
* includeSingleEpisodes: false
|
245
|
-
* includeNonVideos:
|
246
|
-
*
|
247
|
-
* To search for everything including episodes, use:
|
239
|
+
* includeNonVideos: false
|
248
240
|
*
|
249
|
-
*
|
250
|
-
* includeNonVideos: true
|
241
|
+
* To search for all video media including individual episodes, use:
|
251
242
|
*
|
252
|
-
* To search for everything except season pack episodes (data-based) use:
|
253
|
-
*
|
254
|
-
* includeEpisodes: false
|
255
243
|
* includeSingleEpisodes: true
|
256
|
-
* includeNonVideos:
|
244
|
+
* includeNonVideos: false
|
245
|
+
*
|
246
|
+
* To search for absolutely ALL types of content, including non-video, configure
|
247
|
+
* your episode settings based on the above examples and use:
|
257
248
|
*
|
249
|
+
* includeNonVideos: true
|
258
250
|
*/
|
259
251
|
includeNonVideos: false,
|
260
252
|
/**
|
@@ -325,7 +317,7 @@ module.exports = {
|
|
325
317
|
* "30 seconds"
|
326
318
|
* null
|
327
319
|
*/
|
328
|
-
snatchTimeout:
|
320
|
+
snatchTimeout: "30 seconds",
|
329
321
|
/**
|
330
322
|
* Fail search requests that haven't responded after this long.
|
331
323
|
* Set to null for an infinite timeout.
|
@@ -333,7 +325,7 @@ module.exports = {
|
|
333
325
|
* "30 seconds"
|
334
326
|
* null
|
335
327
|
*/
|
336
|
-
searchTimeout:
|
328
|
+
searchTimeout: "2 minutes",
|
337
329
|
/**
|
338
330
|
* The number of searches to make in one run/batch.
|
339
331
|
* If more than this many searches are queued,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"config.template.cjs","sourceRoot":"","sources":["../src/config.template.cjs"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,qBAAqB;;AAErB,MAAM,CAAC,OAAO,GAAG;IAChB;;;;;;;;QAQI;IAEJ;;;;;OAKG;IACH,MAAM,EAAE,SAAS;IAEjB;;;;;;OAMG;IACH,OAAO,EAAE,EAAE;IAEX;;;;;;;;;;;;;OAaG;IACH,MAAM,EAAE,SAAS;IAEjB;;;;;;;;;;;;;OAaG;IACH,MAAM,EAAE,SAAS;IAEjB;;;;OAIG;IACH,IAAI,EAAE,SAAS;IAEf;;OAEG;IACH,IAAI,EAAE,IAAI;IAEV;;;OAGG;IACH,sBAAsB,EAAE,SAAS;IAEjC;;;;OAIG;IACH,cAAc,EAAE,SAAS;IAEzB;;;;;;;;;OASG;IACH,cAAc,EAAE,SAAS;IAEzB;;;;;;OAMG;IACH,kBAAkB,EAAE,SAAS;IAE7B;;;;;;OAMG;IACH,YAAY,EAAE,SAAS;IAEvB;;OAEG;IAEH;;;;OAIG;IAEH,KAAK,EAAE,EAAE;IAET
|
1
|
+
{"version":3,"file":"config.template.cjs","sourceRoot":"","sources":["../src/config.template.cjs"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,qBAAqB;;AAErB,MAAM,CAAC,OAAO,GAAG;IAChB;;;;;;;;QAQI;IAEJ;;;;;OAKG;IACH,MAAM,EAAE,SAAS;IAEjB;;;;;;OAMG;IACH,OAAO,EAAE,EAAE;IAEX;;;;;;;;;;;;;OAaG;IACH,MAAM,EAAE,SAAS;IAEjB;;;;;;;;;;;;;OAaG;IACH,MAAM,EAAE,SAAS;IAEjB;;;;OAIG;IACH,IAAI,EAAE,SAAS;IAEf;;OAEG;IACH,IAAI,EAAE,IAAI;IAEV;;;OAGG;IACH,sBAAsB,EAAE,SAAS;IAEjC;;;;OAIG;IACH,cAAc,EAAE,SAAS;IAEzB;;;;;;;;;OASG;IACH,cAAc,EAAE,SAAS;IAEzB;;;;;;OAMG;IACH,kBAAkB,EAAE,SAAS;IAE7B;;;;;;OAMG;IACH,YAAY,EAAE,SAAS;IAEvB;;OAEG;IAEH;;;;OAIG;IAEH,KAAK,EAAE,EAAE;IAET;;;;;;;;;;;;;;;OAeG;IAEH,QAAQ,EAAE,EAAE;IAEZ;;;;;;;OAOG;IACH,YAAY,EAAE,iBAAiB;IAE/B;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,EAAE,SAAS;IAElB;;;;;OAKG;IACH,QAAQ,EAAE,UAAU;IAEpB;;;;;;;;;;OAUG;IACH,WAAW,EAAE,KAAK;IAElB;;;;;;;;;;;OAWG;IACH,SAAS,EAAE,MAAM;IAEjB;;;;OAIG;IACH,YAAY,EAAE,CAAC;IAEf;;;;;;;;;OASG;IACH,UAAU,EAAE,2BAA2B;IAEvC;;;;OAIG;IACH,SAAS,EAAE,GAAG;IAEd;;;;;;OAMG;IACH,qBAAqB,EAAE,KAAK;IAE5B;;;;;;;;;;;;;;;;;;;;;;;;;;OA0BG;IACH,gBAAgB,EAAE,KAAK;IAEvB;;;;;;OAMG;IACH,kBAAkB,EAAE,IAAI;IAExB;;;OAGG;IAEH;;;;;;OAMG;IACH,YAAY,EAAE,SAAS;IAEvB;;;;;;;OAOG;IACH,mBAAmB,EAAE,QAAQ;IAE7B;;;OAGG;IACH,MAAM,EAAE,QAAQ;IAEhB;;;;;;;;;OASG;IACH,mBAAmB,EAAE,KAAK;IAE1B;;;;;;OAMG;IACH,UAAU,EAAE,YAAY;IAExB;;;;;;OAMG;IACH,aAAa,EAAE,OAAO;IAEtB;;;;;;OAMG;IACH,aAAa,EAAE,YAAY;IAE3B;;;;;;OAMG;IACH,aAAa,EAAE,WAAW;IAE1B;;;;;;;;;OASG;IACH,WAAW,EAAE,GAAG;IAEhB;;;;;;;;;;;;;OAaG;IACH,SAAS,EAAE,SAAS;CACpB,CAAC"}
|
package/dist/configSchema.js
CHANGED
@@ -101,7 +101,6 @@ export const VALIDATION_SCHEMA = z
|
|
101
101
|
maxDataDepth: z.number().gte(1),
|
102
102
|
torrentDir: z.string().nullable(),
|
103
103
|
outputDir: z.string(),
|
104
|
-
includeEpisodes: z.boolean(),
|
105
104
|
includeSingleEpisodes: z.boolean(),
|
106
105
|
includeNonVideos: z.boolean(),
|
107
106
|
fuzzySizeThreshold: z.number().positive().lte(1, {
|
package/dist/configSchema.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"configSchema.js","sourceRoot":"","sources":["../src/configSchema.ts"],"names":[],"mappings":"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
|
1
|
+
{"version":3,"file":"configSchema.js","sourceRoot":"","sources":["../src/configSchema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAA8B,CAAC,EAA2B,MAAM,KAAK,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAErD;;GAEG;AACH,MAAM,gBAAgB,GAAG;IACxB,MAAM,EAAE,sFAAsF;IAC9F,WAAW,EACV,8EAA8E;IAC/E,aAAa,EAAE,qDAAqD;IACpE,YAAY,EAAE,mCAAmC,cAAc,mEAAmE,cAAc,0EAA0E;IAC1N,kBAAkB,EAAE,6CAA6C;IACjE,SAAS,EACR,6GAA6G;IAC9G,WAAW,EACV,6HAA6H;IAC9H,YAAY,EACX,kGAAkG;IACnG,gBAAgB,EACf,iGAAiG;CAClG,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CACpC,KAA8B,EAC9B,GAAgB;IAEhB,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,CAAC,CAAC,YAAY,CAAC,aAAa;YAChC,OAAO;gBACN,OAAO,EAAE,KAAK,CAAC,WAAW;qBACxB,MAAM,CAAW,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE;oBAChC,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;oBACjD,OAAO,GAAG,CAAC;gBACZ,CAAC,EAAE,EAAE,CAAC;qBACL,IAAI,CAAC,IAAI,CAAC;aACZ,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,YAAY,EAAE,CAAC;AACtC,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CACnB,OAAe,EACf,YAAoB,EACpB,GAAkB;IAElB,GAAG,CAAC,QAAQ,CAAC;QACZ,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,aAAa,OAAO,QAAQ,YAAY,EAAE;KACnD,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AAEH,SAAS,uBAAuB,CAAC,WAAmB,EAAE,GAAkB;IACvE,MAAM,QAAQ,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC;IACjC,IAAI,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;QACrB,mCAAmC;QACnC,WAAW,CAAC,WAAW,EAAE,gBAAgB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,SAAS,WAAW,CAAC,OAAe,EAAE,QAAkB;IACvD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;QAChC,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACxC,MAAM,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;QACvC,MAAM,YAAY,GAAG,QAAQ,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QAC7D,2DAA2D;QAC3D,OAAO,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;AACJ,CAAC;AAED;;;GAGG;AAEH,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC;KAChC,MAAM,CAAC;IACP,KAAK,EAAE,CAAC;SACN,MAAM,EAAE;SACR,WAAW,CAAC;QACZ,OAAO,EAAE,gBAAgB,CAAC,aAAa;KACvC,CAAC;SACD,GAAG,CAAC,IAAI,EAAE,gBAAgB,CAAC,YAAY,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;IAClC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE;IACvC,SAAS,EAAE,CAAC,CAAC,UAAU,CAAC,SAAS,CAAC;IAClC,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;IAClC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE;IAC7B,QAAQ,EAAE,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC;IAChC,WAAW,EAAE,CAAC;SACZ,OAAO,EAAE;SACT,OAAO,EAAE;SACT,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACpE,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;IACrB,qBAAqB,EAAE,CAAC,CAAC,OAAO,EAAE;IAClC,gBAAgB,EAAE,CAAC,CAAC,OAAO,EAAE;IAC7B,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE;QAChD,OAAO,EAAE,gBAAgB,CAAC,kBAAkB;KAC5C,CAAC;IACF,YAAY,EAAE,CAAC;SACb,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,gBAAgB,CAAC,WAAW,EAAE,CAAC;SACjD,SAAS,CAAC,uBAAuB,CAAC;SAClC,OAAO,EAAE;IACX,mBAAmB,EAAE,CAAC;SACpB,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,gBAAgB,CAAC,WAAW,EAAE,CAAC;SACjD,SAAS,CAAC,uBAAuB,CAAC;SAClC,OAAO,EAAE;IACX,MAAM,EAAE,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;IAC5B,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;IAC1C,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;IAC1C,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;IAC9C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;IACxC,mBAAmB,EAAE,CAAC,CAAC,OAAO,EAAE;IAChC,sBAAsB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE;IAClD,IAAI,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,EAAE;SACV,GAAG,CAAC,KAAK,CAAC;SACV,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;SAC1C,OAAO,EAAE;IACX,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,EAAE;IAC/B,UAAU,EAAE,CAAC;SACX,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,gBAAgB,CAAC,WAAW,EAAE,CAAC;SACjD,SAAS,CAAC,uBAAuB,CAAC;SAClC,OAAO,EAAE;IACX,aAAa,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,gBAAgB,CAAC,WAAW,EAAE,CAAC;SACjD,SAAS,CAAC,uBAAuB,CAAC;SAClC,OAAO,EAAE;IACX,aAAa,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,gBAAgB,CAAC,WAAW,EAAE,CAAC;SACjD,SAAS,CAAC,uBAAuB,CAAC;SAClC,OAAO,EAAE;IACX,aAAa,EAAE,CAAC;SACd,MAAM,EAAE;SACR,GAAG,CAAC,CAAC,EAAE,EAAE,OAAO,EAAE,gBAAgB,CAAC,WAAW,EAAE,CAAC;SACjD,SAAS,CAAC,uBAAuB,CAAC;SAClC,OAAO,EAAE;IACX,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE;IAC/C,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE;IACpB,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,SAAS,EAAE,CAAC;SACV,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;SACjB,OAAO,EAAE;SACT,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC3D,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE;IACpC,MAAM,EAAE,CAAC;SACP,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;SACvB,OAAO,EAAE;SACT,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;IACnC,MAAM,EAAE,CAAC;SACP,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;SACvB,OAAO,EAAE;SACT,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;CACnC,CAAC;KACD,MAAM,EAAE;KACR,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;IAClB,IACC,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;QAC/B,MAAM,CAAC,cAAc;QACrB,CAAC,MAAM,CAAC,WAAW;QACnB,MAAM,CAAC,OAAO,EACb,CAAC;QACF,MAAM,CAAC,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC,CAAC;KACD,MAAM,CACN,CAAC,MAAM,EAAE,EAAE,CACV,CAAC,CACA,MAAM,CAAC,MAAM,KAAK,MAAM,CAAC,MAAM;IAC/B,CAAC,MAAM,CAAC,cAAc;IACtB,CAAC,MAAM,CAAC,cAAc;IACtB,CAAC,MAAM,CAAC,kBAAkB;IAC1B,CAAC,MAAM,CAAC,YAAY,CACpB,EACF,gBAAgB,CAAC,SAAS,CAC1B;KACA,MAAM,CACN,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,KAAK,SAAS,CAAC,IAAI,IAAI,MAAM,CAAC,OAAO,EACjE,gBAAgB,CAAC,YAAY,CAC7B;KACA,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE;IAClB,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"configuration.js","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,IAAI,CAAC;AAChF,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;
|
1
|
+
{"version":3,"file":"configuration.js","sourceRoot":"","sources":["../src/configuration.ts"],"names":[],"mappings":"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"}
|
package/dist/constants.js
CHANGED
@@ -9,16 +9,46 @@ export const TORRENT_CATEGORY_SUFFIX = `.cross-seed`;
|
|
9
9
|
export const NEWLINE_INDENT = "\n\t\t\t\t";
|
10
10
|
export const EP_REGEX = /^(?<title>.+?)[_.\s-]+(?:(?<season>S\d+)?[_.\s-]{0,3}(?!(?:19|20)\d{2})(?<episode>(?:E|(?<=S\d+[_\s-]{1,3}))\d+(?:[\s-]?(?!(?:19|20)\d{2})E?\d+)?(?![pix]))(?!\d+[pix])|(?<date>(?<year>(?:19|20)\d{2})[_.\s-](?<month>\d{2})[_.\s-](?<day>\d{2})))/i;
|
11
11
|
export const IS_MULTI_EP_REGEX = /E\d+(?:[-.]?S\d+E\d|[-.]?E\d|[-.]\d)/i;
|
12
|
-
export const SEASON_REGEX = /^(?<title>.+?)[[_.\s-]+(?<season>S\d+)(?:[_.\s~-]*?(?<seasonmax>S?\d+))?(?=[\]_.\s](?!E\d+))/i;
|
12
|
+
export const SEASON_REGEX = /^(?<title>.+?)[[_.\s-]+(?<season>S\d+)(?:[_.\s~-]*?(?<seasonmax>S?\d+))?(?=[\]_.\s]?(?!E\d+))/i;
|
13
13
|
export const MOVIE_REGEX = /^(?<title>.+?)-?[_.\s][[(]?(?<year>(?:18|19|20)\d{2})[)\]]?(?![pix])/i;
|
14
14
|
export const ANIME_REGEX = /^(?:\[(?<group>.*?)\][_.\s-]?)?(?:\[?(?<title>.+?)[_.\s-]?(?:\(?(?:\d{1,2}(?:st|nd|rd|th))?\s?Season)?[_.\s-]?\]?)(?:[([~/|-]\s?(?!\d{1,4})(?<altTitle>.+?)[)\]~-]?\s?)?[_.\s-]?(?:[[(]?(?<year>(?:19|20)\d{2})[)\]]?)?[[_.\s-](?:S\d{1,2})?[_.\s-]{0,3}(?:#|EP?|(?:SP))?[_.\s-]{0,3}(?!\d{3,4}[pix])(?<release>\d{1,4})/i;
|
15
15
|
export const RELEASE_GROUP_REGEX = /(?<=-)(?:\W|\b)(?!(?:\d{3,4}[ip]))(?!\d+\b)(?:\W|\b)(?<group>[\w .]+?)(?:\[.+\])?(?:\))?(?:\s\[.+\])?$/i;
|
16
16
|
export const RESOLUTION_REGEX = /\b(?<res>\d{3,4}[pix](?:\d{3,4}[pi]?)?)\b/i;
|
17
17
|
export const RES_STRICT_REGEX = /(?<res>(?:2160|1080|720)[pi])/;
|
18
|
+
export const YEAR_REGEX = /(?<year>(?:19|20)\d{2})(?![pix])/i;
|
18
19
|
export const REPACK_PROPER_REGEX = /(?:\b(?<type>(?:REPACK|PROPER|\d\v\d)\d?))\b/i;
|
19
20
|
export const ARR_PROPER_REGEX = /(?:\b(?<arrtype>(?:Proper|v\d)))\b/;
|
20
21
|
export const SCENE_TITLE_REGEX = /^(?:[a-z0-9]{0,5}-)?(?<title>.*)/;
|
21
|
-
export const ARR_DIR_REGEX = /^(?!.*(?:(\d{3,4}[ipx])|([xh]26[4-6])|(?:(he)|a)vc))[\p{L}\s:\w'’!()
|
22
|
+
export const ARR_DIR_REGEX = /^(?<title>(?!.*(?:(\d{3,4}[ipx])|([xh.]+26[4-6])|(mpeg)|(xvid)|(?:(he)|a)vc))[\p{L}\s:\w'’!();.,&–+-]+(?:\(\d{4}\))?)(?<id>\s[{[](?:tm|tv|im)db(?:id)?-\w+?[}\]])?$/iu;
|
23
|
+
export const SONARR_SUBFOLDERS_REGEX = /^(?:S(?:eason )?(?<seasonNum>\d{1,4}))$/i;
|
24
|
+
export const NON_UNICODE_ALPHANUM_REGEX = /[^\p{L}\p{N}]+/giu;
|
25
|
+
// Needs to be handled through helper functions since there are variations
|
26
|
+
const SOURCE_REGEXES = {
|
27
|
+
AMZN: /\b(amzn|amazon(hd)?)\b[ ._-]web[ ._-]?(dl|rip)?\b/i,
|
28
|
+
DSNP: /\b(dsnp|dsny|disney)\b/i,
|
29
|
+
NF: /\b(nf|netflix(u?hd)?)\b/i,
|
30
|
+
HULU: /\b(hulu)\b/i,
|
31
|
+
ATVP: /\b(atvp|aptv)\b/i,
|
32
|
+
HBO: /\b(hbo)(?![ ._-]max)\b|\b(hmax|hbom|hbo[ ._-]max)\b/i,
|
33
|
+
PCOK: /\b(pcok)\b/i,
|
34
|
+
PMTP: /\b(pmtp|Paramount Plus)\b/i,
|
35
|
+
};
|
36
|
+
export function parseSource(title) {
|
37
|
+
for (const [source, regex] of Object.entries(SOURCE_REGEXES)) {
|
38
|
+
if (regex.test(title))
|
39
|
+
return source;
|
40
|
+
}
|
41
|
+
return null;
|
42
|
+
}
|
43
|
+
export function sourceRegexRemove(title) {
|
44
|
+
const originalLength = title.length;
|
45
|
+
for (const regex of Object.values(SOURCE_REGEXES)) {
|
46
|
+
const newTitle = title.replace(regex, "");
|
47
|
+
if (newTitle.length !== originalLength)
|
48
|
+
return newTitle;
|
49
|
+
}
|
50
|
+
return title;
|
51
|
+
}
|
22
52
|
export const VIDEO_EXTENSIONS = [".mkv", ".mp4", ".avi", ".ts"];
|
23
53
|
export const AUDIO_EXTENSIONS = [
|
24
54
|
".wav",
|
@@ -57,7 +87,6 @@ export const ALL_EXTENSIONS = [
|
|
57
87
|
...AUDIO_EXTENSIONS,
|
58
88
|
...BOOK_EXTENSIONS,
|
59
89
|
];
|
60
|
-
export const IGNORED_FOLDERS_REGEX = /^(S(eason )?\d{1,4}|((CD|DVD|DISC)\d{1,2}))$/i;
|
61
90
|
export const TORRENT_CACHE_FOLDER = "torrent_cache";
|
62
91
|
export const UNKNOWN_TRACKER = "UnknownTracker";
|
63
92
|
export var Action;
|
package/dist/constants.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,CAAC;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,eAAe,EAAE,CAAC;AACzD,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;AACxC,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAa,CAAC;AACrD,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAE3C,MAAM,CAAC,MAAM,QAAQ,GACpB,sPAAsP,CAAC;AACxP,MAAM,CAAC,MAAM,iBAAiB,GAAG,uCAAuC,CAAC;AACzE,MAAM,CAAC,MAAM,YAAY,GACxB
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,cAAc,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAElD,MAAM,CAAC,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC;AAChD,MAAM,CAAC,MAAM,eAAe,GAAG,cAAc,CAAC,OAAO,CAAC;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,eAAe,EAAE,CAAC;AACzD,MAAM,CAAC,MAAM,WAAW,GAAG,YAAY,CAAC;AACxC,MAAM,CAAC,MAAM,uBAAuB,GAAG,aAAa,CAAC;AACrD,MAAM,CAAC,MAAM,cAAc,GAAG,YAAY,CAAC;AAE3C,MAAM,CAAC,MAAM,QAAQ,GACpB,sPAAsP,CAAC;AACxP,MAAM,CAAC,MAAM,iBAAiB,GAAG,uCAAuC,CAAC;AACzE,MAAM,CAAC,MAAM,YAAY,GACxB,gGAAgG,CAAC;AAClG,MAAM,CAAC,MAAM,WAAW,GACvB,uEAAuE,CAAC;AACzE,MAAM,CAAC,MAAM,WAAW,GACvB,2TAA2T,CAAC;AAC7T,MAAM,CAAC,MAAM,mBAAmB,GAC/B,yGAAyG,CAAC;AAC3G,MAAM,CAAC,MAAM,gBAAgB,GAAG,4CAA4C,CAAC;AAC7E,MAAM,CAAC,MAAM,gBAAgB,GAAG,+BAA+B,CAAC;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,mCAAmC,CAAC;AAC9D,MAAM,CAAC,MAAM,mBAAmB,GAC/B,+CAA+C,CAAC;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG,oCAAoC,CAAC;AACrE,MAAM,CAAC,MAAM,iBAAiB,GAAG,kCAAkC,CAAC;AACpE,MAAM,CAAC,MAAM,aAAa,GACzB,uKAAuK,CAAC;AACzK,MAAM,CAAC,MAAM,uBAAuB,GACnC,0CAA0C,CAAC;AAC5C,MAAM,CAAC,MAAM,0BAA0B,GAAG,mBAAmB,CAAC;AAE9D,0EAA0E;AAC1E,MAAM,cAAc,GAAG;IACtB,IAAI,EAAE,oDAAoD;IAC1D,IAAI,EAAE,yBAAyB;IAC/B,EAAE,EAAE,0BAA0B;IAC9B,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,kBAAkB;IACxB,GAAG,EAAE,sDAAsD;IAC3D,IAAI,EAAE,aAAa;IACnB,IAAI,EAAE,4BAA4B;CAClC,CAAC;AACF,MAAM,UAAU,WAAW,CAAC,KAAa;IACxC,KAAK,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;QAC9D,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,MAAM,CAAC;IACtC,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AACD,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC9C,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC;IACpC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC1C,IAAI,QAAQ,CAAC,MAAM,KAAK,cAAc;YAAE,OAAO,QAAQ,CAAC;IACzD,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;AAChE,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC/B,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;CACN,CAAC;AACF,MAAM,CAAC,MAAM,eAAe,GAAG;IAC9B,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;IACN,MAAM;CACN,CAAC;AACF,MAAM,CAAC,MAAM,cAAc,GAAG;IAC7B,GAAG,gBAAgB;IACnB,GAAG,gBAAgB;IACnB,GAAG,eAAe;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,oBAAoB,GAAG,eAAe,CAAC;AACpD,MAAM,CAAC,MAAM,eAAe,GAAG,gBAAgB,CAAC;AAEhD,MAAM,CAAN,IAAY,MAGX;AAHD,WAAY,MAAM;IACjB,uBAAa,CAAA;IACb,2BAAiB,CAAA;AAClB,CAAC,EAHW,MAAM,KAAN,MAAM,QAGjB;AAED,MAAM,CAAN,IAAY,eAKX;AALD,WAAY,eAAe;IAC1B,uCAAoB,CAAA;IACpB,sCAAmB,CAAA;IACnB,oDAAiC,CAAA;IACjC,gEAA6C,CAAA;AAC9C,CAAC,EALW,eAAe,KAAf,eAAe,QAK1B;AAED,MAAM,CAAN,IAAY,UAEX;AAFD,WAAY,UAAU;IACrB,6BAAe,CAAA;AAChB,CAAC,EAFW,UAAU,KAAV,UAAU,QAErB;AAID,MAAM,CAAN,IAAY,QAiBX;AAjBD,WAAY,QAAQ;IACnB,2BAAe,CAAA;IACf,+CAAmC,CAAA;IACnC,2CAA+B,CAAA;IAC/B,uDAA2C,CAAA;IAC3C,2CAA+B,CAAA;IAC/B,2DAA+C,CAAA;IAC/C,iDAAqC,CAAA;IACrC,+CAAmC,CAAA;IACnC,uCAA2B,CAAA;IAC3B,yCAA6B,CAAA;IAC7B,iEAAqD,CAAA;IACrD,qDAAyC,CAAA;IACzC,6DAAiD,CAAA;IACjD,+CAAmC,CAAA;IACnC,6DAAiD,CAAA;IACjD,uDAA2C,CAAA;AAC5C,CAAC,EAjBW,QAAQ,KAAR,QAAQ,QAiBnB;AAKD,MAAM,UAAU,oBAAoB,CACnC,QAAkB;IAElB,OAAO,CACN,QAAQ,KAAK,QAAQ,CAAC,KAAK;QAC3B,QAAQ,KAAK,QAAQ,CAAC,eAAe;QACrC,QAAQ,KAAK,QAAQ,CAAC,aAAa,CACnC,CAAC;AACH,CAAC;AAED,MAAM,CAAN,IAAY,SAIX;AAJD,WAAY,SAAS;IACpB,0BAAa,CAAA;IACb,4BAAe,CAAA;IACf,gCAAmB,CAAA;AACpB,CAAC,EAJW,SAAS,KAAT,SAAS,QAIpB;AAED,MAAM,CAAN,IAAY,QAGX;AAHD,WAAY,QAAQ;IACnB,+BAAmB,CAAA;IACnB,iCAAqB,CAAA;AACtB,CAAC,EAHW,QAAQ,KAAR,QAAQ,QAGnB;AAED,MAAM,CAAC,MAAM,0BAA0B,GAAG;IACzC,QAAQ;IACR,OAAO;IACP,MAAM;IACN,OAAO;IACP,aAAa;IACb,UAAU;CACV,CAAC"}
|
package/dist/dataFiles.js
CHANGED
@@ -1,15 +1,14 @@
|
|
1
1
|
import { readdirSync, statSync } from "fs";
|
2
2
|
import { basename, extname, join } from "path";
|
3
|
-
import { IGNORED_FOLDERS_SUBSTRINGS,
|
3
|
+
import { IGNORED_FOLDERS_SUBSTRINGS, VIDEO_EXTENSIONS } from "./constants.js";
|
4
4
|
import { getRuntimeConfig } from "./runtimeConfig.js";
|
5
5
|
function shouldIgnorePathHeuristically(root, isDir) {
|
6
|
-
const
|
6
|
+
const searchBasename = basename(root);
|
7
7
|
if (isDir) {
|
8
|
-
return
|
9
|
-
IGNORED_FOLDERS_REGEX.test(folderBaseName));
|
8
|
+
return IGNORED_FOLDERS_SUBSTRINGS.includes(searchBasename.toLowerCase());
|
10
9
|
}
|
11
10
|
else {
|
12
|
-
return !VIDEO_EXTENSIONS.includes(extname(
|
11
|
+
return !VIDEO_EXTENSIONS.includes(extname(searchBasename));
|
13
12
|
}
|
14
13
|
}
|
15
14
|
export function findPotentialNestedRoots(root, depth, isDirHint) {
|
package/dist/dataFiles.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"dataFiles.js","sourceRoot":"","sources":["../src/dataFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,
|
1
|
+
{"version":3,"file":"dataFiles.js","sourceRoot":"","sources":["../src/dataFiles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,0BAA0B,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,SAAS,6BAA6B,CAAC,IAAY,EAAE,KAAc;IAClE,MAAM,cAAc,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,KAAK,EAAE,CAAC;QACX,OAAO,0BAA0B,CAAC,QAAQ,CACzC,cAAc,CAAC,WAAW,EAAE,CAC5B,CAAC;IACH,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;IAC5D,CAAC;AACF,CAAC;AACD,MAAM,UAAU,wBAAwB,CACvC,IAAY,EACZ,KAAa,EACb,SAAmB;IAEnB,MAAM,KAAK,GACV,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IACpE,IAAI,KAAK,IAAI,CAAC,IAAI,6BAA6B,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,CAAC;IACX,CAAC;IACD,wCAAwC;SACnC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,cAAc,GAAG,WAAW,CAAC,IAAI,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAClE,MAAM,cAAc,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CACxD,wBAAwB,CACvB,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EACvB,KAAK,GAAG,CAAC,EACT,MAAM,CAAC,WAAW,EAAE,CACpB,CACD,CAAC;QACF,OAAO,CAAC,IAAI,EAAE,GAAG,cAAc,CAAC,CAAC;IAClC,CAAC;SAAM,CAAC;QACP,OAAO,CAAC,IAAI,CAAC,CAAC;IACf,CAAC;AACF,CAAC;AAED,MAAM,UAAU,4BAA4B;IAC3C,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,GAAG,gBAAgB,EAAE,CAAC;IACtD,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CACnC,WAAW,CAAC,OAAO,CAAC;SAClB,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;SACtC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,wBAAwB,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CACjE,CAAC;AACH,CAAC"}
|
package/dist/pipeline.js
CHANGED
@@ -3,20 +3,20 @@ import fs from "fs";
|
|
3
3
|
import { zip } from "lodash-es";
|
4
4
|
import ms from "ms";
|
5
5
|
import { performAction, performActions } from "./action.js";
|
6
|
-
import { Decision, InjectionResult, isAnyMatchedDecision, } from "./constants.js";
|
6
|
+
import { Decision, InjectionResult, isAnyMatchedDecision, SaveResult, } from "./constants.js";
|
7
7
|
import { findPotentialNestedRoots, findSearcheesFromAllDataDirs, } from "./dataFiles.js";
|
8
8
|
import { db } from "./db.js";
|
9
9
|
import { assessCandidate } from "./decide.js";
|
10
10
|
import { IndexerStatus, updateIndexerStatus, updateSearchTimestamps, } from "./indexers.js";
|
11
11
|
import { Label, logger } from "./logger.js";
|
12
|
-
import { filterByContent,
|
12
|
+
import { filterByContent, filterDupesFromSimilar, filterTimestamps, } from "./preFilter.js";
|
13
13
|
import { sendResultsNotification } from "./pushNotifier.js";
|
14
14
|
import { isOk } from "./Result.js";
|
15
15
|
import { getRuntimeConfig } from "./runtimeConfig.js";
|
16
16
|
import { createSearcheeFromMetafile, createSearcheeFromPath, createSearcheeFromTorrentFile, } from "./searchee.js";
|
17
|
-
import { getInfoHashesToExclude, getTorrentByCriteria,
|
18
|
-
import { queryRssFeeds, searchTorznab } from "./torznab.js";
|
19
|
-
import {
|
17
|
+
import { getInfoHashesToExclude, getTorrentByCriteria, getSimilarTorrentsByName, indexNewTorrents, loadTorrentDirLight, } from "./torrent.js";
|
18
|
+
import { getSearchString, queryRssFeeds, searchTorznab, } from "./torznab.js";
|
19
|
+
import { getLogString, isTruthy, wait } from "./utils.js";
|
20
20
|
async function assessCandidates(candidates, searchee, hashesToExclude) {
|
21
21
|
const assessments = [];
|
22
22
|
for (const result of candidates) {
|
@@ -25,13 +25,18 @@ async function assessCandidates(candidates, searchee, hashesToExclude) {
|
|
25
25
|
}
|
26
26
|
return assessments;
|
27
27
|
}
|
28
|
-
async function findOnOtherSites(searchee, hashesToExclude, progress) {
|
28
|
+
async function findOnOtherSites(searchee, hashesToExclude, prevCandidates, progress) {
|
29
29
|
// make sure searchee is in database
|
30
30
|
await db("searchee")
|
31
31
|
.insert({ name: searchee.name })
|
32
32
|
.onConflict("name")
|
33
33
|
.ignore();
|
34
|
-
const
|
34
|
+
const searchStr = await getSearchString(searchee);
|
35
|
+
const response = await searchTorznab(searchee, prevCandidates, searchStr, progress);
|
36
|
+
const searchedIndexers = response.length === prevCandidates.get(searchStr)?.length
|
37
|
+
? 0
|
38
|
+
: response.length;
|
39
|
+
prevCandidates.set(searchStr, response);
|
35
40
|
const results = response.flatMap((e) => e.candidates.map((candidate) => ({
|
36
41
|
...candidate,
|
37
42
|
indexerId: e.indexerId,
|
@@ -52,27 +57,33 @@ async function findOnOtherSites(searchee, hashesToExclude, progress) {
|
|
52
57
|
const actionResults = await performActions(searchee, matches);
|
53
58
|
if (actionResults.includes(InjectionResult.TORRENT_NOT_COMPLETE)) {
|
54
59
|
// If the torrent is not complete, "cancel the search"
|
55
|
-
return {
|
60
|
+
return { searchedIndexers: 0, matches: 0 };
|
56
61
|
}
|
57
62
|
await updateSearchTimestamps(searchee.name, Array.from(notRateLimited));
|
58
63
|
await updateIndexerStatus(IndexerStatus.RATE_LIMITED, Date.now() + ms("1 hour"), Array.from(rateLimited));
|
59
64
|
const zipped = zip(matches.map((m) => m.assessment), matches.map((m) => m.tracker), actionResults);
|
60
65
|
sendResultsNotification(searchee, zipped);
|
61
|
-
return { matches: matches.length
|
66
|
+
return { searchedIndexers, matches: matches.length };
|
62
67
|
}
|
63
|
-
async function findMatchesBatch(
|
68
|
+
async function findMatchesBatch(searchees, hashesToExclude) {
|
64
69
|
const { delay } = getRuntimeConfig();
|
65
70
|
let totalFound = 0;
|
66
|
-
|
67
|
-
|
71
|
+
let prevSearchTime = 0;
|
72
|
+
const prevCandidates = new Map();
|
73
|
+
for (const [i, searchee] of searchees.entries()) {
|
74
|
+
const progress = chalk.blue(`(${i + 1}/${searchees.length}) `);
|
68
75
|
try {
|
69
|
-
const
|
70
|
-
|
76
|
+
const sleepTime = delay * 1000 - (Date.now() - prevSearchTime);
|
77
|
+
if (sleepTime > 0) {
|
78
|
+
await new Promise((r) => setTimeout(r, sleepTime));
|
79
|
+
}
|
80
|
+
const searchTime = Date.now();
|
81
|
+
const { searchedIndexers, matches } = await findOnOtherSites(searchee, hashesToExclude, prevCandidates, progress);
|
71
82
|
totalFound += matches;
|
72
|
-
// if all indexers were rate limited, don't sleep
|
83
|
+
// if all indexers were rate limited or cached, don't sleep
|
73
84
|
if (searchedIndexers === 0)
|
74
85
|
continue;
|
75
|
-
|
86
|
+
prevSearchTime = searchTime;
|
76
87
|
}
|
77
88
|
catch (e) {
|
78
89
|
const searcheeLog = getLogString(searchee, chalk.bold.white);
|
@@ -87,25 +98,31 @@ async function findMatchesBatch(samples, hashesToExclude) {
|
|
87
98
|
}
|
88
99
|
export async function searchForLocalTorrentByCriteria(criteria) {
|
89
100
|
const { delay, maxDataDepth } = getRuntimeConfig();
|
90
|
-
let
|
101
|
+
let rawSearchees;
|
91
102
|
if (criteria.path) {
|
92
103
|
const searcheeResults = await Promise.all(findPotentialNestedRoots(criteria.path, maxDataDepth).map(createSearcheeFromPath));
|
93
|
-
|
104
|
+
rawSearchees = searcheeResults.filter(isOk).map((t) => t.unwrap());
|
94
105
|
}
|
95
106
|
else {
|
96
|
-
|
107
|
+
rawSearchees = [await getTorrentByCriteria(criteria)];
|
97
108
|
}
|
98
|
-
searchees.map((
|
109
|
+
const searchees = rawSearchees.map((searchee) => ({
|
110
|
+
...searchee,
|
111
|
+
label: Label.WEBHOOK,
|
112
|
+
}));
|
99
113
|
const hashesToExclude = await getInfoHashesToExclude();
|
100
114
|
let totalFound = 0;
|
115
|
+
let filtered = 0;
|
116
|
+
const prevCandidates = new Map();
|
101
117
|
for (const [i, searchee] of searchees.entries()) {
|
102
118
|
const progress = chalk.blue(`(${i + 1}/${searchees.length}) `);
|
103
119
|
try {
|
104
120
|
if (!filterByContent(searchee)) {
|
105
|
-
|
121
|
+
filtered++;
|
122
|
+
continue;
|
106
123
|
}
|
107
124
|
const sleep = wait(delay * 1000);
|
108
|
-
const { matches, searchedIndexers } = await findOnOtherSites(searchee, hashesToExclude, progress);
|
125
|
+
const { matches, searchedIndexers } = await findOnOtherSites(searchee, hashesToExclude, prevCandidates, progress);
|
109
126
|
totalFound += matches;
|
110
127
|
// if all indexers were rate limited, don't sleep
|
111
128
|
if (searchedIndexers === 0 || i === searchees.length - 1)
|
@@ -121,85 +138,145 @@ export async function searchForLocalTorrentByCriteria(criteria) {
|
|
121
138
|
logger.debug(e);
|
122
139
|
}
|
123
140
|
}
|
141
|
+
if (filtered === searchees.length)
|
142
|
+
return null;
|
124
143
|
return totalFound;
|
125
144
|
}
|
126
145
|
export async function checkNewCandidateMatch(candidate, searcheeLabel) {
|
127
|
-
const candidateLog = `${candidate.
|
128
|
-
const
|
129
|
-
|
146
|
+
const candidateLog = `${candidate.name} from ${candidate.tracker}`;
|
147
|
+
const { keys, metas } = await getSimilarTorrentsByName(candidate.name);
|
148
|
+
const method = keys.length ? `[${keys}]` : "Fuse fallback";
|
149
|
+
if (!metas.length) {
|
130
150
|
logger.verbose({
|
131
151
|
label: searcheeLabel,
|
132
|
-
message: `Did not find an existing entry for ${candidateLog}`,
|
152
|
+
message: `Did not find an existing entry using ${method} for ${candidateLog}`,
|
133
153
|
});
|
134
154
|
return null;
|
135
155
|
}
|
136
|
-
const
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
.ignore();
|
146
|
-
const assessment = await assessCandidate(candidate, searchee, hashesToExclude);
|
147
|
-
if (!isAnyMatchedDecision(assessment.decision)) {
|
156
|
+
const searchees = filterDupesFromSimilar(metas
|
157
|
+
.map(createSearcheeFromMetafile)
|
158
|
+
.map((searchee) => ({ ...searchee, label: searcheeLabel }))
|
159
|
+
.filter(filterByContent));
|
160
|
+
if (!searchees.length) {
|
161
|
+
logger.verbose({
|
162
|
+
label: searcheeLabel,
|
163
|
+
message: `No valid entries found using ${method} for ${candidateLog}`,
|
164
|
+
});
|
148
165
|
return null;
|
149
166
|
}
|
150
|
-
|
151
|
-
|
152
|
-
[
|
153
|
-
|
167
|
+
logger.verbose({
|
168
|
+
label: searcheeLabel,
|
169
|
+
message: `Unique entries [${searchees.map((m) => m.name)}] using ${method} for ${candidateLog}`,
|
170
|
+
});
|
171
|
+
const hashesToExclude = await getInfoHashesToExclude();
|
172
|
+
let result = null;
|
173
|
+
searchees.sort((a, b) => b.files.length - a.files.length);
|
174
|
+
for (const searchee of searchees) {
|
175
|
+
await db("searchee")
|
176
|
+
.insert({ name: searchee.name })
|
177
|
+
.onConflict("name")
|
178
|
+
.ignore();
|
179
|
+
const assessment = await assessCandidate(candidate, searchee, hashesToExclude);
|
180
|
+
if (!isAnyMatchedDecision(assessment.decision)) {
|
181
|
+
continue;
|
182
|
+
}
|
183
|
+
result = await performAction(assessment.metafile, assessment.decision, searchee, candidate.tracker);
|
184
|
+
sendResultsNotification(searchee, [
|
185
|
+
[assessment, candidate.tracker, result],
|
186
|
+
]);
|
187
|
+
if (result === SaveResult.SAVED ||
|
188
|
+
result === InjectionResult.SUCCESS ||
|
189
|
+
result === InjectionResult.ALREADY_EXISTS) {
|
190
|
+
break;
|
191
|
+
}
|
192
|
+
}
|
154
193
|
return result;
|
155
194
|
}
|
156
|
-
async function findSearchableTorrents() {
|
195
|
+
async function findSearchableTorrents(searcheeLabel) {
|
157
196
|
const { torrents, dataDirs, torrentDir, searchLimit } = getRuntimeConfig();
|
158
|
-
|
197
|
+
const rawSearchees = [];
|
159
198
|
if (Array.isArray(torrents)) {
|
160
199
|
const searcheeResults = await Promise.all(torrents.map(createSearcheeFromTorrentFile));
|
161
|
-
|
200
|
+
rawSearchees.push(...searcheeResults.filter(isOk).map((r) => r.unwrap()));
|
162
201
|
}
|
163
202
|
else {
|
164
203
|
if (typeof torrentDir === "string") {
|
165
|
-
|
204
|
+
rawSearchees.push(...(await loadTorrentDirLight(torrentDir)));
|
166
205
|
}
|
167
206
|
if (Array.isArray(dataDirs)) {
|
168
207
|
const searcheeResults = await Promise.all(findSearcheesFromAllDataDirs().map(createSearcheeFromPath));
|
169
|
-
|
208
|
+
rawSearchees.push(...searcheeResults.filter(isOk).map((r) => r.unwrap()));
|
170
209
|
}
|
171
210
|
}
|
211
|
+
const allSearchees = rawSearchees.map((searchee) => ({
|
212
|
+
...searchee,
|
213
|
+
label: searcheeLabel,
|
214
|
+
}));
|
172
215
|
const hashesToExclude = allSearchees
|
173
216
|
.map((t) => t.infoHash)
|
174
217
|
.filter(isTruthy);
|
175
|
-
|
218
|
+
// Group the exact same search queries together for easy cache use later
|
219
|
+
const grouping = new Map();
|
220
|
+
for (const searchee of allSearchees.filter(filterByContent)) {
|
221
|
+
const key = await getSearchString(searchee);
|
222
|
+
if (!grouping.has(key)) {
|
223
|
+
grouping.set(key, []);
|
224
|
+
}
|
225
|
+
grouping.get(key).push(searchee);
|
226
|
+
}
|
227
|
+
const keysToDelete = [];
|
228
|
+
for (const [key, groupedSearchees] of grouping) {
|
229
|
+
// If one searchee needs to be searched, use the candidates for all
|
230
|
+
const searchees = filterDupesFromSimilar(groupedSearchees);
|
231
|
+
const results = await Promise.all(searchees.map(filterTimestamps));
|
232
|
+
if (!results.some(isTruthy)) {
|
233
|
+
keysToDelete.push(key);
|
234
|
+
continue;
|
235
|
+
}
|
236
|
+
// Prefer infoHash
|
237
|
+
searchees.sort((a, b) => {
|
238
|
+
if (a.infoHash && !b.infoHash)
|
239
|
+
return -1;
|
240
|
+
if (!a.infoHash && b.infoHash)
|
241
|
+
return 1;
|
242
|
+
return 0;
|
243
|
+
});
|
244
|
+
// Sort by most number files (less chance of partial)
|
245
|
+
searchees.sort((a, b) => {
|
246
|
+
return b.files.length - a.files.length;
|
247
|
+
});
|
248
|
+
grouping.set(key, searchees);
|
249
|
+
}
|
250
|
+
for (const key of keysToDelete) {
|
251
|
+
grouping.delete(key);
|
252
|
+
}
|
253
|
+
let finalSearchees = Array.from(grouping.values()).flat();
|
176
254
|
logger.info({
|
177
255
|
label: Label.SEARCH,
|
178
|
-
message: `Found ${allSearchees.length} torrents, ${
|
256
|
+
message: `Found ${allSearchees.length} torrents, ${finalSearchees.length} suitable to search for matches using ${grouping.size} unique queries`,
|
179
257
|
});
|
180
|
-
if (searchLimit &&
|
258
|
+
if (searchLimit && finalSearchees.length > searchLimit) {
|
181
259
|
logger.info({
|
182
260
|
label: Label.SEARCH,
|
183
261
|
message: `Limited to ${searchLimit} searches`,
|
184
262
|
});
|
185
|
-
|
263
|
+
finalSearchees = finalSearchees.slice(0, searchLimit);
|
186
264
|
}
|
187
|
-
return {
|
265
|
+
return { searchees: finalSearchees, hashesToExclude };
|
188
266
|
}
|
189
267
|
export async function main() {
|
190
268
|
const { outputDir, linkDir } = getRuntimeConfig();
|
191
|
-
const {
|
192
|
-
samples.map((s) => (s.label = Label.SEARCH));
|
269
|
+
const { searchees, hashesToExclude } = await findSearchableTorrents(Label.SEARCH);
|
193
270
|
if (!fs.existsSync(outputDir)) {
|
194
271
|
fs.mkdirSync(outputDir, { recursive: true });
|
195
272
|
}
|
196
273
|
if (linkDir && !fs.existsSync(linkDir)) {
|
197
274
|
fs.mkdirSync(linkDir, { recursive: true });
|
198
275
|
}
|
199
|
-
const totalFound = await findMatchesBatch(
|
276
|
+
const totalFound = await findMatchesBatch(searchees, hashesToExclude);
|
200
277
|
logger.info({
|
201
278
|
label: Label.SEARCH,
|
202
|
-
message: chalk.cyan(`Found ${chalk.bold.white(totalFound)} cross seeds from ${chalk.bold.white(
|
279
|
+
message: chalk.cyan(`Found ${chalk.bold.white(totalFound)} cross seeds from ${chalk.bold.white(searchees.length)} original torrents`),
|
203
280
|
});
|
204
281
|
}
|
205
282
|
export async function scanRssFeeds() {
|