cross-seed 3.4.2 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -93
- package/dist/action.js +48 -0
- package/dist/action.js.map +1 -0
- package/dist/cache.js +13 -0
- package/dist/cache.js.map +1 -0
- package/dist/cmd.js +34 -23
- package/dist/cmd.js.map +1 -1
- package/dist/config.template.cjs +38 -21
- package/dist/config.template.cjs.map +1 -1
- package/dist/config.template.docker.cjs +41 -23
- package/dist/config.template.docker.cjs.map +1 -1
- package/dist/configuration.js.map +1 -1
- package/dist/constants.js +4 -0
- package/dist/constants.js.map +1 -1
- package/dist/db.js +11 -28
- package/dist/db.js.map +1 -1
- package/dist/decide.js +37 -21
- package/dist/decide.js.map +1 -1
- package/dist/errors.js +8 -0
- package/dist/errors.js.map +1 -1
- package/dist/jobs.js +73 -0
- package/dist/jobs.js.map +1 -0
- package/dist/logger.js +6 -2
- package/dist/logger.js.map +1 -1
- package/dist/migrations/00-initialSchema.js +75 -0
- package/dist/migrations/00-initialSchema.js.map +1 -0
- package/dist/migrations/01-jobs.js +17 -0
- package/dist/migrations/01-jobs.js.map +1 -0
- package/dist/migrations/migrations.js +9 -0
- package/dist/migrations/migrations.js.map +1 -0
- package/dist/pipeline.js +76 -95
- package/dist/pipeline.js.map +1 -1
- package/dist/preFilter.js +20 -18
- package/dist/preFilter.js.map +1 -1
- package/dist/pushNotifier.js +37 -0
- package/dist/pushNotifier.js.map +1 -1
- package/dist/runtimeConfig.js +0 -1
- package/dist/runtimeConfig.js.map +1 -1
- package/dist/server.js +5 -4
- package/dist/server.js.map +1 -1
- package/dist/signalHandlers.js +7 -2
- package/dist/signalHandlers.js.map +1 -1
- package/dist/startup.js +0 -2
- package/dist/startup.js.map +1 -1
- package/dist/torrent.js +26 -13
- package/dist/torrent.js.map +1 -1
- package/dist/torznab.js +2 -2
- package/dist/torznab.js.map +1 -1
- package/dist/utils.js +16 -4
- package/dist/utils.js.map +1 -1
- package/package.json +5 -3
- package/dist/jackett.js +0 -64
- package/dist/jackett.js.map +0 -1
package/dist/db.js
CHANGED
@@ -1,29 +1,12 @@
|
|
1
|
-
|
2
|
-
import {
|
3
|
-
import {
|
4
|
-
import
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
dbVersion: 3,
|
13
|
-
};
|
14
|
-
const db = new LowSync(new JSONFileSync(path.join(appDir(), "cache.json")));
|
15
|
-
db.read();
|
16
|
-
(_a = db.data) !== null && _a !== void 0 ? _a : (db.data = emptyDatabase);
|
17
|
-
const dbVersion = db.data.dbVersion;
|
18
|
-
if (!dbVersion || dbVersion < emptyDatabase.dbVersion) {
|
19
|
-
db.data = emptyDatabase;
|
20
|
-
}
|
21
|
-
db.write();
|
22
|
-
export function dropDatabase() {
|
23
|
-
db.data = emptyDatabase;
|
24
|
-
db.write();
|
25
|
-
unlinkSync(path.join(appDir(), "cache.json"));
|
26
|
-
rimraf.sync(path.join(appDir(), "torrent_cache"));
|
27
|
-
}
|
28
|
-
export default db;
|
1
|
+
import Knex from "knex";
|
2
|
+
import { join } from "path";
|
3
|
+
import { appDir } from "./configuration.js";
|
4
|
+
import { migrations } from "./migrations/migrations.js";
|
5
|
+
export const db = Knex.knex({
|
6
|
+
client: "better-sqlite3",
|
7
|
+
connection: { filename: join(appDir(), "cross-seed.db") },
|
8
|
+
migrations: { migrationSource: migrations, disableTransactions: true },
|
9
|
+
useNullAsDefault: true,
|
10
|
+
acquireConnectionTimeout: 5000,
|
11
|
+
});
|
29
12
|
//# sourceMappingURL=db.js.map
|
package/dist/db.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../src/db.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC;IAC3B,MAAM,EAAE,gBAAgB;IACxB,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,EAAE;IACzD,UAAU,EAAE,EAAE,eAAe,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE;IACtE,gBAAgB,EAAE,IAAI;IACtB,wBAAwB,EAAE,IAAI;CAC9B,CAAC,CAAC"}
|
package/dist/decide.js
CHANGED
@@ -3,9 +3,9 @@ import parseTorrent from "parse-torrent";
|
|
3
3
|
import path from "path";
|
4
4
|
import { appDir } from "./configuration.js";
|
5
5
|
import { Decision, TORRENT_CACHE_FOLDER } from "./constants.js";
|
6
|
-
import db from "./db.js";
|
7
6
|
import { Label, logger } from "./logger.js";
|
8
7
|
import { getRuntimeConfig } from "./runtimeConfig.js";
|
8
|
+
import { db } from "./db.js";
|
9
9
|
import { parseTorrentFromFilename, parseTorrentFromURL } from "./torrent.js";
|
10
10
|
const createReasonLogger = (Title, tracker, name) => (decision, cached) => {
|
11
11
|
function logReason(reason) {
|
@@ -72,7 +72,7 @@ async function assessCandidateHelper({ link, size }, searchee, hashesToExclude)
|
|
72
72
|
if (!compareFileTrees(info, searchee)) {
|
73
73
|
return { decision: Decision.FILE_TREE_MISMATCH };
|
74
74
|
}
|
75
|
-
return { decision: Decision.MATCH, info };
|
75
|
+
return { decision: Decision.MATCH, metafile: info };
|
76
76
|
}
|
77
77
|
function existsInTorrentCache(infoHash) {
|
78
78
|
return existsSync(path.join(appDir(), TORRENT_CACHE_FOLDER, `${infoHash}.cached.torrent`));
|
@@ -83,27 +83,38 @@ async function getCachedTorrentFile(infoHash) {
|
|
83
83
|
function cacheTorrentFile(meta) {
|
84
84
|
writeFileSync(path.join(appDir(), TORRENT_CACHE_FOLDER, `${meta.infoHash}.cached.torrent`), parseTorrent.toTorrentFile(meta));
|
85
85
|
}
|
86
|
-
async function assessAndSaveResults(result, searchee,
|
86
|
+
async function assessAndSaveResults(result, searchee, guid, infoHashesToExclude) {
|
87
87
|
const assessment = await assessCandidateHelper(result, searchee, infoHashesToExclude);
|
88
|
-
db.data.decisions[searchee.name][Guid] = {
|
89
|
-
decision: assessment.decision,
|
90
|
-
lastSeen: Date.now(),
|
91
|
-
firstSeen: Date.now(),
|
92
|
-
};
|
93
88
|
if (assessment.decision === Decision.MATCH) {
|
94
|
-
|
95
|
-
assessment.info.infoHash;
|
96
|
-
cacheTorrentFile(assessment.info);
|
89
|
+
cacheTorrentFile(assessment.metafile);
|
97
90
|
}
|
91
|
+
await db.transaction(async (trx) => {
|
92
|
+
const now = Date.now();
|
93
|
+
const { id } = await trx("searchee")
|
94
|
+
.select("id")
|
95
|
+
.where({ name: searchee.name })
|
96
|
+
.first();
|
97
|
+
await trx("decision").insert({
|
98
|
+
searchee_id: id,
|
99
|
+
guid: guid,
|
100
|
+
decision: assessment.decision,
|
101
|
+
info_hash: assessment.decision === Decision.MATCH
|
102
|
+
? assessment.metafile.infoHash
|
103
|
+
: null,
|
104
|
+
last_seen: now,
|
105
|
+
first_seen: now,
|
106
|
+
});
|
107
|
+
});
|
98
108
|
return assessment;
|
99
109
|
}
|
100
110
|
async function assessCandidateCaching(candidate, searchee, infoHashesToExclude) {
|
101
|
-
var _a;
|
102
|
-
var _b, _c;
|
103
111
|
const { guid, name, tracker } = candidate;
|
104
112
|
const logReason = createReasonLogger(name, tracker, searchee.name);
|
105
|
-
|
106
|
-
|
113
|
+
const cacheEntry = await db("decision")
|
114
|
+
.select("decision.*")
|
115
|
+
.join("searchee", "decision.searchee_id", "searchee.id")
|
116
|
+
.where({ name: searchee.name, guid })
|
117
|
+
.first();
|
107
118
|
let assessment;
|
108
119
|
if (!(cacheEntry === null || cacheEntry === void 0 ? void 0 : cacheEntry.decision) ||
|
109
120
|
cacheEntry.decision === Decision.DOWNLOAD_FAILED) {
|
@@ -114,15 +125,16 @@ async function assessCandidateCaching(candidate, searchee, infoHashesToExclude)
|
|
114
125
|
infoHashesToExclude.includes(cacheEntry.infoHash)) {
|
115
126
|
// has been added since the last run
|
116
127
|
assessment = { decision: Decision.INFO_HASH_ALREADY_EXISTS };
|
117
|
-
db
|
118
|
-
|
128
|
+
await db("decision")
|
129
|
+
.where({ id: cacheEntry.id })
|
130
|
+
.update({ decision: Decision.INFO_HASH_ALREADY_EXISTS });
|
119
131
|
}
|
120
132
|
else if (cacheEntry.decision === Decision.MATCH &&
|
121
|
-
existsInTorrentCache(cacheEntry.
|
133
|
+
existsInTorrentCache(cacheEntry.info_hash)) {
|
122
134
|
// cached match
|
123
135
|
assessment = {
|
124
136
|
decision: cacheEntry.decision,
|
125
|
-
|
137
|
+
metafile: await getCachedTorrentFile(cacheEntry.info_hash),
|
126
138
|
};
|
127
139
|
}
|
128
140
|
else if (cacheEntry.decision === Decision.MATCH) {
|
@@ -134,8 +146,12 @@ async function assessCandidateCaching(candidate, searchee, infoHashesToExclude)
|
|
134
146
|
assessment = { decision: cacheEntry.decision };
|
135
147
|
logReason(cacheEntry.decision, true);
|
136
148
|
}
|
137
|
-
|
138
|
-
|
149
|
+
// if previously known
|
150
|
+
if (cacheEntry) {
|
151
|
+
await db("decision")
|
152
|
+
.where({ id: cacheEntry.id })
|
153
|
+
.update({ last_seen: Date.now() });
|
154
|
+
}
|
139
155
|
return assessment;
|
140
156
|
}
|
141
157
|
export { assessCandidateCaching as assessCandidate };
|
package/dist/decide.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"decide.js","sourceRoot":"","sources":["../src/decide.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AAC/C,OAAO,YAA0B,MAAM,eAAe,CAAC;AACvD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAChE,OAAO,
|
1
|
+
{"version":3,"file":"decide.js","sourceRoot":"","sources":["../src/decide.ts"],"names":[],"mappings":"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"}
|
package/dist/errors.js
CHANGED
@@ -8,4 +8,12 @@ export class CrossSeedError extends Error {
|
|
8
8
|
logger.error(this.message);
|
9
9
|
}
|
10
10
|
}
|
11
|
+
export function exitOnCrossSeedErrors(e) {
|
12
|
+
if (e instanceof CrossSeedError) {
|
13
|
+
e.print();
|
14
|
+
process.exitCode = 1;
|
15
|
+
return;
|
16
|
+
}
|
17
|
+
throw e;
|
18
|
+
}
|
11
19
|
//# sourceMappingURL=errors.js.map
|
package/dist/errors.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,cAAe,SAAQ,KAAK;IACxC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,KAAK;QACJ,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;CACD"}
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,OAAO,cAAe,SAAQ,KAAK;IACxC,YAAY,OAAe;QAC1B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,OAAO,IAAI,CAAC,KAAK,CAAC;IACnB,CAAC;IAED,KAAK;QACJ,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;CACD;AAED,MAAM,UAAU,qBAAqB,CAAC,CAAC;IACtC,IAAI,CAAC,YAAY,cAAc,EAAE;QAChC,CAAC,CAAC,KAAK,EAAE,CAAC;QACV,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;KACP;IACD,MAAM,CAAC,CAAC;AACT,CAAC"}
|
package/dist/jobs.js
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
import ms from "ms";
|
2
|
+
import { db } from "./db.js";
|
3
|
+
import { main, scanRssFeeds } from "./pipeline.js";
|
4
|
+
import { exitOnCrossSeedErrors } from "./errors.js";
|
5
|
+
import { Label, logger } from "./logger.js";
|
6
|
+
import { getRuntimeConfig } from "./runtimeConfig.js";
|
7
|
+
class Job {
|
8
|
+
constructor(name, cadence, exec) {
|
9
|
+
this.name = name;
|
10
|
+
this.cadence = cadence;
|
11
|
+
this.exec = exec;
|
12
|
+
this.isActive = false;
|
13
|
+
}
|
14
|
+
async run() {
|
15
|
+
if (!this.isActive) {
|
16
|
+
this.isActive = true;
|
17
|
+
try {
|
18
|
+
logger.info({
|
19
|
+
label: Label.SCHEDULER,
|
20
|
+
message: `starting job: ${this.name}`,
|
21
|
+
});
|
22
|
+
await this.exec();
|
23
|
+
}
|
24
|
+
finally {
|
25
|
+
this.isActive = false;
|
26
|
+
}
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
30
|
+
const getJobs = () => {
|
31
|
+
const { rssCadence, searchCadence } = getRuntimeConfig();
|
32
|
+
return [
|
33
|
+
rssCadence && new Job("rss", rssCadence, scanRssFeeds),
|
34
|
+
searchCadence && new Job("search", searchCadence, main),
|
35
|
+
].filter(Boolean);
|
36
|
+
};
|
37
|
+
export async function jobsLoop() {
|
38
|
+
const jobs = getJobs();
|
39
|
+
async function loop() {
|
40
|
+
var _a;
|
41
|
+
const now = Date.now();
|
42
|
+
for (const job of jobs) {
|
43
|
+
const lastRun = (_a = (await db("job_log")
|
44
|
+
.select("last_run")
|
45
|
+
.where({ name: job.name })
|
46
|
+
.first())) === null || _a === void 0 ? void 0 : _a.last_run;
|
47
|
+
// if it's never been run, you are eligible immediately
|
48
|
+
const eligibilityTs = lastRun ? lastRun + job.cadence : now;
|
49
|
+
const lastRunStr = lastRun ? `${ms(now - lastRun)} ago` : "never";
|
50
|
+
const nextRunStr = ms(eligibilityTs - now);
|
51
|
+
logger.verbose({
|
52
|
+
label: Label.SCHEDULER,
|
53
|
+
message: `${job.name}: last run ${lastRunStr}, next run in ${nextRunStr}`,
|
54
|
+
});
|
55
|
+
if (now >= eligibilityTs) {
|
56
|
+
job.run()
|
57
|
+
.then(async () => {
|
58
|
+
// upon success, update the log
|
59
|
+
await db("job_log")
|
60
|
+
.insert({ name: job.name, last_run: now })
|
61
|
+
.onConflict("name")
|
62
|
+
.merge();
|
63
|
+
})
|
64
|
+
.catch(exitOnCrossSeedErrors)
|
65
|
+
.catch((e) => void logger.error(e));
|
66
|
+
}
|
67
|
+
}
|
68
|
+
}
|
69
|
+
const interval = setInterval(loop, ms("1 minute"));
|
70
|
+
loop();
|
71
|
+
return () => clearInterval(interval);
|
72
|
+
}
|
73
|
+
//# sourceMappingURL=jobs.js.map
|
package/dist/jobs.js.map
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"jobs.js","sourceRoot":"","sources":["../src/jobs.ts"],"names":[],"mappings":"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"}
|
package/dist/logger.js
CHANGED
@@ -10,10 +10,14 @@ export var Label;
|
|
10
10
|
Label["DECIDE"] = "decide";
|
11
11
|
Label["PREFILTER"] = "prefilter";
|
12
12
|
Label["CONFIGDUMP"] = "configdump";
|
13
|
-
Label["JACKETT"] = "jackett";
|
14
13
|
Label["TORZNAB"] = "torznab";
|
15
14
|
Label["SERVER"] = "server";
|
16
15
|
Label["STARTUP"] = "startup";
|
16
|
+
Label["SCHEDULER"] = "scheduler";
|
17
|
+
Label["SEARCH"] = "search";
|
18
|
+
Label["RSS"] = "rss";
|
19
|
+
Label["PERF"] = "perf";
|
20
|
+
Label["REVERSE_LOOKUP"] = "reverselookup";
|
17
21
|
})(Label = Label || (Label = {}));
|
18
22
|
export let logger;
|
19
23
|
const redactionMsg = "[REDACTED]";
|
@@ -36,7 +40,7 @@ function redactUrlPassword(message, urlStr) {
|
|
36
40
|
}
|
37
41
|
function redactMessage(message) {
|
38
42
|
const runtimeConfig = getRuntimeConfig();
|
39
|
-
|
43
|
+
// redact torznab api keys
|
40
44
|
message = message.replace(/apikey=[a-zA-Z0-9]+/g, `apikey=${redactionMsg}`);
|
41
45
|
for (const [key, urlStr] of Object.entries(runtimeConfig)) {
|
42
46
|
if (key.endsWith("Url") && urlStr) {
|
package/dist/logger.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,eAAe,MAAM,2BAA2B,CAAC;AAExD,MAAM,CAAN,IAAY,
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../src/logger.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,75 @@
|
|
1
|
+
import { uniqBy } from "lodash-es";
|
2
|
+
import { getCacheFileData, renameCacheFile } from "../cache.js";
|
3
|
+
async function up(knex) {
|
4
|
+
await knex.schema.createTable("searchee", (table) => {
|
5
|
+
table.increments("id").primary();
|
6
|
+
table.string("name").unique();
|
7
|
+
table.integer("first_searched");
|
8
|
+
table.integer("last_searched");
|
9
|
+
});
|
10
|
+
await knex.schema.createTable("decision", (table) => {
|
11
|
+
table.increments("id").primary();
|
12
|
+
table.integer("searchee_id").references("id").inTable("searchee");
|
13
|
+
table.string("guid");
|
14
|
+
table.string("info_hash");
|
15
|
+
table.string("decision");
|
16
|
+
table.integer("first_seen");
|
17
|
+
table.integer("last_seen");
|
18
|
+
});
|
19
|
+
await knex.schema.createTable("torrent", (table) => {
|
20
|
+
table.increments("id").primary();
|
21
|
+
table.string("info_hash");
|
22
|
+
table.string("name");
|
23
|
+
table.string("file_path").unique();
|
24
|
+
});
|
25
|
+
const cacheData = await getCacheFileData();
|
26
|
+
if (!cacheData)
|
27
|
+
return;
|
28
|
+
await knex.transaction(async (trx) => {
|
29
|
+
const chunkSize = 100;
|
30
|
+
const searcheeRows = Object.entries(cacheData.searchees).map(([name, { firstSearched, lastSearched }]) => ({
|
31
|
+
name,
|
32
|
+
first_searched: firstSearched,
|
33
|
+
last_searched: lastSearched,
|
34
|
+
}));
|
35
|
+
await trx.batchInsert("searchee", searcheeRows, chunkSize);
|
36
|
+
const dbSearchees = await trx.select("*").from("searchee");
|
37
|
+
const normalizedDecisions = Object.entries(cacheData.decisions).flatMap(([searcheeName, results]) => Object.entries(results).flatMap(([guid, decisionEntry]) => {
|
38
|
+
// searchee may not exist if cache contains decisions
|
39
|
+
// from early versions of the cache
|
40
|
+
const searchee = dbSearchees.find((searchee) => searchee.name === searcheeName);
|
41
|
+
return searchee
|
42
|
+
? [
|
43
|
+
{
|
44
|
+
searchee_id: searchee.id,
|
45
|
+
guid,
|
46
|
+
decision: decisionEntry.decision,
|
47
|
+
last_seen: decisionEntry.lastSeen,
|
48
|
+
first_seen: decisionEntry.firstSeen,
|
49
|
+
info_hash: decisionEntry.infoHash,
|
50
|
+
},
|
51
|
+
]
|
52
|
+
: [];
|
53
|
+
}));
|
54
|
+
const torrentRows = uniqBy(cacheData.indexedTorrents, "file_path").map((e) => ({
|
55
|
+
info_hash: e.infoHash,
|
56
|
+
name: e.name,
|
57
|
+
file_path: e.filepath,
|
58
|
+
}));
|
59
|
+
await trx.batchInsert("decision", normalizedDecisions, chunkSize);
|
60
|
+
await trx.batchInsert("torrent", torrentRows, chunkSize);
|
61
|
+
});
|
62
|
+
await renameCacheFile();
|
63
|
+
}
|
64
|
+
async function down(knex) {
|
65
|
+
await knex.schema.dropTable("searchee");
|
66
|
+
await knex.schema.dropTable("decision");
|
67
|
+
await knex.schema.dropTable("torrent");
|
68
|
+
}
|
69
|
+
export default {
|
70
|
+
name: "00-initialSchema",
|
71
|
+
up,
|
72
|
+
down,
|
73
|
+
config: { transaction: true },
|
74
|
+
};
|
75
|
+
//# sourceMappingURL=00-initialSchema.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"00-initialSchema.js","sourceRoot":"","sources":["../../src/migrations/00-initialSchema.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { join } from "path";
|
2
|
+
import { appDir } from "../configuration.js";
|
3
|
+
async function up(knex) {
|
4
|
+
const connection = await knex.client.acquireConnection();
|
5
|
+
await connection.backup(join(appDir(), "cross-seed.pre-jobs.backup.db"));
|
6
|
+
await knex.client.releaseConnection(connection);
|
7
|
+
await knex.schema.createTable("job_log", (table) => {
|
8
|
+
table.increments("id").primary();
|
9
|
+
table.string("name").unique();
|
10
|
+
table.integer("last_run");
|
11
|
+
});
|
12
|
+
}
|
13
|
+
async function down(knex) {
|
14
|
+
await knex.schema.dropTable("job_log");
|
15
|
+
}
|
16
|
+
export default { name: "01-jobs", up, down };
|
17
|
+
//# sourceMappingURL=01-jobs.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"01-jobs.js","sourceRoot":"","sources":["../../src/migrations/01-jobs.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,KAAK,UAAU,EAAE,CAAC,IAAe;IAChC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;IACzD,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,+BAA+B,CAAC,CAAC,CAAC;IACzE,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAEhD,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE;QAClD,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACjC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,CAAC;QAC9B,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAe;IAClC,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;AACxC,CAAC;AAED,eAAe,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC"}
|
@@ -0,0 +1,9 @@
|
|
1
|
+
import initialSchema from "./00-initialSchema.js";
|
2
|
+
import jobs from "./01-jobs.js";
|
3
|
+
// The first step of any migration should be to back up the database.
|
4
|
+
export const migrations = {
|
5
|
+
getMigrations: () => Promise.resolve([initialSchema, jobs]),
|
6
|
+
getMigrationName: (migration) => migration.name,
|
7
|
+
getMigration: (migration) => migration,
|
8
|
+
};
|
9
|
+
//# sourceMappingURL=migrations.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"migrations.js","sourceRoot":"","sources":["../../src/migrations/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,MAAM,uBAAuB,CAAC;AAClD,OAAO,IAAI,MAAM,cAAc,CAAC;AAEhC,qEAAqE;AAErE,MAAM,CAAC,MAAM,UAAU,GAAG;IACzB,aAAa,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,CAAC;IAC3D,gBAAgB,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI;IAC/C,YAAY,EAAE,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS;CACtC,CAAC"}
|