douyin-downloader 0.1.0
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 +114 -0
- package/dist/bin/dydl.d.ts +2 -0
- package/dist/bin/dydl.js +17 -0
- package/dist/bin/dydl.js.map +1 -0
- package/dist/src/cli/commands/check.d.ts +10 -0
- package/dist/src/cli/commands/check.js +102 -0
- package/dist/src/cli/commands/check.js.map +1 -0
- package/dist/src/cli/commands/info.d.ts +10 -0
- package/dist/src/cli/commands/info.js +106 -0
- package/dist/src/cli/commands/info.js.map +1 -0
- package/dist/src/cli/commands/list.d.ts +10 -0
- package/dist/src/cli/commands/list.js +85 -0
- package/dist/src/cli/commands/list.js.map +1 -0
- package/dist/src/cli/commands/login.d.ts +10 -0
- package/dist/src/cli/commands/login.js +158 -0
- package/dist/src/cli/commands/login.js.map +1 -0
- package/dist/src/cli/commands/open.d.ts +10 -0
- package/dist/src/cli/commands/open.js +141 -0
- package/dist/src/cli/commands/open.js.map +1 -0
- package/dist/src/cli/commands/video.d.ts +10 -0
- package/dist/src/cli/commands/video.js +209 -0
- package/dist/src/cli/commands/video.js.map +1 -0
- package/dist/src/cli/index.d.ts +15 -0
- package/dist/src/cli/index.js +134 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/progress-display.d.ts +80 -0
- package/dist/src/cli/progress-display.js +225 -0
- package/dist/src/cli/progress-display.js.map +1 -0
- package/dist/src/cli/utils.d.ts +31 -0
- package/dist/src/cli/utils.js +171 -0
- package/dist/src/cli/utils.js.map +1 -0
- package/dist/src/douyin/auth/cookie-path.d.ts +22 -0
- package/dist/src/douyin/auth/cookie-path.js +72 -0
- package/dist/src/douyin/auth/cookie-path.js.map +1 -0
- package/dist/src/douyin/auth/cookie-storage.d.ts +19 -0
- package/dist/src/douyin/auth/cookie-storage.js +65 -0
- package/dist/src/douyin/auth/cookie-storage.js.map +1 -0
- package/dist/src/douyin/auth/errors.d.ts +28 -0
- package/dist/src/douyin/auth/errors.js +49 -0
- package/dist/src/douyin/auth/errors.js.map +1 -0
- package/dist/src/douyin/auth/getDefaultCookiePath.d.ts +24 -0
- package/dist/src/douyin/auth/getDefaultCookiePath.js +90 -0
- package/dist/src/douyin/auth/getDefaultCookiePath.js.map +1 -0
- package/dist/src/douyin/auth/index.d.ts +16 -0
- package/dist/src/douyin/auth/index.js +68 -0
- package/dist/src/douyin/auth/index.js.map +1 -0
- package/dist/src/douyin/auth/isValidCookie.d.ts +18 -0
- package/dist/src/douyin/auth/isValidCookie.js +60 -0
- package/dist/src/douyin/auth/isValidCookie.js.map +1 -0
- package/dist/src/douyin/auth/loadAndValidateCookie.d.ts +17 -0
- package/dist/src/douyin/auth/loadAndValidateCookie.js +45 -0
- package/dist/src/douyin/auth/loadAndValidateCookie.js.map +1 -0
- package/dist/src/douyin/auth/loadCookie.d.ts +17 -0
- package/dist/src/douyin/auth/loadCookie.js +79 -0
- package/dist/src/douyin/auth/loadCookie.js.map +1 -0
- package/dist/src/douyin/auth/login.d.ts +33 -0
- package/dist/src/douyin/auth/login.js +157 -0
- package/dist/src/douyin/auth/login.js.map +1 -0
- package/dist/src/douyin/auth/saveCookie.d.ts +17 -0
- package/dist/src/douyin/auth/saveCookie.js +89 -0
- package/dist/src/douyin/auth/saveCookie.js.map +1 -0
- package/dist/src/douyin/auth/validate.d.ts +11 -0
- package/dist/src/douyin/auth/validate.js +104 -0
- package/dist/src/douyin/auth/validate.js.map +1 -0
- package/dist/src/douyin/browser/manager.d.ts +54 -0
- package/dist/src/douyin/browser/manager.js +344 -0
- package/dist/src/douyin/browser/manager.js.map +1 -0
- package/dist/src/douyin/download/download-manager.d.ts +25 -0
- package/dist/src/douyin/download/download-manager.js +107 -0
- package/dist/src/douyin/download/download-manager.js.map +1 -0
- package/dist/src/douyin/download/error-handler.d.ts +49 -0
- package/dist/src/douyin/download/error-handler.js +160 -0
- package/dist/src/douyin/download/error-handler.js.map +1 -0
- package/dist/src/douyin/download/index.d.ts +39 -0
- package/dist/src/douyin/download/index.js +156 -0
- package/dist/src/douyin/download/index.js.map +1 -0
- package/dist/src/douyin/download/path-formatter.d.ts +42 -0
- package/dist/src/douyin/download/path-formatter.js +107 -0
- package/dist/src/douyin/download/path-formatter.js.map +1 -0
- package/dist/src/douyin/download/video-downloader.d.ts +35 -0
- package/dist/src/douyin/download/video-downloader.js +223 -0
- package/dist/src/douyin/download/video-downloader.js.map +1 -0
- package/dist/src/douyin/index.d.ts +19 -0
- package/dist/src/douyin/index.js +52 -0
- package/dist/src/douyin/index.js.map +1 -0
- package/dist/src/douyin/info/batch-processor.d.ts +15 -0
- package/dist/src/douyin/info/batch-processor.js +65 -0
- package/dist/src/douyin/info/batch-processor.js.map +1 -0
- package/dist/src/douyin/info/browser-manager.d.ts +56 -0
- package/dist/src/douyin/info/browser-manager.js +225 -0
- package/dist/src/douyin/info/browser-manager.js.map +1 -0
- package/dist/src/douyin/info/error-handler.d.ts +36 -0
- package/dist/src/douyin/info/error-handler.js +172 -0
- package/dist/src/douyin/info/error-handler.js.map +1 -0
- package/dist/src/douyin/info/fetch-video-detail.d.ts +14 -0
- package/dist/src/douyin/info/fetch-video-detail.js +247 -0
- package/dist/src/douyin/info/fetch-video-detail.js.map +1 -0
- package/dist/src/douyin/info/index.d.ts +29 -0
- package/dist/src/douyin/info/index.js +85 -0
- package/dist/src/douyin/info/index.js.map +1 -0
- package/dist/src/douyin/info/text-processor.d.ts +15 -0
- package/dist/src/douyin/info/text-processor.js +47 -0
- package/dist/src/douyin/info/text-processor.js.map +1 -0
- package/dist/src/douyin/info/user.d.ts +26 -0
- package/dist/src/douyin/info/user.js +237 -0
- package/dist/src/douyin/info/user.js.map +1 -0
- package/dist/src/douyin/parser/containsDouyinLink.d.ts +18 -0
- package/dist/src/douyin/parser/containsDouyinLink.js +27 -0
- package/dist/src/douyin/parser/containsDouyinLink.js.map +1 -0
- package/dist/src/douyin/parser/extract-links.d.ts +23 -0
- package/dist/src/douyin/parser/extract-links.js +79 -0
- package/dist/src/douyin/parser/extract-links.js.map +1 -0
- package/dist/src/douyin/parser/extractDouyinLinks.d.ts +18 -0
- package/dist/src/douyin/parser/extractDouyinLinks.js +58 -0
- package/dist/src/douyin/parser/extractDouyinLinks.js.map +1 -0
- package/dist/src/douyin/parser/index.d.ts +35 -0
- package/dist/src/douyin/parser/index.js +70 -0
- package/dist/src/douyin/parser/index.js.map +1 -0
- package/dist/src/douyin/parser/link-patterns.d.ts +34 -0
- package/dist/src/douyin/parser/link-patterns.js +121 -0
- package/dist/src/douyin/parser/link-patterns.js.map +1 -0
- package/dist/src/douyin/parser/parse-batch.d.ts +26 -0
- package/dist/src/douyin/parser/parse-batch.js +67 -0
- package/dist/src/douyin/parser/parse-batch.js.map +1 -0
- package/dist/src/douyin/parser/parseDouyinLinks.d.ts +30 -0
- package/dist/src/douyin/parser/parseDouyinLinks.js +164 -0
- package/dist/src/douyin/parser/parseDouyinLinks.js.map +1 -0
- package/dist/src/douyin/parser/resolve-links.d.ts +25 -0
- package/dist/src/douyin/parser/resolve-links.js +131 -0
- package/dist/src/douyin/parser/resolve-links.js.map +1 -0
- package/dist/src/index.d.ts +16 -0
- package/dist/src/index.js +72 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/types.d.ts +217 -0
- package/dist/src/types.js +6 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/browser.d.ts +73 -0
- package/dist/src/utils/browser.js +96 -0
- package/dist/src/utils/browser.js.map +1 -0
- package/dist/src/utils/error.d.ts +160 -0
- package/dist/src/utils/error.js +334 -0
- package/dist/src/utils/error.js.map +1 -0
- package/dist/src/utils/fetch.d.ts +41 -0
- package/dist/src/utils/fetch.js +155 -0
- package/dist/src/utils/fetch.js.map +1 -0
- package/dist/src/utils/file.d.ts +46 -0
- package/dist/src/utils/file.js +189 -0
- package/dist/src/utils/file.js.map +1 -0
- package/dist/src/utils/index.d.ts +11 -0
- package/dist/src/utils/index.js +29 -0
- package/dist/src/utils/index.js.map +1 -0
- package/dist/src/utils/logger.d.ts +161 -0
- package/dist/src/utils/logger.js +286 -0
- package/dist/src/utils/logger.js.map +1 -0
- package/dist/src/utils/performance.d.ts +98 -0
- package/dist/src/utils/performance.js +292 -0
- package/dist/src/utils/performance.js.map +1 -0
- package/dist/src/utils/retry.d.ts +56 -0
- package/dist/src/utils/retry.js +127 -0
- package/dist/src/utils/retry.js.map +1 -0
- package/package.json +61 -0
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"login.js","sourceRoot":"","sources":["../../../../src/cli/commands/login.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,141 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* Open 命令
|
4
|
+
* 提供 'dydl open' 命令的實現,用於打開一個已載入 Cookie 的瀏覽器。
|
5
|
+
*/
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
7
|
+
if (k2 === undefined) k2 = k;
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
11
|
+
}
|
12
|
+
Object.defineProperty(o, k2, desc);
|
13
|
+
}) : (function(o, m, k, k2) {
|
14
|
+
if (k2 === undefined) k2 = k;
|
15
|
+
o[k2] = m[k];
|
16
|
+
}));
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
19
|
+
}) : function(o, v) {
|
20
|
+
o["default"] = v;
|
21
|
+
});
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
23
|
+
var ownKeys = function(o) {
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
25
|
+
var ar = [];
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
27
|
+
return ar;
|
28
|
+
};
|
29
|
+
return ownKeys(o);
|
30
|
+
};
|
31
|
+
return function (mod) {
|
32
|
+
if (mod && mod.__esModule) return mod;
|
33
|
+
var result = {};
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
35
|
+
__setModuleDefault(result, mod);
|
36
|
+
return result;
|
37
|
+
};
|
38
|
+
})();
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
41
|
+
};
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
43
|
+
exports.registerOpenCommand = registerOpenCommand;
|
44
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
45
|
+
const logger_1 = require("../../utils/logger");
|
46
|
+
const auth_1 = require("../../douyin/auth");
|
47
|
+
const manager_1 = require("../../douyin/browser/manager");
|
48
|
+
/**
|
49
|
+
* 註冊 Open 命令
|
50
|
+
* @param program Commander 實例
|
51
|
+
*/
|
52
|
+
function registerOpenCommand(program) {
|
53
|
+
program
|
54
|
+
.command('open')
|
55
|
+
.description('打開一個已載入 Cookie 的瀏覽器到抖音首頁')
|
56
|
+
.argument('[cookie-path]', 'Cookie 檔案路徑', (0, auth_1.getDefaultCookiePath)())
|
57
|
+
.option('--user-data-dir <path>', '指定用戶數據目錄 (用於保持瀏覽器狀態)')
|
58
|
+
.action(async (cookiePath, options) => {
|
59
|
+
logger_1.cliLogger.debug(`Open 命令執行,Cookie 路徑: ${cookiePath}`);
|
60
|
+
logger_1.cliLogger.debug(`CLI 選項: ${JSON.stringify(options)}`);
|
61
|
+
// 動態導入 ora 和 chalk
|
62
|
+
const [{ default: ora }, { default: chalk }] = await Promise.all([
|
63
|
+
Promise.resolve().then(() => __importStar(require('ora'))),
|
64
|
+
Promise.resolve().then(() => __importStar(require('chalk')))
|
65
|
+
]);
|
66
|
+
const spinner = ora('準備打開瀏覽器...').start();
|
67
|
+
let browser = null;
|
68
|
+
try {
|
69
|
+
// 1. 檢查並載入 Cookie
|
70
|
+
spinner.text = '檢查並載入 Cookie...';
|
71
|
+
let cookie = null;
|
72
|
+
if (fs_extra_1.default.existsSync(cookiePath) && fs_extra_1.default.statSync(cookiePath).isFile()) {
|
73
|
+
cookie = await (0, auth_1.loadCookie)(cookiePath);
|
74
|
+
if (!cookie) {
|
75
|
+
spinner.warn(`Cookie 檔案 ${cookiePath} 為空或讀取失敗`);
|
76
|
+
// 即使 Cookie 為空,仍然可以打開瀏覽器,只是未登入狀態
|
77
|
+
}
|
78
|
+
else {
|
79
|
+
spinner.succeed(`成功載入 Cookie: ${cookiePath}`);
|
80
|
+
}
|
81
|
+
}
|
82
|
+
else {
|
83
|
+
spinner.warn(`Cookie 檔案不存在: ${cookiePath},將以未登入狀態打開瀏覽器`);
|
84
|
+
}
|
85
|
+
// 2. 準備瀏覽器選項
|
86
|
+
const launchOpts = {
|
87
|
+
headless: false, // 必須是非無頭模式
|
88
|
+
userDataDir: options.userDataDir, // 允許用戶指定數據目錄
|
89
|
+
// 可以添加其他需要的選項,例如 executablePath
|
90
|
+
};
|
91
|
+
// 3. 啟動瀏覽器
|
92
|
+
spinner.text = '正在啟動瀏覽器...';
|
93
|
+
browser = await (0, manager_1.launchBrowser)(launchOpts);
|
94
|
+
spinner.succeed('瀏覽器已啟動');
|
95
|
+
// 4. 創建新頁面
|
96
|
+
spinner.text = '正在創建頁面...';
|
97
|
+
const page = await (0, manager_1.newPage)(browser, { blockResources: false }); // 不阻擋資源,確保頁面完整顯示
|
98
|
+
spinner.succeed('頁面已創建');
|
99
|
+
// 5. 設定 Cookie (如果已載入)
|
100
|
+
if (cookie) {
|
101
|
+
spinner.text = '正在設定 Cookie...';
|
102
|
+
await (0, manager_1.setCookiesOnPage)(page, cookie, '.douyin.com');
|
103
|
+
spinner.succeed('Cookie 已設定');
|
104
|
+
}
|
105
|
+
// 6. 導航到抖音首頁
|
106
|
+
const targetUrl = 'https://www.douyin.com/';
|
107
|
+
spinner.text = `正在導航至 ${targetUrl}...`;
|
108
|
+
await page.goto(targetUrl, { waitUntil: 'networkidle2' });
|
109
|
+
spinner.succeed(`已導航至 ${targetUrl}`);
|
110
|
+
// 7. 提示用戶並等待瀏覽器關閉
|
111
|
+
console.log(chalk.green('\n瀏覽器已開啟並載入 Cookie (如果有的話)。'));
|
112
|
+
console.log(chalk.yellow('您可以手動操作瀏覽器,完成後請手動關閉瀏覽器視窗。'));
|
113
|
+
spinner.stop(); // 停止 spinner
|
114
|
+
// 等待瀏覽器斷開連接事件
|
115
|
+
await new Promise(resolve => {
|
116
|
+
browser?.on('disconnected', () => {
|
117
|
+
logger_1.cliLogger.debug('偵測到瀏覽器已關閉');
|
118
|
+
resolve();
|
119
|
+
});
|
120
|
+
});
|
121
|
+
console.log(chalk.blue('瀏覽器已關閉,程式即將退出。'));
|
122
|
+
browser = null; // 標記瀏覽器已關閉
|
123
|
+
process.exit(0); // Explicitly exit the process
|
124
|
+
}
|
125
|
+
catch (error) {
|
126
|
+
spinner.fail('執行 open 命令時發生錯誤');
|
127
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
128
|
+
logger_1.cliLogger.error('Open 命令執行失敗:', err);
|
129
|
+
console.error(chalk.red(err.message));
|
130
|
+
process.exitCode = 1;
|
131
|
+
}
|
132
|
+
finally {
|
133
|
+
// 雖然等待了 disconnected 事件,但以防萬一再次嘗試關閉
|
134
|
+
if (browser && browser.isConnected()) {
|
135
|
+
logger_1.cliLogger.warn('瀏覽器未觸發 disconnected 事件,嘗試強制關閉');
|
136
|
+
await (0, manager_1.closeBrowser)(browser);
|
137
|
+
}
|
138
|
+
}
|
139
|
+
});
|
140
|
+
}
|
141
|
+
//# sourceMappingURL=open.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"open.js","sourceRoot":"","sources":["../../../../src/cli/commands/open.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,209 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* 影片命令
|
4
|
+
* 提供 'dydl video' 命令的實現
|
5
|
+
*/
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
7
|
+
if (k2 === undefined) k2 = k;
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
11
|
+
}
|
12
|
+
Object.defineProperty(o, k2, desc);
|
13
|
+
}) : (function(o, m, k, k2) {
|
14
|
+
if (k2 === undefined) k2 = k;
|
15
|
+
o[k2] = m[k];
|
16
|
+
}));
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
19
|
+
}) : function(o, v) {
|
20
|
+
o["default"] = v;
|
21
|
+
});
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
23
|
+
var ownKeys = function(o) {
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
25
|
+
var ar = [];
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
27
|
+
return ar;
|
28
|
+
};
|
29
|
+
return ownKeys(o);
|
30
|
+
};
|
31
|
+
return function (mod) {
|
32
|
+
if (mod && mod.__esModule) return mod;
|
33
|
+
var result = {};
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
35
|
+
__setModuleDefault(result, mod);
|
36
|
+
return result;
|
37
|
+
};
|
38
|
+
})();
|
39
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
40
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
41
|
+
};
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
43
|
+
exports.registerVideoCommand = registerVideoCommand;
|
44
|
+
const fs_extra_1 = __importDefault(require("fs-extra"));
|
45
|
+
const path_1 = __importDefault(require("path"));
|
46
|
+
// 使用 dynamic import 代替直接導入 ESM 模塊
|
47
|
+
// import ora from 'ora';
|
48
|
+
// import chalk from 'chalk';
|
49
|
+
const download_1 = require("../../douyin/download"); // Corrected path
|
50
|
+
const utils_1 = require("../utils");
|
51
|
+
const logger_1 = require("../../utils/logger"); // Updated path to shared utils logger
|
52
|
+
const progress_display_1 = require("../progress-display");
|
53
|
+
const manager_1 = require("../../douyin/browser/manager"); // Import new browser manager functions
|
54
|
+
/**
|
55
|
+
* 註冊影片命令
|
56
|
+
* @param program Commander 實例
|
57
|
+
*/
|
58
|
+
function registerVideoCommand(program) {
|
59
|
+
program
|
60
|
+
.command('video')
|
61
|
+
.description('下載抖音影片')
|
62
|
+
.argument('<sources...>', '影片連結或包含連結的文本')
|
63
|
+
.option('-c, --cookie <path>', '指定包含有效 Cookie 的檔案路徑')
|
64
|
+
.option('-d, --directory <path>', '指定輸出目錄', process.cwd()) // Changed -o to -d
|
65
|
+
.option('-f, --file <path>', '指定單一影片的輸出檔案路徑') // Added -f
|
66
|
+
.option('--concurrency <num>', '並行下載的數量', '3')
|
67
|
+
.option('--retries <num>', '下載失敗時的重試次數', '3')
|
68
|
+
.option('--no-subfolders', '不使用子資料夾儲存檔案')
|
69
|
+
.option('--filename-template <template>', '檔名模板,如 "{date}-{title}"', '{date}-{title}')
|
70
|
+
.option('--overwrite', '覆蓋已存在的檔案')
|
71
|
+
.option('--user-data-dir <path>', '指定 Puppeteer 使用者資料目錄')
|
72
|
+
.action(async (sources, options) => {
|
73
|
+
logger_1.cliLogger.debug('影片命令執行,選項:', options);
|
74
|
+
// 動態導入 ESM 模塊
|
75
|
+
const [{ default: ora }, { default: chalk }] = await Promise.all([
|
76
|
+
Promise.resolve().then(() => __importStar(require('ora'))),
|
77
|
+
Promise.resolve().then(() => __importStar(require('chalk')))
|
78
|
+
]);
|
79
|
+
const spinner = ora('準備下載...').start();
|
80
|
+
let browser = null; // Keep track of browser instance
|
81
|
+
try {
|
82
|
+
// 解析選項
|
83
|
+
const cookiePath = options.cookie;
|
84
|
+
const outputDirectory = options.directory; // Changed from output
|
85
|
+
const outputFile = options.file; // Added file option
|
86
|
+
const concurrency = parseInt(options.concurrency, 10);
|
87
|
+
const retries = parseInt(options.retries, 10);
|
88
|
+
const useSubfolders = options.subfolders !== false;
|
89
|
+
const filenameTemplate = options.filenameTemplate;
|
90
|
+
const overwrite = options.overwrite || false;
|
91
|
+
const userDataDir = options.userDataDir;
|
92
|
+
// --- 選項驗證 ---
|
93
|
+
if (outputFile && outputDirectory !== process.cwd()) { // Check if both -f and -d (non-default) are provided
|
94
|
+
spinner.fail(`錯誤:不能同時指定輸出檔案 (-f) 和輸出目錄 (-d)`);
|
95
|
+
console.log(chalk.yellow('請只選擇其中一個選項。'));
|
96
|
+
return;
|
97
|
+
}
|
98
|
+
if (outputFile && sources.length > 1) {
|
99
|
+
spinner.fail(`錯誤:當指定輸出檔案 (-f) 時,只能提供一個影片來源`);
|
100
|
+
console.log(chalk.yellow(`您提供了 ${sources.length} 個來源。請移除 -f 選項或只提供一個來源。`));
|
101
|
+
return;
|
102
|
+
}
|
103
|
+
// ---
|
104
|
+
// 檢查 Cookie
|
105
|
+
spinner.text = '檢查 Cookie...';
|
106
|
+
const cookie = await (0, utils_1.checkAndGetCookie)(cookiePath);
|
107
|
+
if (!cookie) {
|
108
|
+
spinner.fail('缺少有效的 Cookie,無法下載影片');
|
109
|
+
console.log(chalk.yellow(`請執行 ${chalk.cyan('dydl login')} 登入抖音並取得 Cookie`));
|
110
|
+
return;
|
111
|
+
}
|
112
|
+
// 準備輸出路徑
|
113
|
+
spinner.text = '準備輸出路徑...';
|
114
|
+
let finalOutputPath;
|
115
|
+
try {
|
116
|
+
if (outputFile) {
|
117
|
+
// 使用 -f 指定檔案路徑
|
118
|
+
finalOutputPath = path_1.default.resolve(outputFile); // 解析為絕對路徑
|
119
|
+
const parentDir = path_1.default.dirname(finalOutputPath);
|
120
|
+
await fs_extra_1.default.ensureDir(parentDir); // 確保父目錄存在
|
121
|
+
logger_1.cliLogger.debug(`輸出檔案路徑設定為: ${finalOutputPath}`);
|
122
|
+
}
|
123
|
+
else {
|
124
|
+
// 使用 -d 指定目錄路徑 (或預設)
|
125
|
+
finalOutputPath = path_1.default.resolve(outputDirectory); // 解析為絕對路徑
|
126
|
+
await fs_extra_1.default.ensureDir(finalOutputPath); // 確保目錄存在
|
127
|
+
logger_1.cliLogger.debug(`輸出目錄路徑設定為: ${finalOutputPath}`);
|
128
|
+
}
|
129
|
+
}
|
130
|
+
catch (error) {
|
131
|
+
spinner.fail(`準備輸出路徑失敗: ${(error instanceof Error ? error.message : String(error))}`);
|
132
|
+
return;
|
133
|
+
}
|
134
|
+
// 組合所有輸入文本
|
135
|
+
spinner.text = '解析抖音連結...';
|
136
|
+
const combinedText = sources.join(' ');
|
137
|
+
// --- Browser Management ---
|
138
|
+
spinner.text = '啟動瀏覽器...';
|
139
|
+
browser = await (0, manager_1.launchBrowser)({
|
140
|
+
headless: 'new', // Or false
|
141
|
+
userDataDir: userDataDir // 傳遞 userDataDir
|
142
|
+
});
|
143
|
+
const page = await (0, manager_1.newPage)(browser);
|
144
|
+
spinner.text = '設定 Cookie...';
|
145
|
+
await (0, manager_1.setCookiesOnPage)(page, cookie, '.douyin.com'); // Assuming .douyin.com
|
146
|
+
// --- End Browser Management ---
|
147
|
+
// 創建下載進度處理器
|
148
|
+
const progressHandler = await (0, progress_display_1.createDownloadProgressHandler)(spinner);
|
149
|
+
// 下載選項
|
150
|
+
const downloadOptions = {
|
151
|
+
concurrency,
|
152
|
+
retries,
|
153
|
+
onProgress: progressHandler,
|
154
|
+
useSubfolders,
|
155
|
+
filenameTemplate,
|
156
|
+
overwrite
|
157
|
+
};
|
158
|
+
// 下載影片
|
159
|
+
// Pass page instead of cookie
|
160
|
+
const downloadedFiles = await (0, download_1.downloadVideosFromText)(combinedText, finalOutputPath, page, downloadOptions);
|
161
|
+
if (downloadedFiles.length > 0) {
|
162
|
+
spinner.succeed(`成功下載 ${downloadedFiles.length} 個影片`);
|
163
|
+
// 顯示下載的檔案
|
164
|
+
console.log(chalk.green('\n下載的檔案:'));
|
165
|
+
downloadedFiles.forEach((file, index) => {
|
166
|
+
console.log(`${index + 1}. ${chalk.cyan(file)}`);
|
167
|
+
});
|
168
|
+
}
|
169
|
+
else {
|
170
|
+
spinner.fail('未下載任何影片');
|
171
|
+
// 提供可能的原因
|
172
|
+
if (combinedText.includes('douyin.com') || combinedText.includes('抖音')) {
|
173
|
+
console.log(chalk.yellow('可能的原因:'));
|
174
|
+
console.log(chalk.yellow('1. 影片連結無效或已失效'));
|
175
|
+
console.log(chalk.yellow('2. Cookie 有效但權限不足'));
|
176
|
+
console.log(chalk.yellow('3. 影片已被刪除或設為私人'));
|
177
|
+
console.log(chalk.yellow('4. 網絡問題導致無法獲取影片資訊'));
|
178
|
+
}
|
179
|
+
else {
|
180
|
+
console.log(chalk.yellow('輸入中未找到有效的抖音影片連結'));
|
181
|
+
}
|
182
|
+
}
|
183
|
+
}
|
184
|
+
catch (error) {
|
185
|
+
spinner.fail('下載過程中發生錯誤');
|
186
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
187
|
+
logger_1.cliLogger.error('影片命令執行失敗:', err);
|
188
|
+
console.error(chalk.red(err.message));
|
189
|
+
// 提供錯誤處理建議
|
190
|
+
console.log(chalk.yellow('\n如何解決:'));
|
191
|
+
console.log('1. 檢查網絡連接');
|
192
|
+
console.log('2. 確認影片連結是否有效');
|
193
|
+
console.log('3. 嘗試重新登入以更新 Cookie');
|
194
|
+
console.log(`4. 使用 ${chalk.cyan('--retries')} 選項增加重試次數`);
|
195
|
+
process.exitCode = 1;
|
196
|
+
}
|
197
|
+
finally {
|
198
|
+
// Use the new closeBrowser function
|
199
|
+
if (browser) {
|
200
|
+
spinner.stop(); // Stop spinner before logging cleanup
|
201
|
+
console.log('\n清理瀏覽器資源...');
|
202
|
+
await (0, manager_1.closeBrowser)(browser);
|
203
|
+
logger_1.cliLogger.debug('已清理瀏覽器資源');
|
204
|
+
}
|
205
|
+
// Let the process exit naturally based on exitCode
|
206
|
+
}
|
207
|
+
});
|
208
|
+
}
|
209
|
+
//# sourceMappingURL=video.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"video.js","sourceRoot":"","sources":["../../../../src/cli/commands/video.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,15 @@
|
|
1
|
+
/**
|
2
|
+
* CLI 模組
|
3
|
+
* 提供命令行界面的實現
|
4
|
+
*/
|
5
|
+
import { Command } from 'commander';
|
6
|
+
/**
|
7
|
+
* 創建 CLI 程序
|
8
|
+
* @returns Promise<Command> 命令行程序實例
|
9
|
+
*/
|
10
|
+
export declare function createCli(): Promise<Command>;
|
11
|
+
/**
|
12
|
+
* 運行 CLI 程序
|
13
|
+
* @param args 命令行參數
|
14
|
+
*/
|
15
|
+
export declare function runCli(args?: string[]): Promise<void>;
|
@@ -0,0 +1,134 @@
|
|
1
|
+
"use strict";
|
2
|
+
/**
|
3
|
+
* CLI 模組
|
4
|
+
* 提供命令行界面的實現
|
5
|
+
*/
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
7
|
+
if (k2 === undefined) k2 = k;
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
11
|
+
}
|
12
|
+
Object.defineProperty(o, k2, desc);
|
13
|
+
}) : (function(o, m, k, k2) {
|
14
|
+
if (k2 === undefined) k2 = k;
|
15
|
+
o[k2] = m[k];
|
16
|
+
}));
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
19
|
+
}) : function(o, v) {
|
20
|
+
o["default"] = v;
|
21
|
+
});
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
23
|
+
var ownKeys = function(o) {
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
25
|
+
var ar = [];
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
27
|
+
return ar;
|
28
|
+
};
|
29
|
+
return ownKeys(o);
|
30
|
+
};
|
31
|
+
return function (mod) {
|
32
|
+
if (mod && mod.__esModule) return mod;
|
33
|
+
var result = {};
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
35
|
+
__setModuleDefault(result, mod);
|
36
|
+
return result;
|
37
|
+
};
|
38
|
+
})();
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
40
|
+
exports.createCli = createCli;
|
41
|
+
exports.runCli = runCli;
|
42
|
+
const commander_1 = require("commander");
|
43
|
+
// 使用動態導入代替靜態導入
|
44
|
+
// import chalk from 'chalk';
|
45
|
+
// Import rootLogger and LogLevel for potential global level setting
|
46
|
+
const logger_1 = require("../utils/logger");
|
47
|
+
const utils_1 = require("./utils");
|
48
|
+
// 導入各個命令
|
49
|
+
const login_1 = require("./commands/login");
|
50
|
+
const check_1 = require("./commands/check");
|
51
|
+
const video_1 = require("./commands/video");
|
52
|
+
const open_1 = require("./commands/open"); // Import the new command
|
53
|
+
const info_1 = require("./commands/info"); // Import the info command
|
54
|
+
const list_1 = require("./commands/list"); // Import the list command
|
55
|
+
/**
|
56
|
+
* 創建 CLI 程序
|
57
|
+
* @returns Promise<Command> 命令行程序實例
|
58
|
+
*/
|
59
|
+
async function createCli() {
|
60
|
+
// 動態導入 chalk
|
61
|
+
const { default: chalk } = await Promise.resolve().then(() => __importStar(require('chalk')));
|
62
|
+
const program = new commander_1.Command();
|
63
|
+
// 設定基本信息
|
64
|
+
program
|
65
|
+
.name('dydl')
|
66
|
+
.description('抖音影片解析與下載工具')
|
67
|
+
.version((0, utils_1.getVersion)());
|
68
|
+
// 註冊各個命令
|
69
|
+
(0, login_1.registerLoginCommand)(program);
|
70
|
+
(0, check_1.registerCheckCommand)(program);
|
71
|
+
(0, video_1.registerVideoCommand)(program);
|
72
|
+
(0, open_1.registerOpenCommand)(program); // Register the new command
|
73
|
+
(0, info_1.registerInfoCommand)(program); // Register the info command
|
74
|
+
(0, list_1.registerListCommand)(program); // Register the list command
|
75
|
+
// 添加全局選項
|
76
|
+
program
|
77
|
+
.option('-v, --verbose', '顯示詳細日誌')
|
78
|
+
.on('option:verbose', () => {
|
79
|
+
process.env.VERBOSE = 'true';
|
80
|
+
logger_1.cliLogger.debug('已啟用詳細日誌輸出');
|
81
|
+
});
|
82
|
+
// 自定義幫助信息
|
83
|
+
program.addHelpText('after', `
|
84
|
+
範例:
|
85
|
+
$ dydl login # 登入抖音並儲存 Cookie
|
86
|
+
$ dydl check # 檢查已儲存的 Cookie 是否有效
|
87
|
+
$ dydl open # 打開已載入 Cookie 的瀏覽器
|
88
|
+
$ dydl video <影片連結> # 下載單個影片
|
89
|
+
$ dydl video -d ./videos <連結> # 指定下載目錄 (注意: 已改為 -d)
|
90
|
+
$ dydl video -f video.mp4 <連結> # 指定單個影片的輸出檔案
|
91
|
+
$ dydl info <影片連結> # 獲取影片資訊並輸出到控制台
|
92
|
+
$ dydl info -f info.json <連結> # 獲取影片資訊並輸出到檔案
|
93
|
+
$ dydl list <用戶頁面連結> # 獲取用戶所有影片列表並輸出到控制台
|
94
|
+
$ dydl list -n 10 <用戶頁面連結> # 獲取用戶最新的 10 個影片列表
|
95
|
+
$ dydl list -f list.json <用戶頁面連結> # 獲取用戶影片列表並輸出到檔案
|
96
|
+
$ dydl video --help # 顯示 video 命令的詳細幫助
|
97
|
+
|
98
|
+
更多信息請訪問: https://github.com/gkctou/douyin-downloader
|
99
|
+
`);
|
100
|
+
// 處理未知命令
|
101
|
+
program.on('command:*', async (operands) => {
|
102
|
+
// 動態導入 chalk (在事件處理程序中)
|
103
|
+
const { default: chalk } = await Promise.resolve().then(() => __importStar(require('chalk')));
|
104
|
+
console.error(chalk.red(`錯誤: 未知命令 '${operands[0]}'`));
|
105
|
+
console.error();
|
106
|
+
console.error(`請執行 ${chalk.yellow('dydl --help')} 查看可用命令`);
|
107
|
+
process.exitCode = 1;
|
108
|
+
});
|
109
|
+
return program;
|
110
|
+
}
|
111
|
+
/**
|
112
|
+
* 運行 CLI 程序
|
113
|
+
* @param args 命令行參數
|
114
|
+
*/
|
115
|
+
async function runCli(args = process.argv) {
|
116
|
+
// Removed console override variables and logic from here
|
117
|
+
try {
|
118
|
+
// Removed pre-check for silent mode
|
119
|
+
const program = await createCli();
|
120
|
+
// 解析命令行參數並執行命令
|
121
|
+
program.parse(args);
|
122
|
+
// 如果沒有提供命令,顯示幫助信息
|
123
|
+
if (process.argv.length <= 2) {
|
124
|
+
program.outputHelp();
|
125
|
+
}
|
126
|
+
}
|
127
|
+
catch (error) {
|
128
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
129
|
+
logger_1.cliLogger.error('CLI 運行錯誤:', err); // 這個錯誤應該總是顯示
|
130
|
+
process.exitCode = 1;
|
131
|
+
}
|
132
|
+
// Removed finally block for console restore
|
133
|
+
}
|
134
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,80 @@
|
|
1
|
+
/**
|
2
|
+
* 進度顯示功能
|
3
|
+
* 提供豐富的終端進度條顯示
|
4
|
+
*/
|
5
|
+
/**
|
6
|
+
* 進度條顯示器
|
7
|
+
* 負責在命令行中顯示影片下載進度
|
8
|
+
*/
|
9
|
+
export declare class DownloadProgressDisplay {
|
10
|
+
private spinner;
|
11
|
+
private total;
|
12
|
+
private completed;
|
13
|
+
private progressMap;
|
14
|
+
private startTime;
|
15
|
+
private barWidth;
|
16
|
+
private chalk;
|
17
|
+
/**
|
18
|
+
* 建立進度顯示器
|
19
|
+
* @param spinner Ora 實例
|
20
|
+
* @param chalk Chalk 實例
|
21
|
+
* @param barWidth 進度條寬度
|
22
|
+
*/
|
23
|
+
constructor(spinner: any, chalk: any, barWidth?: number);
|
24
|
+
/**
|
25
|
+
* 初始化進度顯示
|
26
|
+
* @param total 影片總數
|
27
|
+
*/
|
28
|
+
initialize(total: number): void;
|
29
|
+
/**
|
30
|
+
* 更新特定影片的下載進度
|
31
|
+
* @param index 影片索引 (0-based)
|
32
|
+
* @param progress 進度百分比 (0-100)
|
33
|
+
* @param speed 下載速度 (KB/s)
|
34
|
+
*/
|
35
|
+
updateProgress(index: number, progress: number, speed?: number): void;
|
36
|
+
/**
|
37
|
+
* 更新完成的影片數量
|
38
|
+
* @param completed 已完成的影片數量
|
39
|
+
*/
|
40
|
+
updateCompleted(completed: number): void;
|
41
|
+
/**
|
42
|
+
* 標記一個影片下載完成
|
43
|
+
* @param index 影片索引 (0-based)
|
44
|
+
*/
|
45
|
+
completeItem(index: number): void;
|
46
|
+
/**
|
47
|
+
* 格式化進度條
|
48
|
+
* @param progress 進度百分比 (0-100)
|
49
|
+
* @returns 格式化的進度條字串
|
50
|
+
*/
|
51
|
+
private formatProgressBar;
|
52
|
+
/**
|
53
|
+
* 計算估計剩餘時間
|
54
|
+
* @returns 格式化的估計剩餘時間
|
55
|
+
*/
|
56
|
+
private getEstimatedTimeRemaining;
|
57
|
+
/**
|
58
|
+
* 更新顯示
|
59
|
+
* @param speed 下載速度 (KB/s)
|
60
|
+
*/
|
61
|
+
private updateDisplay;
|
62
|
+
/**
|
63
|
+
* 完成下載並顯示最終結果
|
64
|
+
* @param success 成功下載的數量
|
65
|
+
* @param failed 失敗的數量
|
66
|
+
*/
|
67
|
+
finalize(success: number, failed?: number): void;
|
68
|
+
/**
|
69
|
+
* 顯示失敗
|
70
|
+
* @param message 失敗消息
|
71
|
+
*/
|
72
|
+
fail(message: string): void;
|
73
|
+
}
|
74
|
+
/**
|
75
|
+
* 創建下載進度處理器
|
76
|
+
* @param spinner Ora 實例
|
77
|
+
* @param message 進度消息前綴
|
78
|
+
* @returns 進度回調函數
|
79
|
+
*/
|
80
|
+
export declare function createDownloadProgressHandler(spinner: any, message?: string): Promise<(current: number, total: number, progress?: number) => void>;
|