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.
Files changed (161) hide show
  1. package/README.md +114 -0
  2. package/dist/bin/dydl.d.ts +2 -0
  3. package/dist/bin/dydl.js +17 -0
  4. package/dist/bin/dydl.js.map +1 -0
  5. package/dist/src/cli/commands/check.d.ts +10 -0
  6. package/dist/src/cli/commands/check.js +102 -0
  7. package/dist/src/cli/commands/check.js.map +1 -0
  8. package/dist/src/cli/commands/info.d.ts +10 -0
  9. package/dist/src/cli/commands/info.js +106 -0
  10. package/dist/src/cli/commands/info.js.map +1 -0
  11. package/dist/src/cli/commands/list.d.ts +10 -0
  12. package/dist/src/cli/commands/list.js +85 -0
  13. package/dist/src/cli/commands/list.js.map +1 -0
  14. package/dist/src/cli/commands/login.d.ts +10 -0
  15. package/dist/src/cli/commands/login.js +158 -0
  16. package/dist/src/cli/commands/login.js.map +1 -0
  17. package/dist/src/cli/commands/open.d.ts +10 -0
  18. package/dist/src/cli/commands/open.js +141 -0
  19. package/dist/src/cli/commands/open.js.map +1 -0
  20. package/dist/src/cli/commands/video.d.ts +10 -0
  21. package/dist/src/cli/commands/video.js +209 -0
  22. package/dist/src/cli/commands/video.js.map +1 -0
  23. package/dist/src/cli/index.d.ts +15 -0
  24. package/dist/src/cli/index.js +134 -0
  25. package/dist/src/cli/index.js.map +1 -0
  26. package/dist/src/cli/progress-display.d.ts +80 -0
  27. package/dist/src/cli/progress-display.js +225 -0
  28. package/dist/src/cli/progress-display.js.map +1 -0
  29. package/dist/src/cli/utils.d.ts +31 -0
  30. package/dist/src/cli/utils.js +171 -0
  31. package/dist/src/cli/utils.js.map +1 -0
  32. package/dist/src/douyin/auth/cookie-path.d.ts +22 -0
  33. package/dist/src/douyin/auth/cookie-path.js +72 -0
  34. package/dist/src/douyin/auth/cookie-path.js.map +1 -0
  35. package/dist/src/douyin/auth/cookie-storage.d.ts +19 -0
  36. package/dist/src/douyin/auth/cookie-storage.js +65 -0
  37. package/dist/src/douyin/auth/cookie-storage.js.map +1 -0
  38. package/dist/src/douyin/auth/errors.d.ts +28 -0
  39. package/dist/src/douyin/auth/errors.js +49 -0
  40. package/dist/src/douyin/auth/errors.js.map +1 -0
  41. package/dist/src/douyin/auth/getDefaultCookiePath.d.ts +24 -0
  42. package/dist/src/douyin/auth/getDefaultCookiePath.js +90 -0
  43. package/dist/src/douyin/auth/getDefaultCookiePath.js.map +1 -0
  44. package/dist/src/douyin/auth/index.d.ts +16 -0
  45. package/dist/src/douyin/auth/index.js +68 -0
  46. package/dist/src/douyin/auth/index.js.map +1 -0
  47. package/dist/src/douyin/auth/isValidCookie.d.ts +18 -0
  48. package/dist/src/douyin/auth/isValidCookie.js +60 -0
  49. package/dist/src/douyin/auth/isValidCookie.js.map +1 -0
  50. package/dist/src/douyin/auth/loadAndValidateCookie.d.ts +17 -0
  51. package/dist/src/douyin/auth/loadAndValidateCookie.js +45 -0
  52. package/dist/src/douyin/auth/loadAndValidateCookie.js.map +1 -0
  53. package/dist/src/douyin/auth/loadCookie.d.ts +17 -0
  54. package/dist/src/douyin/auth/loadCookie.js +79 -0
  55. package/dist/src/douyin/auth/loadCookie.js.map +1 -0
  56. package/dist/src/douyin/auth/login.d.ts +33 -0
  57. package/dist/src/douyin/auth/login.js +157 -0
  58. package/dist/src/douyin/auth/login.js.map +1 -0
  59. package/dist/src/douyin/auth/saveCookie.d.ts +17 -0
  60. package/dist/src/douyin/auth/saveCookie.js +89 -0
  61. package/dist/src/douyin/auth/saveCookie.js.map +1 -0
  62. package/dist/src/douyin/auth/validate.d.ts +11 -0
  63. package/dist/src/douyin/auth/validate.js +104 -0
  64. package/dist/src/douyin/auth/validate.js.map +1 -0
  65. package/dist/src/douyin/browser/manager.d.ts +54 -0
  66. package/dist/src/douyin/browser/manager.js +344 -0
  67. package/dist/src/douyin/browser/manager.js.map +1 -0
  68. package/dist/src/douyin/download/download-manager.d.ts +25 -0
  69. package/dist/src/douyin/download/download-manager.js +107 -0
  70. package/dist/src/douyin/download/download-manager.js.map +1 -0
  71. package/dist/src/douyin/download/error-handler.d.ts +49 -0
  72. package/dist/src/douyin/download/error-handler.js +160 -0
  73. package/dist/src/douyin/download/error-handler.js.map +1 -0
  74. package/dist/src/douyin/download/index.d.ts +39 -0
  75. package/dist/src/douyin/download/index.js +156 -0
  76. package/dist/src/douyin/download/index.js.map +1 -0
  77. package/dist/src/douyin/download/path-formatter.d.ts +42 -0
  78. package/dist/src/douyin/download/path-formatter.js +107 -0
  79. package/dist/src/douyin/download/path-formatter.js.map +1 -0
  80. package/dist/src/douyin/download/video-downloader.d.ts +35 -0
  81. package/dist/src/douyin/download/video-downloader.js +223 -0
  82. package/dist/src/douyin/download/video-downloader.js.map +1 -0
  83. package/dist/src/douyin/index.d.ts +19 -0
  84. package/dist/src/douyin/index.js +52 -0
  85. package/dist/src/douyin/index.js.map +1 -0
  86. package/dist/src/douyin/info/batch-processor.d.ts +15 -0
  87. package/dist/src/douyin/info/batch-processor.js +65 -0
  88. package/dist/src/douyin/info/batch-processor.js.map +1 -0
  89. package/dist/src/douyin/info/browser-manager.d.ts +56 -0
  90. package/dist/src/douyin/info/browser-manager.js +225 -0
  91. package/dist/src/douyin/info/browser-manager.js.map +1 -0
  92. package/dist/src/douyin/info/error-handler.d.ts +36 -0
  93. package/dist/src/douyin/info/error-handler.js +172 -0
  94. package/dist/src/douyin/info/error-handler.js.map +1 -0
  95. package/dist/src/douyin/info/fetch-video-detail.d.ts +14 -0
  96. package/dist/src/douyin/info/fetch-video-detail.js +247 -0
  97. package/dist/src/douyin/info/fetch-video-detail.js.map +1 -0
  98. package/dist/src/douyin/info/index.d.ts +29 -0
  99. package/dist/src/douyin/info/index.js +85 -0
  100. package/dist/src/douyin/info/index.js.map +1 -0
  101. package/dist/src/douyin/info/text-processor.d.ts +15 -0
  102. package/dist/src/douyin/info/text-processor.js +47 -0
  103. package/dist/src/douyin/info/text-processor.js.map +1 -0
  104. package/dist/src/douyin/info/user.d.ts +26 -0
  105. package/dist/src/douyin/info/user.js +237 -0
  106. package/dist/src/douyin/info/user.js.map +1 -0
  107. package/dist/src/douyin/parser/containsDouyinLink.d.ts +18 -0
  108. package/dist/src/douyin/parser/containsDouyinLink.js +27 -0
  109. package/dist/src/douyin/parser/containsDouyinLink.js.map +1 -0
  110. package/dist/src/douyin/parser/extract-links.d.ts +23 -0
  111. package/dist/src/douyin/parser/extract-links.js +79 -0
  112. package/dist/src/douyin/parser/extract-links.js.map +1 -0
  113. package/dist/src/douyin/parser/extractDouyinLinks.d.ts +18 -0
  114. package/dist/src/douyin/parser/extractDouyinLinks.js +58 -0
  115. package/dist/src/douyin/parser/extractDouyinLinks.js.map +1 -0
  116. package/dist/src/douyin/parser/index.d.ts +35 -0
  117. package/dist/src/douyin/parser/index.js +70 -0
  118. package/dist/src/douyin/parser/index.js.map +1 -0
  119. package/dist/src/douyin/parser/link-patterns.d.ts +34 -0
  120. package/dist/src/douyin/parser/link-patterns.js +121 -0
  121. package/dist/src/douyin/parser/link-patterns.js.map +1 -0
  122. package/dist/src/douyin/parser/parse-batch.d.ts +26 -0
  123. package/dist/src/douyin/parser/parse-batch.js +67 -0
  124. package/dist/src/douyin/parser/parse-batch.js.map +1 -0
  125. package/dist/src/douyin/parser/parseDouyinLinks.d.ts +30 -0
  126. package/dist/src/douyin/parser/parseDouyinLinks.js +164 -0
  127. package/dist/src/douyin/parser/parseDouyinLinks.js.map +1 -0
  128. package/dist/src/douyin/parser/resolve-links.d.ts +25 -0
  129. package/dist/src/douyin/parser/resolve-links.js +131 -0
  130. package/dist/src/douyin/parser/resolve-links.js.map +1 -0
  131. package/dist/src/index.d.ts +16 -0
  132. package/dist/src/index.js +72 -0
  133. package/dist/src/index.js.map +1 -0
  134. package/dist/src/types.d.ts +217 -0
  135. package/dist/src/types.js +6 -0
  136. package/dist/src/types.js.map +1 -0
  137. package/dist/src/utils/browser.d.ts +73 -0
  138. package/dist/src/utils/browser.js +96 -0
  139. package/dist/src/utils/browser.js.map +1 -0
  140. package/dist/src/utils/error.d.ts +160 -0
  141. package/dist/src/utils/error.js +334 -0
  142. package/dist/src/utils/error.js.map +1 -0
  143. package/dist/src/utils/fetch.d.ts +41 -0
  144. package/dist/src/utils/fetch.js +155 -0
  145. package/dist/src/utils/fetch.js.map +1 -0
  146. package/dist/src/utils/file.d.ts +46 -0
  147. package/dist/src/utils/file.js +189 -0
  148. package/dist/src/utils/file.js.map +1 -0
  149. package/dist/src/utils/index.d.ts +11 -0
  150. package/dist/src/utils/index.js +29 -0
  151. package/dist/src/utils/index.js.map +1 -0
  152. package/dist/src/utils/logger.d.ts +161 -0
  153. package/dist/src/utils/logger.js +286 -0
  154. package/dist/src/utils/logger.js.map +1 -0
  155. package/dist/src/utils/performance.d.ts +98 -0
  156. package/dist/src/utils/performance.js +292 -0
  157. package/dist/src/utils/performance.js.map +1 -0
  158. package/dist/src/utils/retry.d.ts +56 -0
  159. package/dist/src/utils/retry.js +127 -0
  160. package/dist/src/utils/retry.js.map +1 -0
  161. 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,10 @@
1
+ /**
2
+ * Open 命令
3
+ * 提供 'dydl open' 命令的實現,用於打開一個已載入 Cookie 的瀏覽器。
4
+ */
5
+ import { Command } from 'commander';
6
+ /**
7
+ * 註冊 Open 命令
8
+ * @param program Commander 實例
9
+ */
10
+ export declare function registerOpenCommand(program: Command): void;
@@ -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,10 @@
1
+ /**
2
+ * 影片命令
3
+ * 提供 'dydl video' 命令的實現
4
+ */
5
+ import { Command } from 'commander';
6
+ /**
7
+ * 註冊影片命令
8
+ * @param program Commander 實例
9
+ */
10
+ export declare function registerVideoCommand(program: Command): void;
@@ -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>;