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,225 @@
1
+ "use strict";
2
+ /**
3
+ * 進度顯示功能
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.DownloadProgressDisplay = void 0;
41
+ exports.createDownloadProgressHandler = createDownloadProgressHandler;
42
+ // 使用動態導入代替靜態導入
43
+ // import chalk from 'chalk';
44
+ // import ora from 'ora';
45
+ /**
46
+ * 進度條顯示器
47
+ * 負責在命令行中顯示影片下載進度
48
+ */
49
+ class DownloadProgressDisplay {
50
+ spinner;
51
+ total;
52
+ completed;
53
+ progressMap;
54
+ startTime;
55
+ barWidth;
56
+ chalk;
57
+ /**
58
+ * 建立進度顯示器
59
+ * @param spinner Ora 實例
60
+ * @param chalk Chalk 實例
61
+ * @param barWidth 進度條寬度
62
+ */
63
+ constructor(spinner, chalk, barWidth = 30) {
64
+ this.spinner = spinner;
65
+ this.chalk = chalk;
66
+ this.total = 0;
67
+ this.completed = 0;
68
+ this.progressMap = new Map();
69
+ this.startTime = Date.now();
70
+ this.barWidth = barWidth;
71
+ }
72
+ /**
73
+ * 初始化進度顯示
74
+ * @param total 影片總數
75
+ */
76
+ initialize(total) {
77
+ this.total = total;
78
+ this.completed = 0;
79
+ this.progressMap.clear();
80
+ this.startTime = Date.now();
81
+ this.updateDisplay();
82
+ }
83
+ /**
84
+ * 更新特定影片的下載進度
85
+ * @param index 影片索引 (0-based)
86
+ * @param progress 進度百分比 (0-100)
87
+ * @param speed 下載速度 (KB/s)
88
+ */
89
+ updateProgress(index, progress, speed = 0) {
90
+ this.progressMap.set(index, progress);
91
+ this.updateDisplay(speed);
92
+ }
93
+ /**
94
+ * 更新完成的影片數量
95
+ * @param completed 已完成的影片數量
96
+ */
97
+ updateCompleted(completed) {
98
+ this.completed = completed;
99
+ this.updateDisplay();
100
+ }
101
+ /**
102
+ * 標記一個影片下載完成
103
+ * @param index 影片索引 (0-based)
104
+ */
105
+ completeItem(index) {
106
+ this.progressMap.set(index, 100);
107
+ this.completed++;
108
+ this.updateDisplay();
109
+ }
110
+ /**
111
+ * 格式化進度條
112
+ * @param progress 進度百分比 (0-100)
113
+ * @returns 格式化的進度條字串
114
+ */
115
+ formatProgressBar(progress) {
116
+ const filled = Math.round(this.barWidth * (progress / 100));
117
+ const empty = this.barWidth - filled;
118
+ return `${'█'.repeat(filled)}${'░'.repeat(empty)}`;
119
+ }
120
+ /**
121
+ * 計算估計剩餘時間
122
+ * @returns 格式化的估計剩餘時間
123
+ */
124
+ getEstimatedTimeRemaining() {
125
+ const elapsedMs = Date.now() - this.startTime;
126
+ if (this.completed === 0 || elapsedMs === 0) {
127
+ return '計算中...';
128
+ }
129
+ // 計算平均每個影片的處理時間
130
+ const avgTimePerItem = elapsedMs / this.completed;
131
+ // 估計剩餘時間
132
+ const remainingItems = this.total - this.completed;
133
+ const remainingMs = avgTimePerItem * remainingItems;
134
+ // 格式化時間
135
+ if (remainingMs < 1000) {
136
+ return '即將完成';
137
+ }
138
+ else if (remainingMs < 60000) {
139
+ return `${Math.ceil(remainingMs / 1000)} 秒`;
140
+ }
141
+ else if (remainingMs < 3600000) {
142
+ return `${Math.ceil(remainingMs / 60000)} 分鐘`;
143
+ }
144
+ else {
145
+ return `${Math.floor(remainingMs / 3600000)}小時 ${Math.ceil((remainingMs % 3600000) / 60000)}分鐘`;
146
+ }
147
+ }
148
+ /**
149
+ * 更新顯示
150
+ * @param speed 下載速度 (KB/s)
151
+ */
152
+ updateDisplay(speed = 0) {
153
+ // 計算總體進度
154
+ let totalProgress = 0;
155
+ this.progressMap.forEach((progress) => {
156
+ totalProgress += progress;
157
+ });
158
+ const overallProgress = this.progressMap.size > 0
159
+ ? Math.round(totalProgress / this.progressMap.size)
160
+ : 0;
161
+ // 構建顯示文本
162
+ let displayText = `[${this.completed}/${this.total}] `;
163
+ displayText += this.formatProgressBar(overallProgress);
164
+ displayText += ` ${overallProgress}%`;
165
+ // 添加速度信息
166
+ if (speed > 0) {
167
+ const speedText = speed >= 1024
168
+ ? `${(speed / 1024).toFixed(1)} MB/s`
169
+ : `${Math.round(speed)} KB/s`;
170
+ displayText += ` ${this.chalk.cyan(speedText)}`;
171
+ }
172
+ // 添加估計剩餘時間
173
+ if (this.completed > 0 && this.completed < this.total) {
174
+ displayText += ` (剩餘時間: ${this.chalk.yellow(this.getEstimatedTimeRemaining())})`;
175
+ }
176
+ // 更新 spinner 文本
177
+ this.spinner.text = displayText;
178
+ }
179
+ /**
180
+ * 完成下載並顯示最終結果
181
+ * @param success 成功下載的數量
182
+ * @param failed 失敗的數量
183
+ */
184
+ finalize(success, failed = 0) {
185
+ const totalTime = ((Date.now() - this.startTime) / 1000).toFixed(1);
186
+ let message = `下載完成 (用時: ${totalTime}秒)`;
187
+ message += `,成功: ${this.chalk.green(success)}`;
188
+ if (failed > 0) {
189
+ message += `,失敗: ${this.chalk.red(failed)}`;
190
+ }
191
+ this.spinner.succeed(message);
192
+ }
193
+ /**
194
+ * 顯示失敗
195
+ * @param message 失敗消息
196
+ */
197
+ fail(message) {
198
+ this.spinner.fail(message);
199
+ }
200
+ }
201
+ exports.DownloadProgressDisplay = DownloadProgressDisplay;
202
+ /**
203
+ * 創建下載進度處理器
204
+ * @param spinner Ora 實例
205
+ * @param message 進度消息前綴
206
+ * @returns 進度回調函數
207
+ */
208
+ async function createDownloadProgressHandler(spinner, message = '下載中:') {
209
+ // 動態導入 chalk
210
+ const { default: chalk } = await Promise.resolve().then(() => __importStar(require('chalk')));
211
+ const display = new DownloadProgressDisplay(spinner, chalk);
212
+ let initialized = false;
213
+ return (current, total, progress = 0) => {
214
+ if (!initialized) {
215
+ display.initialize(total);
216
+ initialized = true;
217
+ }
218
+ display.updateCompleted(current);
219
+ // 如果提供了總體進度,更新第一個影片的進度
220
+ if (progress > 0) {
221
+ display.updateProgress(0, progress);
222
+ }
223
+ };
224
+ }
225
+ //# sourceMappingURL=progress-display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"progress-display.js","sourceRoot":"","sources":["../../../src/cli/progress-display.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkMH,sEAuBC;AAvND,eAAe;AACf,6BAA6B;AAC7B,yBAAyB;AAEzB;;;GAGG;AACH,MAAa,uBAAuB;IAC1B,OAAO,CAAM;IACb,KAAK,CAAS;IACd,SAAS,CAAS;IAClB,WAAW,CAAsB;IACjC,SAAS,CAAS;IAClB,QAAQ,CAAS;IACjB,KAAK,CAAM;IAEnB;;;;;OAKG;IACH,YACE,OAAY,EACZ,KAAU,EACV,WAAmB,EAAE;QAErB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACf,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,WAAW,GAAG,IAAI,GAAG,EAAE,CAAC;QAC7B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACH,UAAU,CAAC,KAAa;QACtB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE5B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;;;;OAKG;IACH,cAAc,CAAC,KAAa,EAAE,QAAgB,EAAE,QAAgB,CAAC;QAC/D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;QACtC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5B,CAAC;IAED;;;OAGG;IACH,eAAe,CAAC,SAAiB;QAC/B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;;OAGG;IACH,YAAY,CAAC,KAAa;QACxB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QACjB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED;;;;OAIG;IACK,iBAAiB,CAAC,QAAgB;QACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC;QAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC;QAErC,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;IACrD,CAAC;IAED;;;OAGG;IACK,yBAAyB;QAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC9C,IAAI,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;YAC5C,OAAO,QAAQ,CAAC;QAClB,CAAC;QAED,gBAAgB;QAChB,MAAM,cAAc,GAAG,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QAClD,SAAS;QACT,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;QACnD,MAAM,WAAW,GAAG,cAAc,GAAG,cAAc,CAAC;QAEpD,QAAQ;QACR,IAAI,WAAW,GAAG,IAAI,EAAE,CAAC;YACvB,OAAO,MAAM,CAAC;QAChB,CAAC;aAAM,IAAI,WAAW,GAAG,KAAK,EAAE,CAAC;YAC/B,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;QAC9C,CAAC;aAAM,IAAI,WAAW,GAAG,OAAO,EAAE,CAAC;YACjC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;QAClG,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,aAAa,CAAC,QAAgB,CAAC;QACrC,SAAS;QACT,IAAI,aAAa,GAAG,CAAC,CAAC;QAEtB,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;YACpC,aAAa,IAAI,QAAQ,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC;YAC/C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACnD,CAAC,CAAC,CAAC,CAAC;QAEN,SAAS;QACT,IAAI,WAAW,GAAG,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC;QACvD,WAAW,IAAI,IAAI,CAAC,iBAAiB,CAAC,eAAe,CAAC,CAAC;QACvD,WAAW,IAAI,IAAI,eAAe,GAAG,CAAC;QAEtC,SAAS;QACT,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,MAAM,SAAS,GAAG,KAAK,IAAI,IAAI;gBAC7B,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO;gBACrC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC;YAEhC,WAAW,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QAClD,CAAC;QAED,WAAW;QACX,IAAI,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YACtD,WAAW,IAAI,WAAW,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,yBAAyB,EAAE,CAAC,GAAG,CAAC;QACnF,CAAC;QAED,gBAAgB;QAChB,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,WAAW,CAAC;IAClC,CAAC;IAED;;;;OAIG;IACH,QAAQ,CAAC,OAAe,EAAE,SAAiB,CAAC;QAC1C,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAEpE,IAAI,OAAO,GAAG,aAAa,SAAS,IAAI,CAAC;QACzC,OAAO,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAE/C,IAAI,MAAM,GAAG,CAAC,EAAE,CAAC;YACf,OAAO,IAAI,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9C,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,OAAe;QAClB,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;CACF;AAhLD,0DAgLC;AAED;;;;;GAKG;AACI,KAAK,UAAU,6BAA6B,CACjD,OAAY,EACZ,UAAkB,MAAM;IAExB,aAAa;IACb,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,wDAAa,OAAO,GAAC,CAAC;IAEjD,MAAM,OAAO,GAAG,IAAI,uBAAuB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5D,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,OAAO,CAAC,OAAe,EAAE,KAAa,EAAE,WAAmB,CAAC,EAAE,EAAE;QAC9D,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YAC1B,WAAW,GAAG,IAAI,CAAC;QACrB,CAAC;QAED,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QAEjC,uBAAuB;QACvB,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACjB,OAAO,CAAC,cAAc,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * CLI 工具函數
3
+ * 提供 CLI 相關的輔助功能
4
+ */
5
+ /**
6
+ * 獲取套件版本
7
+ * @returns 版本號
8
+ */
9
+ export declare function getVersion(): string;
10
+ /**
11
+ * 檢查 Cookie 是否存在並有效
12
+ * @param cookiePath 可選的 Cookie 檔案路徑
13
+ * @param quiet 是否安靜模式(不顯示提示)
14
+ * @returns Promise<string> 有效的 Cookie 字串或空字串
15
+ */
16
+ export declare function checkAndGetCookie(cookiePath?: string, quiet?: boolean): Promise<string>;
17
+ /**
18
+ * 格式化進度顯示
19
+ * @param current 當前進度
20
+ * @param total 總數
21
+ * @param width 進度條寬度
22
+ * @returns 格式化的進度條字串
23
+ */
24
+ export declare function formatProgress(current: number, total: number, width?: number): string;
25
+ /**
26
+ * 創建進度處理器
27
+ * @param spinner Ora 實例
28
+ * @param message 進度消息前綴
29
+ * @returns 進度回調函數
30
+ */
31
+ export declare function createProgressHandler(spinner: any, message: string): Promise<(current: number, total: number, progress?: number) => void>;
@@ -0,0 +1,171 @@
1
+ "use strict";
2
+ /**
3
+ * CLI 工具函數
4
+ * 提供 CLI 相關的輔助功能
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.getVersion = getVersion;
44
+ exports.checkAndGetCookie = checkAndGetCookie;
45
+ exports.formatProgress = formatProgress;
46
+ exports.createProgressHandler = createProgressHandler;
47
+ const fs_1 = __importDefault(require("fs"));
48
+ const path_1 = __importDefault(require("path"));
49
+ // 使用動態導入代替靜態導入
50
+ // import chalk from 'chalk';
51
+ // import ora from 'ora';
52
+ const auth_1 = require("../douyin/auth"); // Corrected path
53
+ const logger_1 = require("../utils/logger"); // Updated path to shared utils logger
54
+ /**
55
+ * 獲取套件版本
56
+ * @returns 版本號
57
+ */
58
+ function getVersion() {
59
+ try {
60
+ // 嘗試多個可能的路徑來找到 package.json
61
+ const possiblePaths = [
62
+ // 開發環境路徑:相對於 src/cli/utils.ts 的路徑
63
+ path_1.default.resolve(__dirname, '../../package.json'),
64
+ // 生產環境路徑:相對於 dist/cli/utils.js 的路徑
65
+ path_1.default.resolve(__dirname, '../../../package.json'),
66
+ // 絕對路徑:從專案根目錄開始
67
+ path_1.default.resolve(process.cwd(), 'package.json')
68
+ ];
69
+ // 嘗試每個路徑,直到找到有效的 package.json
70
+ let packageJson;
71
+ for (const packageJsonPath of possiblePaths) {
72
+ if (fs_1.default.existsSync(packageJsonPath)) {
73
+ packageJson = JSON.parse(fs_1.default.readFileSync(packageJsonPath, 'utf-8'));
74
+ logger_1.cliLogger.debug(`找到 package.json: ${packageJsonPath}`);
75
+ break;
76
+ }
77
+ }
78
+ if (!packageJson) {
79
+ logger_1.cliLogger.warn('無法找到 package.json 文件');
80
+ return '0.0.0';
81
+ }
82
+ return packageJson.version || '0.0.0';
83
+ }
84
+ catch (error) {
85
+ const err = error instanceof Error ? error : new Error(String(error));
86
+ logger_1.cliLogger.warn('無法獲取套件版本:', err);
87
+ return '0.0.0';
88
+ }
89
+ }
90
+ /**
91
+ * 檢查 Cookie 是否存在並有效
92
+ * @param cookiePath 可選的 Cookie 檔案路徑
93
+ * @param quiet 是否安靜模式(不顯示提示)
94
+ * @returns Promise<string> 有效的 Cookie 字串或空字串
95
+ */
96
+ async function checkAndGetCookie(cookiePath, quiet = false) {
97
+ // 動態導入 ESM 模塊
98
+ const [{ default: ora }, { default: chalk }] = await Promise.all([
99
+ Promise.resolve().then(() => __importStar(require('ora'))),
100
+ Promise.resolve().then(() => __importStar(require('chalk')))
101
+ ]);
102
+ const spinner = !quiet ? ora('檢查 Cookie...').start() : null;
103
+ try {
104
+ // 確定 Cookie 路徑
105
+ const finalPath = cookiePath || (0, auth_1.getDefaultCookiePath)();
106
+ // 檢查檔案是否存在
107
+ if (!fs_1.default.existsSync(finalPath)) {
108
+ spinner?.fail(`Cookie 檔案不存在: ${finalPath}`);
109
+ if (!quiet) {
110
+ console.log(chalk.yellow(`請執行 ${chalk.cyan('dydl login')} 先登入抖音`));
111
+ }
112
+ return '';
113
+ }
114
+ // 加載 Cookie
115
+ const cookie = await (0, auth_1.loadCookie)(finalPath);
116
+ if (!cookie) {
117
+ spinner?.fail(`Cookie 檔案為空: ${finalPath}`);
118
+ return '';
119
+ }
120
+ // 驗證 Cookie
121
+ const isValid = await (0, auth_1.isValidCookie)(cookie);
122
+ if (isValid) {
123
+ if (!quiet) { // Only show success message if not in quiet mode
124
+ spinner?.succeed(`Cookie 有效`);
125
+ }
126
+ return cookie;
127
+ }
128
+ else {
129
+ spinner?.fail(`Cookie 已過期或無效`);
130
+ if (!quiet) {
131
+ console.log(chalk.yellow(`請執行 ${chalk.cyan('dydl login')} 重新登入抖音`));
132
+ }
133
+ return '';
134
+ }
135
+ }
136
+ catch (error) {
137
+ spinner?.fail(`檢查 Cookie 時發生錯誤`);
138
+ const err = error instanceof Error ? error : new Error(String(error));
139
+ logger_1.cliLogger.error('檢查 Cookie 失敗:', err);
140
+ return '';
141
+ }
142
+ }
143
+ /**
144
+ * 格式化進度顯示
145
+ * @param current 當前進度
146
+ * @param total 總數
147
+ * @param width 進度條寬度
148
+ * @returns 格式化的進度條字串
149
+ */
150
+ function formatProgress(current, total, width = 30) {
151
+ const percent = total > 0 ? Math.min(Math.round((current / total) * 100), 100) : 0;
152
+ const filledWidth = Math.round(width * (percent / 100));
153
+ const emptyWidth = width - filledWidth;
154
+ const filledBar = '█'.repeat(filledWidth);
155
+ const emptyBar = '░'.repeat(emptyWidth);
156
+ return `${filledBar}${emptyBar} ${percent}% (${current}/${total})`;
157
+ }
158
+ /**
159
+ * 創建進度處理器
160
+ * @param spinner Ora 實例
161
+ * @param message 進度消息前綴
162
+ * @returns 進度回調函數
163
+ */
164
+ async function createProgressHandler(spinner, message) {
165
+ return (current, total, progress) => {
166
+ const progressBar = formatProgress(current, total);
167
+ const percentText = progress !== undefined ? ` ${Math.round(progress)}%` : '';
168
+ spinner.text = `${message} ${progressBar}${percentText}`;
169
+ };
170
+ }
171
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/cli/utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Cookie 路徑管理
3
+ * 提供跨平台的 Cookie 儲存路徑管理功能
4
+ */
5
+ /**
6
+ * 獲取應用程式資料目錄
7
+ * 根據作業系統選擇適當的目錄
8
+ * @returns 資料目錄路徑
9
+ */
10
+ export declare function getAppDataDir(): string;
11
+ /**
12
+ * 獲取預設 Cookie 檔案路徑
13
+ * @returns Cookie 檔案的完整路徑
14
+ */
15
+ export declare function getDefaultCookiePath(): string;
16
+ /**
17
+ * 確保 Cookie 目錄存在
18
+ * @param path Cookie 檔案路徑
19
+ * @returns Promise<void>
20
+ * @throws {CookieStorageError} 如果創建目錄失敗
21
+ */
22
+ export declare function ensureCookieDirectory(cookiePath: string): Promise<void>;
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ // Copied from src/auth/cookie-path.ts
3
+ // Original file path: src/auth/cookie-path.ts
4
+ /**
5
+ * Cookie 路徑管理
6
+ * 提供跨平台的 Cookie 儲存路徑管理功能
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.getAppDataDir = getAppDataDir;
13
+ exports.getDefaultCookiePath = getDefaultCookiePath;
14
+ exports.ensureCookieDirectory = ensureCookieDirectory;
15
+ const fs_extra_1 = __importDefault(require("fs-extra"));
16
+ const path_1 = __importDefault(require("path"));
17
+ const os_1 = __importDefault(require("os"));
18
+ const errors_1 = require("./errors");
19
+ const logger_1 = require("../../utils/logger"); // Updated path to shared utils logger
20
+ /**
21
+ * 獲取應用程式資料目錄
22
+ * 根據作業系統選擇適當的目錄
23
+ * @returns 資料目錄路徑
24
+ */
25
+ function getAppDataDir() {
26
+ const appName = 'dydl';
27
+ let dir;
28
+ switch (process.platform) {
29
+ case 'win32':
30
+ // Windows: %APPDATA%\\dydl
31
+ if (process.env.APPDATA) {
32
+ // 使用 Windows 風格的路徑分隔符
33
+ dir = path_1.default.join(process.env.APPDATA, appName);
34
+ }
35
+ else {
36
+ dir = path_1.default.join(os_1.default.homedir(), 'AppData', 'Roaming', appName);
37
+ }
38
+ break;
39
+ case 'darwin':
40
+ // macOS: ~/Library/Application Support/dydl
41
+ dir = path_1.default.join(os_1.default.homedir(), 'Library', 'Application Support', appName);
42
+ break;
43
+ default:
44
+ // Linux/其他: ~/.config/dydl
45
+ dir = path_1.default.join(os_1.default.homedir(), '.config', appName);
46
+ }
47
+ return dir;
48
+ }
49
+ /**
50
+ * 獲取預設 Cookie 檔案路徑
51
+ * @returns Cookie 檔案的完整路徑
52
+ */
53
+ function getDefaultCookiePath() {
54
+ return path_1.default.join(getAppDataDir(), 'cookie.txt');
55
+ }
56
+ /**
57
+ * 確保 Cookie 目錄存在
58
+ * @param path Cookie 檔案路徑
59
+ * @returns Promise<void>
60
+ * @throws {CookieStorageError} 如果創建目錄失敗
61
+ */
62
+ async function ensureCookieDirectory(cookiePath) {
63
+ try {
64
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(cookiePath));
65
+ logger_1.authLogger.debug(`已確保 Cookie 目錄存在: ${path_1.default.dirname(cookiePath)}`);
66
+ }
67
+ catch (error) {
68
+ const errorMessage = error instanceof Error ? error.message : String(error);
69
+ throw new errors_1.CookieStorageError(`無法創建 Cookie 目錄: ${errorMessage}`);
70
+ }
71
+ }
72
+ //# sourceMappingURL=cookie-path.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie-path.js","sourceRoot":"","sources":["../../../../src/douyin/auth/cookie-path.ts"],"names":[],"mappings":";AAAA,sCAAsC;AACtC,8CAA8C;AAC9C;;;GAGG;;;;;AAaH,sCAwBC;AAMD,oDAEC;AAQD,sDAQC;AA3DD,wDAA0B;AAC1B,gDAAwB;AACxB,4CAAoB;AACpB,qCAA8C;AAC9C,+CAA0D,CAAC,sCAAsC;AAEjG;;;;GAIG;AACH,SAAgB,aAAa;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC;IACvB,IAAI,GAAW,CAAC;IAEhB,QAAQ,OAAO,CAAC,QAAQ,EAAE,CAAC;QACzB,KAAK,OAAO;YACV,2BAA2B;YAC3B,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;gBACxB,sBAAsB;gBACtB,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChD,CAAC;iBAAM,CAAC;gBACN,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAC/D,CAAC;YACD,MAAM;QACR,KAAK,QAAQ;YACX,4CAA4C;YAC5C,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,OAAO,CAAC,CAAC;YACzE,MAAM;QACR;YACE,2BAA2B;YAC3B,GAAG,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAgB,oBAAoB;IAClC,OAAO,cAAI,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,YAAY,CAAC,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,qBAAqB,CAAC,UAAkB;IAC5D,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,SAAS,CAAC,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7C,mBAAM,CAAC,KAAK,CAAC,oBAAoB,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IAC/D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,IAAI,2BAAkB,CAAC,mBAAmB,YAAY,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Cookie 儲存與讀取
3
+ * 提供 Cookie 檔案操作功能
4
+ */
5
+ /**
6
+ * 儲存 Cookie 到檔案
7
+ * @param cookieString Cookie 字串
8
+ * @param path 檔案路徑,如未指定則使用預設路徑
9
+ * @returns Promise<string> 儲存成功的檔案路徑
10
+ * @throws {CookieStorageError} 如果儲存失敗
11
+ */
12
+ export declare function saveCookie(cookieString: string, filePath?: string): Promise<string>;
13
+ /**
14
+ * 從檔案加載 Cookie
15
+ * @param filePath 檔案路徑,如未指定則使用預設路徑
16
+ * @returns Promise<string> Cookie 字串,或在檔案不存在時返回空字串
17
+ * @throws {CookieStorageError} 如果讀取失敗
18
+ */
19
+ export declare function loadCookie(filePath?: string): Promise<string>;
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ // Copied from src/auth/cookie-storage.ts
3
+ // Original file path: src/auth/cookie-storage.ts
4
+ /**
5
+ * Cookie 儲存與讀取
6
+ * 提供 Cookie 檔案操作功能
7
+ */
8
+ var __importDefault = (this && this.__importDefault) || function (mod) {
9
+ return (mod && mod.__esModule) ? mod : { "default": mod };
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.saveCookie = saveCookie;
13
+ exports.loadCookie = loadCookie;
14
+ const fs_extra_1 = __importDefault(require("fs-extra"));
15
+ const cookie_path_1 = require("./cookie-path");
16
+ const errors_1 = require("./errors");
17
+ const logger_1 = require("../../utils/logger"); // Updated path to shared utils logger
18
+ /**
19
+ * 儲存 Cookie 到檔案
20
+ * @param cookieString Cookie 字串
21
+ * @param path 檔案路徑,如未指定則使用預設路徑
22
+ * @returns Promise<string> 儲存成功的檔案路徑
23
+ * @throws {CookieStorageError} 如果儲存失敗
24
+ */
25
+ async function saveCookie(cookieString, filePath) {
26
+ const cookiePath = filePath || (0, cookie_path_1.getDefaultCookiePath)();
27
+ try {
28
+ // 確保目錄存在
29
+ await (0, cookie_path_1.ensureCookieDirectory)(cookiePath);
30
+ // 寫入 Cookie
31
+ await fs_extra_1.default.writeFile(cookiePath, cookieString, 'utf-8');
32
+ logger_1.authLogger.debug(`Cookie 已儲存至 ${cookiePath}`);
33
+ return cookiePath;
34
+ }
35
+ catch (error) {
36
+ const errorMessage = error instanceof Error ? error.message : String(error);
37
+ throw new errors_1.CookieStorageError(`無法儲存 Cookie 至 ${cookiePath}: ${errorMessage}`);
38
+ }
39
+ }
40
+ /**
41
+ * 從檔案加載 Cookie
42
+ * @param filePath 檔案路徑,如未指定則使用預設路徑
43
+ * @returns Promise<string> Cookie 字串,或在檔案不存在時返回空字串
44
+ * @throws {CookieStorageError} 如果讀取失敗
45
+ */
46
+ async function loadCookie(filePath) {
47
+ const cookiePath = filePath || (0, cookie_path_1.getDefaultCookiePath)();
48
+ try {
49
+ // 檢查檔案是否存在
50
+ if (await fs_extra_1.default.pathExists(cookiePath)) {
51
+ const cookie = await fs_extra_1.default.readFile(cookiePath, 'utf-8');
52
+ logger_1.authLogger.debug(`已從 ${cookiePath} 載入 Cookie`);
53
+ return cookie.trim();
54
+ }
55
+ else {
56
+ logger_1.authLogger.warn(`Cookie 檔案不存在: ${cookiePath}`);
57
+ return '';
58
+ }
59
+ }
60
+ catch (error) {
61
+ const errorMessage = error instanceof Error ? error.message : String(error);
62
+ throw new errors_1.CookieStorageError(`無法讀取 Cookie 從 ${cookiePath}: ${errorMessage}`);
63
+ }
64
+ }
65
+ //# sourceMappingURL=cookie-storage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cookie-storage.js","sourceRoot":"","sources":["../../../../src/douyin/auth/cookie-storage.ts"],"names":[],"mappings":";AAAA,yCAAyC;AACzC,iDAAiD;AACjD;;;GAGG;;;;;AAcH,gCAgBC;AAQD,gCAiBC;AArDD,wDAA0B;AAC1B,+CAA4E;AAC5E,qCAA8C;AAC9C,+CAA0D,CAAC,sCAAsC;AAEjG;;;;;;GAMG;AACI,KAAK,UAAU,UAAU,CAAC,YAAoB,EAAE,QAAiB;IACtE,MAAM,UAAU,GAAG,QAAQ,IAAI,IAAA,kCAAoB,GAAE,CAAC;IAEtD,IAAI,CAAC;QACH,SAAS;QACT,MAAM,IAAA,mCAAqB,EAAC,UAAU,CAAC,CAAC;QAExC,YAAY;QACZ,MAAM,kBAAE,CAAC,SAAS,CAAC,UAAU,EAAE,YAAY,EAAE,OAAO,CAAC,CAAC;QACtD,mBAAM,CAAC,KAAK,CAAC,eAAe,UAAU,EAAE,CAAC,CAAC;QAE1C,OAAO,UAAU,CAAC;IACpB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,IAAI,2BAAkB,CAAC,iBAAiB,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACI,KAAK,UAAU,UAAU,CAAC,QAAiB;IAChD,MAAM,UAAU,GAAG,QAAQ,IAAI,IAAA,kCAAoB,GAAE,CAAC;IAEtD,IAAI,CAAC;QACH,WAAW;QACX,IAAI,MAAM,kBAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACpC,MAAM,MAAM,GAAG,MAAM,kBAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACtD,mBAAM,CAAC,KAAK,CAAC,MAAM,UAAU,YAAY,CAAC,CAAC;YAC3C,OAAO,MAAM,CAAC,IAAI,EAAE,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,mBAAM,CAAC,IAAI,CAAC,iBAAiB,UAAU,EAAE,CAAC,CAAC;YAC3C,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,YAAY,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5E,MAAM,IAAI,2BAAkB,CAAC,iBAAiB,UAAU,KAAK,YAAY,EAAE,CAAC,CAAC;IAC/E,CAAC;AACH,CAAC"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * 錯誤類型定義
3
+ * 提供認證與登入模組相關的特定錯誤類型
4
+ */
5
+ /**
6
+ * 登入錯誤
7
+ * 用於表示登入過程中發生的錯誤
8
+ */
9
+ export declare class LoginError extends Error {
10
+ cause?: any;
11
+ constructor(message: string, cause?: any);
12
+ }
13
+ /**
14
+ * Cookie 驗證錯誤
15
+ * 用於表示 Cookie 驗證過程中發生的錯誤
16
+ */
17
+ export declare class CookieValidationError extends Error {
18
+ cause?: any;
19
+ constructor(message: string, cause?: any);
20
+ }
21
+ /**
22
+ * Cookie 存儲錯誤
23
+ * 用於表示 Cookie 儲存或讀取過程中發生的錯誤
24
+ */
25
+ export declare class CookieStorageError extends Error {
26
+ cause?: any;
27
+ constructor(message: string, cause?: any);
28
+ }