tor-dl 1.0.4 → 1.0.5
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 +2 -2
- package/dist/cli/display.d.ts.map +1 -1
- package/dist/cli/display.js +4 -3
- package/dist/cli/display.js.map +1 -1
- package/dist/cli/parser.js +4 -4
- package/dist/cli/parser.js.map +1 -1
- package/dist/commands/search.d.ts.map +1 -1
- package/dist/commands/search.js +10 -0
- package/dist/commands/search.js.map +1 -1
- package/package.json +1 -1
- package/src/cli/display.ts +5 -3
- package/src/cli/parser.ts +117 -117
- package/src/commands/search.ts +13 -0
package/README.md
CHANGED
|
@@ -36,7 +36,7 @@ tor-dl search <query> [options]
|
|
|
36
36
|
| `-o, --sort <field>` | Sort results by field | `seeds`, `size`, `date` |
|
|
37
37
|
| `--order <order>` | Sort order | `asc` (low to high), `desc` (high to low) |
|
|
38
38
|
| `-l, --limit <number>` | Maximum results to return | `10`, `50`, `100` |
|
|
39
|
-
|
|
|
39
|
+
| `-S, --sources <sources>` | Sources to search (comma-separated) | `yts,thepiratebay,nyaa` |
|
|
40
40
|
|
|
41
41
|
**Available Categories:**
|
|
42
42
|
- `all` - Search all categories
|
|
@@ -66,7 +66,7 @@ tor-dl search "movie" --cat movie --min-seeds 100
|
|
|
66
66
|
tor-dl search "linux" --min-size 500MB --max-size 2GB
|
|
67
67
|
|
|
68
68
|
# Search specific sources only
|
|
69
|
-
tor-dl search "game"
|
|
69
|
+
tor-dl search "game" -S yts,thepiratebay
|
|
70
70
|
|
|
71
71
|
# Sort by size (smallest first)
|
|
72
72
|
tor-dl search "documentary" --sort size --order asc
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/cli/display.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"display.d.ts","sourceRoot":"","sources":["../../src/cli/display.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQzC,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI,CAmC7D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,IAAI,CAYhE;AAED,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAElD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEpD;AAED,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAEjD"}
|
package/dist/cli/display.js
CHANGED
|
@@ -31,15 +31,16 @@ function displayResults(results) {
|
|
|
31
31
|
const peers = r.peers > 50 ? chalk_1.default.cyan(r.peers.toString().padStart(5)) : r.peers.toString().padStart(5);
|
|
32
32
|
const source = (r.source || 'unknown').slice(0, 6).padEnd(6);
|
|
33
33
|
const num = chalk_1.default.cyan(r.num.toString().padStart(3));
|
|
34
|
-
const link = r.torrentUrl || r.magnet ? chalk_1.default.green('✓') : ' ';
|
|
35
34
|
const url = r.torrentUrl || r.magnet || '';
|
|
35
|
+
const pageUrl = r.url || '';
|
|
36
36
|
const clickableName = url ? makeClickable(url, name.padEnd(38)) : name.padEnd(38);
|
|
37
|
-
|
|
37
|
+
const clickableLink = pageUrl ? makeClickable(pageUrl, chalk_1.default.green('✓')) : chalk_1.default.gray(' ');
|
|
38
|
+
out(`│ ${num} │ ${clickableLink} │ ${clickableName} │ ${size} │ ${seeds} │ ${peers} │ ${source} │`);
|
|
38
39
|
}
|
|
39
40
|
out('├─────┼───┼────────────────────────────────────────┼────────┼───────┼───────┼────────┤');
|
|
40
41
|
out('└─────┴───┴────────────────────────────────────────┴────────┴───────┴───────┴────────┘');
|
|
41
42
|
out('');
|
|
42
|
-
out(chalk_1.default.gray('
|
|
43
|
+
out(chalk_1.default.gray('Click name = open magnet/torrent | Click ✓ = open source page'));
|
|
43
44
|
}
|
|
44
45
|
function displayResultDetails(result) {
|
|
45
46
|
console.log(chalk_1.default.bold('\n--- Torrent Details ---'));
|
package/dist/cli/display.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/cli/display.ts"],"names":[],"mappings":";;;;;AASA,
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/cli/display.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/parser.js
CHANGED
|
@@ -65,9 +65,9 @@ function loadFilters() {
|
|
|
65
65
|
function createParser() {
|
|
66
66
|
const program = new commander_1.Command();
|
|
67
67
|
const filters = loadFilters();
|
|
68
|
-
const mainHelp = `
|
|
69
|
-
Categories: all, movie, tv, anime, music, games, apps
|
|
70
|
-
Sources:
|
|
68
|
+
const mainHelp = `
|
|
69
|
+
Categories: all, movie, tv, anime, music, games, apps
|
|
70
|
+
Sources:
|
|
71
71
|
yts - YTS (Movies) | eztv - EZTV (TV) | thepiratebay - The Pirate Bay | nyaa - Nyaa.si (Anime)`;
|
|
72
72
|
program
|
|
73
73
|
.name('tor-dl')
|
|
@@ -86,7 +86,7 @@ Sources:
|
|
|
86
86
|
.option('-o, --sort <sortBy>', 'Sort by (seeds|size|date)')
|
|
87
87
|
.option('--order <order>', 'Order (asc|desc)')
|
|
88
88
|
.option('-l, --limit <number>', 'Max results (default: 50)', parseInt)
|
|
89
|
-
.option('--sources <sources>', 'Sources (yts,eztv,thepiratebay,nyaa)')
|
|
89
|
+
.option('-S, --sources <sources>', 'Sources (yts,eztv,thepiratebay,nyaa)')
|
|
90
90
|
.option('-h, --help', 'Show help with examples')
|
|
91
91
|
.allowUnknownOption()
|
|
92
92
|
.hook('preAction', (thisCommand) => {
|
package/dist/cli/parser.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/cli/parser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,kCAcC;AAED,oCAuFC;AArHD,yCAAoC;AACpC,2BAA8C;AAC9C,+BAA4B;AAG5B,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACrF,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAgB,WAAW;IACzB,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY;IAC1B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAE9B,MAAM,QAAQ,GAAG;;;iGAG8E,CAAC;IAEhG,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,sEAAsE,GAAG,QAAQ,CAAC;SAC9F,OAAO,CAAC,UAAU,EAAE,EAAE,eAAe,CAAC;SACtC,kBAAkB,EAAE;SACpB,wBAAwB,EAAE,CAAC;IAE9B,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,sFAAsF,CAAC;SACnG,MAAM,CAAC,sBAAsB,EAAE,gDAAgD,CAAC;SAChF,MAAM,CAAC,0BAA0B,EAAE,iBAAiB,EAAE,QAAQ,CAAC;SAC/D,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,QAAQ,CAAC;SAC3D,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,CAAC;SACzD,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;SAClD,MAAM,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,sBAAsB,EAAE,2BAA2B,EAAE,QAAQ,CAAC;SACrE,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/cli/parser.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAcA,kCAcC;AAED,oCAuFC;AArHD,yCAAoC;AACpC,2BAA8C;AAC9C,+BAA4B;AAG5B,SAAS,UAAU;IACjB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,IAAA,WAAI,EAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC;QACrF,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,SAAgB,WAAW;IACzB,MAAM,WAAW,GAAG,IAAA,WAAI,EAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,IAAA,eAAU,EAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO;QACL,QAAQ,EAAE,KAAK;QACf,QAAQ,EAAE,CAAC;QACX,OAAO,EAAE,GAAG;QACZ,OAAO,EAAE,MAAM;QACf,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,EAAE;KACV,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY;IAC1B,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;IAE9B,MAAM,QAAQ,GAAG;;;iGAG8E,CAAC;IAEhG,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,sEAAsE,GAAG,QAAQ,CAAC;SAC9F,OAAO,CAAC,UAAU,EAAE,EAAE,eAAe,CAAC;SACtC,kBAAkB,EAAE;SACpB,wBAAwB,EAAE,CAAC;IAE9B,OAAO;SACJ,OAAO,CAAC,gBAAgB,CAAC;SACzB,WAAW,CAAC,sFAAsF,CAAC;SACnG,MAAM,CAAC,sBAAsB,EAAE,gDAAgD,CAAC;SAChF,MAAM,CAAC,0BAA0B,EAAE,iBAAiB,EAAE,QAAQ,CAAC;SAC/D,MAAM,CAAC,sBAAsB,EAAE,iBAAiB,EAAE,QAAQ,CAAC;SAC3D,MAAM,CAAC,mBAAmB,EAAE,4BAA4B,CAAC;SACzD,MAAM,CAAC,mBAAmB,EAAE,qBAAqB,CAAC;SAClD,MAAM,CAAC,qBAAqB,EAAE,2BAA2B,CAAC;SAC1D,MAAM,CAAC,iBAAiB,EAAE,kBAAkB,CAAC;SAC7C,MAAM,CAAC,sBAAsB,EAAE,2BAA2B,EAAE,QAAQ,CAAC;SACrE,MAAM,CAAC,yBAAyB,EAAE,sCAAsC,CAAC;SACzE,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC;SAC/C,kBAAkB,EAAE;SACpB,IAAI,CAAC,WAAW,EAAE,CAAC,WAAW,EAAE,EAAE;QACjC,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACjD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;YACxC,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC;YACvD,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;YACrE,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;YAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC;SACD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAAO,EAAE,EAAE;QAEvC,MAAM,aAAa,GAAkB;YACnC,KAAK;YACL,QAAQ,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,QAAQ;YACzC,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ;YAC9C,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO;YAC3C,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO;YAC3C,MAAM,EAAG,OAAO,CAAC,IAAkC,IAAI,OAAO,CAAC,MAAM;YACrE,KAAK,EAAG,OAAO,CAAC,KAAwB,IAAI,OAAO,CAAC,KAAK;YACzD,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK;YACrC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;SAClE,CAAC;QAEF,MAAM,EAAE,aAAa,EAAE,GAAG,wDAAa,oBAAoB,GAAC,CAAC;QAC7D,MAAM,aAAa,CAAC,aAAa,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IAEL,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACnE,OAAO,CAAC,WAAW,CAAC,sDAAsD,CAAC,CAAC;IAC5E,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QACtC,MAAM,EAAE,aAAa,EAAE,GAAG,wDAAa,sBAAsB,GAAC,CAAC;QAC/D,MAAM,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,CAAC,WAAW,CAAC,sDAAsD,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAc,EAAE,EAAE;QACnC,MAAM,EAAE,aAAa,EAAE,GAAG,wDAAa,sBAAsB,GAAC,CAAC;QAC/D,MAAM,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE;QAC3B,OAAO,CAAC,KAAK,CAAC,mEAAmE,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAC;AAoCxD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAiB,MAAM,UAAU,CAAC;AAoCxD,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA2DzE"}
|
package/dist/commands/search.js
CHANGED
|
@@ -39,9 +39,19 @@ function displaySearchInfo(options, sources) {
|
|
|
39
39
|
async function searchCommand(options) {
|
|
40
40
|
const spinner = (0, ora_1.default)('Searching torrent sources...').start();
|
|
41
41
|
let sources = (0, registry_1.getEnabledSources)();
|
|
42
|
+
const validSourceNames = sources.map(s => s.name.toLowerCase());
|
|
42
43
|
if (options.sources && options.sources.length > 0) {
|
|
43
44
|
const requested = options.sources.map(s => s.toLowerCase());
|
|
45
|
+
const unknownSources = requested.filter(s => !validSourceNames.includes(s));
|
|
46
|
+
if (unknownSources.length > 0) {
|
|
47
|
+
spinner.warn(chalk_1.default.yellow(`Unknown sources: ${unknownSources.join(', ')}. Available: ${validSourceNames.join(', ')}`));
|
|
48
|
+
}
|
|
44
49
|
sources = sources.filter(s => requested.includes(s.name.toLowerCase()));
|
|
50
|
+
if (sources.length === 0) {
|
|
51
|
+
spinner.fail('No valid sources selected. Use --sources with valid names.');
|
|
52
|
+
console.log(chalk_1.default.cyan('\nAvailable sources:'), validSourceNames.join(', '));
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
45
55
|
}
|
|
46
56
|
const allResults = [];
|
|
47
57
|
for (const source of sources) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":";;;;;AAsCA,
|
|
1
|
+
{"version":3,"file":"search.js","sourceRoot":"","sources":["../../src/commands/search.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/cli/display.ts
CHANGED
|
@@ -28,18 +28,20 @@ export function displayResults(results: TorrentResult[]): void {
|
|
|
28
28
|
const peers = r.peers > 50 ? chalk.cyan(r.peers.toString().padStart(5)) : r.peers.toString().padStart(5);
|
|
29
29
|
const source = (r.source || 'unknown').slice(0, 6).padEnd(6);
|
|
30
30
|
const num = chalk.cyan(r.num.toString().padStart(3));
|
|
31
|
-
const link = r.torrentUrl || r.magnet ? chalk.green('✓') : ' ';
|
|
32
31
|
|
|
33
32
|
const url = r.torrentUrl || r.magnet || '';
|
|
33
|
+
const pageUrl = r.url || '';
|
|
34
|
+
|
|
34
35
|
const clickableName = url ? makeClickable(url, name.padEnd(38)) : name.padEnd(38);
|
|
36
|
+
const clickableLink = pageUrl ? makeClickable(pageUrl, chalk.green('✓')) : chalk.gray(' ');
|
|
35
37
|
|
|
36
|
-
out(`│ ${num} │ ${
|
|
38
|
+
out(`│ ${num} │ ${clickableLink} │ ${clickableName} │ ${size} │ ${seeds} │ ${peers} │ ${source} │`);
|
|
37
39
|
}
|
|
38
40
|
|
|
39
41
|
out('├─────┼───┼────────────────────────────────────────┼────────┼───────┼───────┼────────┤');
|
|
40
42
|
out('└─────┴───┴────────────────────────────────────────┴────────┴───────┴───────┴────────┘');
|
|
41
43
|
out('');
|
|
42
|
-
out(chalk.gray('
|
|
44
|
+
out(chalk.gray('Click name = open magnet/torrent | Click ✓ = open source page'));
|
|
43
45
|
}
|
|
44
46
|
|
|
45
47
|
export function displayResultDetails(result: TorrentResult): void {
|
package/src/cli/parser.ts
CHANGED
|
@@ -1,118 +1,118 @@
|
|
|
1
|
-
import { Command } from 'commander';
|
|
2
|
-
import { readFileSync, existsSync } from 'fs';
|
|
3
|
-
import { join } from 'path';
|
|
4
|
-
import { FilterConfig, SearchOptions } from '../types';
|
|
5
|
-
|
|
6
|
-
function getVersion(): string {
|
|
7
|
-
try {
|
|
8
|
-
const pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));
|
|
9
|
-
return pkg.version || '1.0.0';
|
|
10
|
-
} catch {
|
|
11
|
-
return '1.0.0';
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export function loadFilters(): FilterConfig {
|
|
16
|
-
const filtersPath = join(process.cwd(), 'filters.json');
|
|
17
|
-
if (existsSync(filtersPath)) {
|
|
18
|
-
return JSON.parse(readFileSync(filtersPath, 'utf-8'));
|
|
19
|
-
}
|
|
20
|
-
return {
|
|
21
|
-
category: 'all',
|
|
22
|
-
minSeeds: 0,
|
|
23
|
-
minSize: '0',
|
|
24
|
-
maxSize: '50GB',
|
|
25
|
-
sortBy: 'seeds',
|
|
26
|
-
order: 'desc',
|
|
27
|
-
limit: 50
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function createParser(): Command {
|
|
32
|
-
const program = new Command();
|
|
33
|
-
const filters = loadFilters();
|
|
34
|
-
|
|
35
|
-
const mainHelp = `
|
|
36
|
-
Categories: all, movie, tv, anime, music, games, apps
|
|
37
|
-
Sources:
|
|
38
|
-
yts - YTS (Movies) | eztv - EZTV (TV) | thepiratebay - The Pirate Bay | nyaa - Nyaa.si (Anime)`;
|
|
39
|
-
|
|
40
|
-
program
|
|
41
|
-
.name('tor-dl')
|
|
42
|
-
.description('CLI torrent search tool - search, open in browser, copy magnet links' + mainHelp)
|
|
43
|
-
.version(getVersion(), '-v, --version')
|
|
44
|
-
.showHelpAfterError()
|
|
45
|
-
.showSuggestionAfterError();
|
|
46
|
-
|
|
47
|
-
program
|
|
48
|
-
.command('search <query>')
|
|
49
|
-
.description('Search for torrents. Use -h after search term for examples: tor-dl search "movie" -h')
|
|
50
|
-
.option('-c, --cat <category>', 'Category (all|movie|tv|anime|music|games|apps)')
|
|
51
|
-
.option('-s, --min-seeds <number>', 'Minimum seeders', parseInt)
|
|
52
|
-
.option('--max-seeds <number>', 'Maximum seeders', parseInt)
|
|
53
|
-
.option('--min-size <size>', 'Min size (e.g. 500MB, 1GB)')
|
|
54
|
-
.option('--max-size <size>', 'Max size (e.g. 5GB)')
|
|
55
|
-
.option('-o, --sort <sortBy>', 'Sort by (seeds|size|date)')
|
|
56
|
-
.option('--order <order>', 'Order (asc|desc)')
|
|
57
|
-
.option('-l, --limit <number>', 'Max results (default: 50)', parseInt)
|
|
58
|
-
.option('--sources <sources>', 'Sources (yts,eztv,thepiratebay,nyaa)')
|
|
59
|
-
.option('-h, --help', 'Show help with examples')
|
|
60
|
-
.allowUnknownOption()
|
|
61
|
-
.hook('preAction', (thisCommand) => {
|
|
62
|
-
const opts = thisCommand.opts();
|
|
63
|
-
if (opts.help || thisCommand.args.includes('-h')) {
|
|
64
|
-
console.log('');
|
|
65
|
-
console.log('Categories: all, movie, tv, anime, music, games, apps');
|
|
66
|
-
console.log('Sources:');
|
|
67
|
-
console.log(' yts - YTS (Movies)');
|
|
68
|
-
console.log(' eztv - EZTV (TV)');
|
|
69
|
-
console.log(' thepiratebay - The Pirate Bay');
|
|
70
|
-
console.log(' nyaa - Nyaa.si (Anime)');
|
|
71
|
-
console.log('');
|
|
72
|
-
console.log('Examples:');
|
|
73
|
-
console.log(' tor-dl search "movie" -c movie -s 100');
|
|
74
|
-
console.log(' tor-dl search "anime" --sources nyaa --max-size 2GB');
|
|
75
|
-
console.log(' tor-dl search "linux" --min-size 500MB -l 10');
|
|
76
|
-
process.exit(0);
|
|
77
|
-
}
|
|
78
|
-
})
|
|
79
|
-
.action(async (query: string, options) => {
|
|
80
|
-
|
|
81
|
-
const searchOptions: SearchOptions = {
|
|
82
|
-
query,
|
|
83
|
-
category: options.cat || filters.category,
|
|
84
|
-
minSeeds: options.minSeeds ?? filters.minSeeds,
|
|
85
|
-
maxSeeds: options.maxSeeds,
|
|
86
|
-
minSize: options.minSize || filters.minSize,
|
|
87
|
-
maxSize: options.maxSize || filters.maxSize,
|
|
88
|
-
sortBy: (options.sort as 'seeds' | 'size' | 'date') || filters.sortBy,
|
|
89
|
-
order: (options.order as 'asc' | 'desc') || filters.order,
|
|
90
|
-
limit: options.limit || filters.limit,
|
|
91
|
-
sources: options.sources ? options.sources.split(',') : undefined
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
const { searchCommand } = await import('../commands/search');
|
|
95
|
-
await searchCommand(searchOptions);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
const openCmd = program.command('open <number>', { hidden: true });
|
|
99
|
-
openCmd.description('Open .torrent in browser or copy magnet to clipboard');
|
|
100
|
-
openCmd.action(async (number: string) => {
|
|
101
|
-
const { openInBrowser } = await import('../commands/download');
|
|
102
|
-
await openInBrowser(parseInt(number));
|
|
103
|
-
});
|
|
104
|
-
|
|
105
|
-
const oCmd = program.command('o <number>');
|
|
106
|
-
oCmd.description('Open .torrent in browser or copy magnet to clipboard');
|
|
107
|
-
oCmd.action(async (number: string) => {
|
|
108
|
-
const { openInBrowser } = await import('../commands/download');
|
|
109
|
-
await openInBrowser(parseInt(number));
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
program.on('command:*', () => {
|
|
113
|
-
console.error('Invalid command: %s\nSee --help for a list of available commands.', program.args[0]);
|
|
114
|
-
process.exit(1);
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
return program;
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { readFileSync, existsSync } from 'fs';
|
|
3
|
+
import { join } from 'path';
|
|
4
|
+
import { FilterConfig, SearchOptions } from '../types';
|
|
5
|
+
|
|
6
|
+
function getVersion(): string {
|
|
7
|
+
try {
|
|
8
|
+
const pkg = JSON.parse(readFileSync(join(__dirname, '../../package.json'), 'utf-8'));
|
|
9
|
+
return pkg.version || '1.0.0';
|
|
10
|
+
} catch {
|
|
11
|
+
return '1.0.0';
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function loadFilters(): FilterConfig {
|
|
16
|
+
const filtersPath = join(process.cwd(), 'filters.json');
|
|
17
|
+
if (existsSync(filtersPath)) {
|
|
18
|
+
return JSON.parse(readFileSync(filtersPath, 'utf-8'));
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
category: 'all',
|
|
22
|
+
minSeeds: 0,
|
|
23
|
+
minSize: '0',
|
|
24
|
+
maxSize: '50GB',
|
|
25
|
+
sortBy: 'seeds',
|
|
26
|
+
order: 'desc',
|
|
27
|
+
limit: 50
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function createParser(): Command {
|
|
32
|
+
const program = new Command();
|
|
33
|
+
const filters = loadFilters();
|
|
34
|
+
|
|
35
|
+
const mainHelp = `
|
|
36
|
+
Categories: all, movie, tv, anime, music, games, apps
|
|
37
|
+
Sources:
|
|
38
|
+
yts - YTS (Movies) | eztv - EZTV (TV) | thepiratebay - The Pirate Bay | nyaa - Nyaa.si (Anime)`;
|
|
39
|
+
|
|
40
|
+
program
|
|
41
|
+
.name('tor-dl')
|
|
42
|
+
.description('CLI torrent search tool - search, open in browser, copy magnet links' + mainHelp)
|
|
43
|
+
.version(getVersion(), '-v, --version')
|
|
44
|
+
.showHelpAfterError()
|
|
45
|
+
.showSuggestionAfterError();
|
|
46
|
+
|
|
47
|
+
program
|
|
48
|
+
.command('search <query>')
|
|
49
|
+
.description('Search for torrents. Use -h after search term for examples: tor-dl search "movie" -h')
|
|
50
|
+
.option('-c, --cat <category>', 'Category (all|movie|tv|anime|music|games|apps)')
|
|
51
|
+
.option('-s, --min-seeds <number>', 'Minimum seeders', parseInt)
|
|
52
|
+
.option('--max-seeds <number>', 'Maximum seeders', parseInt)
|
|
53
|
+
.option('--min-size <size>', 'Min size (e.g. 500MB, 1GB)')
|
|
54
|
+
.option('--max-size <size>', 'Max size (e.g. 5GB)')
|
|
55
|
+
.option('-o, --sort <sortBy>', 'Sort by (seeds|size|date)')
|
|
56
|
+
.option('--order <order>', 'Order (asc|desc)')
|
|
57
|
+
.option('-l, --limit <number>', 'Max results (default: 50)', parseInt)
|
|
58
|
+
.option('-S, --sources <sources>', 'Sources (yts,eztv,thepiratebay,nyaa)')
|
|
59
|
+
.option('-h, --help', 'Show help with examples')
|
|
60
|
+
.allowUnknownOption()
|
|
61
|
+
.hook('preAction', (thisCommand) => {
|
|
62
|
+
const opts = thisCommand.opts();
|
|
63
|
+
if (opts.help || thisCommand.args.includes('-h')) {
|
|
64
|
+
console.log('');
|
|
65
|
+
console.log('Categories: all, movie, tv, anime, music, games, apps');
|
|
66
|
+
console.log('Sources:');
|
|
67
|
+
console.log(' yts - YTS (Movies)');
|
|
68
|
+
console.log(' eztv - EZTV (TV)');
|
|
69
|
+
console.log(' thepiratebay - The Pirate Bay');
|
|
70
|
+
console.log(' nyaa - Nyaa.si (Anime)');
|
|
71
|
+
console.log('');
|
|
72
|
+
console.log('Examples:');
|
|
73
|
+
console.log(' tor-dl search "movie" -c movie -s 100');
|
|
74
|
+
console.log(' tor-dl search "anime" --sources nyaa --max-size 2GB');
|
|
75
|
+
console.log(' tor-dl search "linux" --min-size 500MB -l 10');
|
|
76
|
+
process.exit(0);
|
|
77
|
+
}
|
|
78
|
+
})
|
|
79
|
+
.action(async (query: string, options) => {
|
|
80
|
+
|
|
81
|
+
const searchOptions: SearchOptions = {
|
|
82
|
+
query,
|
|
83
|
+
category: options.cat || filters.category,
|
|
84
|
+
minSeeds: options.minSeeds ?? filters.minSeeds,
|
|
85
|
+
maxSeeds: options.maxSeeds,
|
|
86
|
+
minSize: options.minSize || filters.minSize,
|
|
87
|
+
maxSize: options.maxSize || filters.maxSize,
|
|
88
|
+
sortBy: (options.sort as 'seeds' | 'size' | 'date') || filters.sortBy,
|
|
89
|
+
order: (options.order as 'asc' | 'desc') || filters.order,
|
|
90
|
+
limit: options.limit || filters.limit,
|
|
91
|
+
sources: options.sources ? options.sources.split(',') : undefined
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const { searchCommand } = await import('../commands/search');
|
|
95
|
+
await searchCommand(searchOptions);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
const openCmd = program.command('open <number>', { hidden: true });
|
|
99
|
+
openCmd.description('Open .torrent in browser or copy magnet to clipboard');
|
|
100
|
+
openCmd.action(async (number: string) => {
|
|
101
|
+
const { openInBrowser } = await import('../commands/download');
|
|
102
|
+
await openInBrowser(parseInt(number));
|
|
103
|
+
});
|
|
104
|
+
|
|
105
|
+
const oCmd = program.command('o <number>');
|
|
106
|
+
oCmd.description('Open .torrent in browser or copy magnet to clipboard');
|
|
107
|
+
oCmd.action(async (number: string) => {
|
|
108
|
+
const { openInBrowser } = await import('../commands/download');
|
|
109
|
+
await openInBrowser(parseInt(number));
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
program.on('command:*', () => {
|
|
113
|
+
console.error('Invalid command: %s\nSee --help for a list of available commands.', program.args[0]);
|
|
114
|
+
process.exit(1);
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
return program;
|
|
118
118
|
}
|
package/src/commands/search.ts
CHANGED
|
@@ -40,10 +40,23 @@ export async function searchCommand(options: SearchOptions): Promise<void> {
|
|
|
40
40
|
const spinner = ora('Searching torrent sources...').start();
|
|
41
41
|
|
|
42
42
|
let sources = getEnabledSources();
|
|
43
|
+
const validSourceNames = sources.map(s => s.name.toLowerCase());
|
|
43
44
|
|
|
44
45
|
if (options.sources && options.sources.length > 0) {
|
|
45
46
|
const requested = options.sources.map(s => s.toLowerCase());
|
|
47
|
+
const unknownSources = requested.filter(s => !validSourceNames.includes(s));
|
|
48
|
+
|
|
49
|
+
if (unknownSources.length > 0) {
|
|
50
|
+
spinner.warn(chalk.yellow(`Unknown sources: ${unknownSources.join(', ')}. Available: ${validSourceNames.join(', ')}`));
|
|
51
|
+
}
|
|
52
|
+
|
|
46
53
|
sources = sources.filter(s => requested.includes(s.name.toLowerCase()));
|
|
54
|
+
|
|
55
|
+
if (sources.length === 0) {
|
|
56
|
+
spinner.fail('No valid sources selected. Use --sources with valid names.');
|
|
57
|
+
console.log(chalk.cyan('\nAvailable sources:'), validSourceNames.join(', '));
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
47
60
|
}
|
|
48
61
|
|
|
49
62
|
const allResults: TorrentResult[] = [];
|