offcourse 1.0.0 → 1.0.1

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 (258) hide show
  1. package/dist/cli/commands/config.js.map +1 -1
  2. package/dist/cli/commands/inspect.js +1 -1
  3. package/dist/cli/commands/inspect.js.map +1 -1
  4. package/dist/cli/commands/sync.d.ts +1 -2
  5. package/dist/cli/commands/sync.d.ts.map +1 -1
  6. package/dist/cli/commands/sync.js +13 -14
  7. package/dist/cli/commands/sync.js.map +1 -1
  8. package/dist/cli/commands/syncHighLevel.d.ts +1 -2
  9. package/dist/cli/commands/syncHighLevel.d.ts.map +1 -1
  10. package/dist/cli/commands/syncHighLevel.js +4 -8
  11. package/dist/cli/commands/syncHighLevel.js.map +1 -1
  12. package/dist/cli/index.js +1 -1
  13. package/dist/cli/index.js.map +1 -1
  14. package/dist/config/configManager.d.ts.map +1 -1
  15. package/dist/config/configManager.js +4 -0
  16. package/dist/config/configManager.js.map +1 -1
  17. package/dist/downloader/hlsDownloader.d.ts.map +1 -1
  18. package/dist/downloader/hlsDownloader.js +23 -14
  19. package/dist/downloader/hlsDownloader.js.map +1 -1
  20. package/dist/downloader/hlsValidator.d.ts.map +1 -1
  21. package/dist/downloader/hlsValidator.js +6 -2
  22. package/dist/downloader/hlsValidator.js.map +1 -1
  23. package/dist/downloader/index.d.ts +3 -0
  24. package/dist/downloader/index.d.ts.map +1 -1
  25. package/dist/downloader/index.js +3 -0
  26. package/dist/downloader/index.js.map +1 -1
  27. package/dist/downloader/loomDownloader.d.ts.map +1 -1
  28. package/dist/downloader/loomDownloader.js +23 -20
  29. package/dist/downloader/loomDownloader.js.map +1 -1
  30. package/dist/downloader/queue.d.ts +4 -4
  31. package/dist/downloader/queue.d.ts.map +1 -1
  32. package/dist/downloader/queue.js.map +1 -1
  33. package/dist/downloader/vimeoDownloader.d.ts.map +1 -1
  34. package/dist/downloader/vimeoDownloader.js +7 -3
  35. package/dist/downloader/vimeoDownloader.js.map +1 -1
  36. package/dist/scraper/extractor.d.ts +4 -0
  37. package/dist/scraper/extractor.d.ts.map +1 -1
  38. package/dist/scraper/extractor.js +79 -79
  39. package/dist/scraper/extractor.js.map +1 -1
  40. package/dist/scraper/highlevel/extractor.d.ts +11 -19
  41. package/dist/scraper/highlevel/extractor.d.ts.map +1 -1
  42. package/dist/scraper/highlevel/extractor.js +72 -85
  43. package/dist/scraper/highlevel/extractor.js.map +1 -1
  44. package/dist/scraper/highlevel/navigator.d.ts +3 -10
  45. package/dist/scraper/highlevel/navigator.d.ts.map +1 -1
  46. package/dist/scraper/highlevel/navigator.js +140 -127
  47. package/dist/scraper/highlevel/navigator.js.map +1 -1
  48. package/dist/scraper/highlevel/schemas.d.ts +188 -0
  49. package/dist/scraper/highlevel/schemas.d.ts.map +1 -0
  50. package/dist/scraper/highlevel/schemas.js +139 -0
  51. package/dist/scraper/highlevel/schemas.js.map +1 -0
  52. package/dist/scraper/navigator.d.ts +14 -11
  53. package/dist/scraper/navigator.d.ts.map +1 -1
  54. package/dist/scraper/navigator.js +61 -104
  55. package/dist/scraper/navigator.js.map +1 -1
  56. package/dist/scraper/schemas.d.ts +57 -0
  57. package/dist/scraper/schemas.d.ts.map +1 -0
  58. package/dist/scraper/schemas.js +135 -0
  59. package/dist/scraper/schemas.js.map +1 -0
  60. package/dist/scraper/videoInterceptor.d.ts +4 -0
  61. package/dist/scraper/videoInterceptor.d.ts.map +1 -1
  62. package/dist/scraper/videoInterceptor.js +66 -51
  63. package/dist/scraper/videoInterceptor.js.map +1 -1
  64. package/dist/shared/auth.d.ts +9 -9
  65. package/dist/shared/auth.d.ts.map +1 -1
  66. package/dist/shared/auth.js +24 -38
  67. package/dist/shared/auth.js.map +1 -1
  68. package/dist/shared/firebase.d.ts +60 -0
  69. package/dist/shared/firebase.d.ts.map +1 -0
  70. package/dist/shared/firebase.js +102 -0
  71. package/dist/shared/firebase.js.map +1 -0
  72. package/dist/shared/fs.d.ts.map +1 -1
  73. package/dist/shared/fs.js +4 -0
  74. package/dist/shared/fs.js.map +1 -1
  75. package/dist/shared/index.d.ts +3 -0
  76. package/dist/shared/index.d.ts.map +1 -1
  77. package/dist/shared/index.js +3 -0
  78. package/dist/shared/index.js.map +1 -1
  79. package/dist/shared/slug.d.ts +11 -0
  80. package/dist/shared/slug.d.ts.map +1 -0
  81. package/{src/shared/slug.ts → dist/shared/slug.js} +10 -11
  82. package/dist/shared/slug.js.map +1 -0
  83. package/dist/shared/url.d.ts +43 -0
  84. package/dist/shared/url.d.ts.map +1 -0
  85. package/{src/shared/url.ts → dist/shared/url.js} +12 -15
  86. package/dist/shared/url.js.map +1 -0
  87. package/dist/state/database.d.ts +1 -0
  88. package/dist/state/database.d.ts.map +1 -1
  89. package/dist/state/database.js +3 -0
  90. package/dist/state/database.js.map +1 -1
  91. package/dist/storage/fileSystem.d.ts +17 -17
  92. package/dist/storage/fileSystem.d.ts.map +1 -1
  93. package/dist/storage/fileSystem.js +39 -31
  94. package/dist/storage/fileSystem.js.map +1 -1
  95. package/package.json +5 -2
  96. package/.github/workflows/ci.yml +0 -50
  97. package/.husky/commit-msg +0 -2
  98. package/.husky/pre-commit +0 -1
  99. package/.husky/pre-push +0 -3
  100. package/.prettierrc +0 -8
  101. package/.release-it.json +0 -23
  102. package/ARCHITECTURE.md +0 -233
  103. package/CHANGELOG.md +0 -78
  104. package/commitlint.config.js +0 -4
  105. package/dist/ai/openRouter.d.ts +0 -47
  106. package/dist/ai/openRouter.d.ts.map +0 -1
  107. package/dist/ai/openRouter.js +0 -116
  108. package/dist/ai/openRouter.js.map +0 -1
  109. package/dist/ai/transcriptPolisher.d.ts +0 -24
  110. package/dist/ai/transcriptPolisher.d.ts.map +0 -1
  111. package/dist/ai/transcriptPolisher.js +0 -89
  112. package/dist/ai/transcriptPolisher.js.map +0 -1
  113. package/dist/cli/commands/enrich.d.ts +0 -14
  114. package/dist/cli/commands/enrich.d.ts.map +0 -1
  115. package/dist/cli/commands/enrich.js +0 -271
  116. package/dist/cli/commands/enrich.js.map +0 -1
  117. package/dist/cli/commands/syncGhl.d.ts +0 -20
  118. package/dist/cli/commands/syncGhl.d.ts.map +0 -1
  119. package/dist/cli/commands/syncGhl.js +0 -483
  120. package/dist/cli/commands/syncGhl.js.map +0 -1
  121. package/dist/cli/commands/syncHighLevel.test.d.ts +0 -2
  122. package/dist/cli/commands/syncHighLevel.test.d.ts.map +0 -1
  123. package/dist/cli/commands/syncHighLevel.test.js +0 -102
  124. package/dist/cli/commands/syncHighLevel.test.js.map +0 -1
  125. package/dist/config/paths.test.d.ts +0 -2
  126. package/dist/config/paths.test.d.ts.map +0 -1
  127. package/dist/config/paths.test.js +0 -70
  128. package/dist/config/paths.test.js.map +0 -1
  129. package/dist/config/schema.test.d.ts +0 -2
  130. package/dist/config/schema.test.d.ts.map +0 -1
  131. package/dist/config/schema.test.js +0 -151
  132. package/dist/config/schema.test.js.map +0 -1
  133. package/dist/downloader/hlsDownloader.test.d.ts +0 -2
  134. package/dist/downloader/hlsDownloader.test.d.ts.map +0 -1
  135. package/dist/downloader/hlsDownloader.test.js +0 -116
  136. package/dist/downloader/hlsDownloader.test.js.map +0 -1
  137. package/dist/downloader/loomDownloader.test.d.ts +0 -2
  138. package/dist/downloader/loomDownloader.test.d.ts.map +0 -1
  139. package/dist/downloader/loomDownloader.test.js +0 -36
  140. package/dist/downloader/loomDownloader.test.js.map +0 -1
  141. package/dist/downloader/queue.test.d.ts +0 -2
  142. package/dist/downloader/queue.test.d.ts.map +0 -1
  143. package/dist/downloader/queue.test.js +0 -158
  144. package/dist/downloader/queue.test.js.map +0 -1
  145. package/dist/downloader/videoDownloader.d.ts +0 -32
  146. package/dist/downloader/videoDownloader.d.ts.map +0 -1
  147. package/dist/downloader/videoDownloader.js +0 -173
  148. package/dist/downloader/videoDownloader.js.map +0 -1
  149. package/dist/downloader/vimeoDownloader.test.d.ts +0 -2
  150. package/dist/downloader/vimeoDownloader.test.d.ts.map +0 -1
  151. package/dist/downloader/vimeoDownloader.test.js +0 -51
  152. package/dist/downloader/vimeoDownloader.test.js.map +0 -1
  153. package/dist/scraper/auth.d.ts +0 -29
  154. package/dist/scraper/auth.d.ts.map +0 -1
  155. package/dist/scraper/auth.js +0 -115
  156. package/dist/scraper/auth.js.map +0 -1
  157. package/dist/scraper/extractor.test.d.ts +0 -2
  158. package/dist/scraper/extractor.test.d.ts.map +0 -1
  159. package/dist/scraper/extractor.test.js +0 -65
  160. package/dist/scraper/extractor.test.js.map +0 -1
  161. package/dist/scraper/ghl/auth.d.ts +0 -25
  162. package/dist/scraper/ghl/auth.d.ts.map +0 -1
  163. package/dist/scraper/ghl/auth.js +0 -187
  164. package/dist/scraper/ghl/auth.js.map +0 -1
  165. package/dist/scraper/ghl/extractor.d.ts +0 -96
  166. package/dist/scraper/ghl/extractor.d.ts.map +0 -1
  167. package/dist/scraper/ghl/extractor.js +0 -345
  168. package/dist/scraper/ghl/extractor.js.map +0 -1
  169. package/dist/scraper/ghl/index.d.ts +0 -4
  170. package/dist/scraper/ghl/index.d.ts.map +0 -1
  171. package/dist/scraper/ghl/index.js +0 -4
  172. package/dist/scraper/ghl/index.js.map +0 -1
  173. package/dist/scraper/ghl/navigator.d.ts +0 -93
  174. package/dist/scraper/ghl/navigator.d.ts.map +0 -1
  175. package/dist/scraper/ghl/navigator.js +0 -447
  176. package/dist/scraper/ghl/navigator.js.map +0 -1
  177. package/dist/scraper/highlevel/auth.d.ts +0 -25
  178. package/dist/scraper/highlevel/auth.d.ts.map +0 -1
  179. package/dist/scraper/highlevel/auth.js +0 -189
  180. package/dist/scraper/highlevel/auth.js.map +0 -1
  181. package/dist/scraper/highlevel/extractor.test.d.ts +0 -2
  182. package/dist/scraper/highlevel/extractor.test.d.ts.map +0 -1
  183. package/dist/scraper/highlevel/extractor.test.js +0 -101
  184. package/dist/scraper/highlevel/extractor.test.js.map +0 -1
  185. package/dist/scraper/highlevel/navigator.test.d.ts +0 -2
  186. package/dist/scraper/highlevel/navigator.test.d.ts.map +0 -1
  187. package/dist/scraper/highlevel/navigator.test.js +0 -78
  188. package/dist/scraper/highlevel/navigator.test.js.map +0 -1
  189. package/dist/scraper/navigator.test.d.ts +0 -2
  190. package/dist/scraper/navigator.test.d.ts.map +0 -1
  191. package/dist/scraper/navigator.test.js +0 -63
  192. package/dist/scraper/navigator.test.js.map +0 -1
  193. package/dist/scraper/skoolApi.d.ts +0 -17
  194. package/dist/scraper/skoolApi.d.ts.map +0 -1
  195. package/dist/scraper/skoolApi.js +0 -72
  196. package/dist/scraper/skoolApi.js.map +0 -1
  197. package/dist/state/database.test.d.ts +0 -2
  198. package/dist/state/database.test.d.ts.map +0 -1
  199. package/dist/state/database.test.js +0 -34
  200. package/dist/state/database.test.js.map +0 -1
  201. package/dist/transcription/whisperService.d.ts +0 -27
  202. package/dist/transcription/whisperService.d.ts.map +0 -1
  203. package/dist/transcription/whisperService.js +0 -102
  204. package/dist/transcription/whisperService.js.map +0 -1
  205. package/eslint.config.js +0 -55
  206. package/src/__fixtures__/highlevel-post-response.json +0 -68
  207. package/src/__fixtures__/hls-master-playlist.m3u8 +0 -24
  208. package/src/cli/commands/__snapshots__/syncHighLevel.test.ts.snap +0 -38
  209. package/src/cli/commands/config.ts +0 -74
  210. package/src/cli/commands/inspect.ts +0 -441
  211. package/src/cli/commands/login.ts +0 -68
  212. package/src/cli/commands/status.ts +0 -147
  213. package/src/cli/commands/sync.ts +0 -1235
  214. package/src/cli/commands/syncHighLevel.test.ts +0 -144
  215. package/src/cli/commands/syncHighLevel.ts +0 -639
  216. package/src/cli/index.ts +0 -121
  217. package/src/config/configManager.ts +0 -75
  218. package/src/config/paths.test.ts +0 -83
  219. package/src/config/paths.ts +0 -36
  220. package/src/config/schema.test.ts +0 -173
  221. package/src/config/schema.ts +0 -65
  222. package/src/downloader/hlsDownloader.test.ts +0 -148
  223. package/src/downloader/hlsDownloader.ts +0 -327
  224. package/src/downloader/hlsValidator.ts +0 -196
  225. package/src/downloader/index.ts +0 -122
  226. package/src/downloader/loomDownloader.test.ts +0 -43
  227. package/src/downloader/loomDownloader.ts +0 -742
  228. package/src/downloader/queue.test.ts +0 -199
  229. package/src/downloader/queue.ts +0 -118
  230. package/src/downloader/vimeoDownloader.test.ts +0 -62
  231. package/src/downloader/vimeoDownloader.ts +0 -722
  232. package/src/scraper/extractor.test.ts +0 -124
  233. package/src/scraper/extractor.ts +0 -757
  234. package/src/scraper/highlevel/__snapshots__/extractor.test.ts.snap +0 -41
  235. package/src/scraper/highlevel/extractor.test.ts +0 -134
  236. package/src/scraper/highlevel/extractor.ts +0 -537
  237. package/src/scraper/highlevel/index.ts +0 -2
  238. package/src/scraper/highlevel/navigator.test.ts +0 -110
  239. package/src/scraper/highlevel/navigator.ts +0 -668
  240. package/src/scraper/highlevel/schemas.ts +0 -183
  241. package/src/scraper/navigator.test.ts +0 -122
  242. package/src/scraper/navigator.ts +0 -355
  243. package/src/scraper/schemas.ts +0 -177
  244. package/src/scraper/videoInterceptor.ts +0 -435
  245. package/src/shared/auth.test.ts +0 -58
  246. package/src/shared/auth.ts +0 -251
  247. package/src/shared/firebase.ts +0 -151
  248. package/src/shared/fs.ts +0 -80
  249. package/src/shared/http.ts +0 -34
  250. package/src/shared/index.ts +0 -6
  251. package/src/shared/url.test.ts +0 -122
  252. package/src/state/database.test.ts +0 -49
  253. package/src/state/database.ts +0 -919
  254. package/src/state/index.ts +0 -14
  255. package/src/storage/fileSystem.test.ts +0 -64
  256. package/src/storage/fileSystem.ts +0 -175
  257. package/tsconfig.json +0 -28
  258. package/vitest.config.ts +0 -29
@@ -1,116 +0,0 @@
1
- import { config } from "dotenv";
2
- // Load .env file
3
- config();
4
- const OPENROUTER_API_URL = "https://openrouter.ai/api/v1/chat/completions";
5
- // Track cumulative usage across calls
6
- let cumulativeUsage = {
7
- promptTokens: 0,
8
- completionTokens: 0,
9
- totalTokens: 0,
10
- cost: undefined,
11
- };
12
- /**
13
- * Get cumulative usage stats for the current session.
14
- */
15
- export function getCumulativeUsage() {
16
- return { ...cumulativeUsage };
17
- }
18
- /**
19
- * Reset cumulative usage stats.
20
- */
21
- export function resetCumulativeUsage() {
22
- cumulativeUsage = {
23
- promptTokens: 0,
24
- completionTokens: 0,
25
- totalTokens: 0,
26
- cost: undefined,
27
- };
28
- }
29
- /**
30
- * Get the OpenRouter API key from environment.
31
- */
32
- function getApiKey() {
33
- const key = process.env.OPENROUTER_API_KEY;
34
- if (!key) {
35
- throw new Error("OPENROUTER_API_KEY not set. Add it to .env file or set as environment variable.");
36
- }
37
- return key;
38
- }
39
- /**
40
- * Get the default model from environment or use fallback.
41
- */
42
- function getDefaultModel() {
43
- return process.env.OPENROUTER_MODEL ?? "anthropic/claude-3.5-sonnet";
44
- }
45
- /**
46
- * Check if OpenRouter is configured.
47
- */
48
- export function isConfigured() {
49
- return !!process.env.OPENROUTER_API_KEY;
50
- }
51
- /**
52
- * Send a chat completion request to OpenRouter.
53
- * Returns full result with usage info.
54
- */
55
- export async function chatWithUsage(messages, options = {}) {
56
- const apiKey = getApiKey();
57
- const model = options.model ?? getDefaultModel();
58
- const response = await fetch(OPENROUTER_API_URL, {
59
- method: "POST",
60
- headers: {
61
- Authorization: `Bearer ${apiKey}`,
62
- "Content-Type": "application/json",
63
- "HTTP-Referer": "https://github.com/course-grab",
64
- "X-Title": "course-grab",
65
- },
66
- body: JSON.stringify({
67
- model,
68
- messages,
69
- max_tokens: options.maxTokens ?? 4096,
70
- temperature: options.temperature ?? 0.3,
71
- }),
72
- });
73
- if (!response.ok) {
74
- const error = await response.text();
75
- throw new Error(`OpenRouter API error: ${response.status} - ${error}`);
76
- }
77
- const data = (await response.json());
78
- const usage = {
79
- promptTokens: data.usage?.prompt_tokens ?? 0,
80
- completionTokens: data.usage?.completion_tokens ?? 0,
81
- totalTokens: data.usage?.total_tokens ?? 0,
82
- cost: data.total_cost,
83
- };
84
- // Accumulate usage
85
- cumulativeUsage.promptTokens += usage.promptTokens;
86
- cumulativeUsage.completionTokens += usage.completionTokens;
87
- cumulativeUsage.totalTokens += usage.totalTokens;
88
- if (usage.cost !== undefined) {
89
- cumulativeUsage.cost = (cumulativeUsage.cost ?? 0) + usage.cost;
90
- }
91
- return {
92
- content: data.choices[0]?.message?.content ?? "",
93
- usage,
94
- model: data.model ?? model,
95
- };
96
- }
97
- /**
98
- * Send a chat completion request to OpenRouter.
99
- * Simple version that just returns the content string.
100
- */
101
- export async function chat(messages, options = {}) {
102
- const result = await chatWithUsage(messages, options);
103
- return result.content;
104
- }
105
- /**
106
- * Simple prompt helper.
107
- */
108
- export async function prompt(userPrompt, systemPrompt, options) {
109
- const messages = [];
110
- if (systemPrompt) {
111
- messages.push({ role: "system", content: systemPrompt });
112
- }
113
- messages.push({ role: "user", content: userPrompt });
114
- return chat(messages, options);
115
- }
116
- //# sourceMappingURL=openRouter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openRouter.js","sourceRoot":"","sources":["../../src/ai/openRouter.ts"],"names":[],"mappings":"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"}
@@ -1,24 +0,0 @@
1
- export interface PolishedTranscript {
2
- summary: string;
3
- transcript: string;
4
- }
5
- /**
6
- * Convert folder name to readable title.
7
- * "01-1-herzlich-willkommen" → "Herzlich Willkommen"
8
- * "02-onboarding-social-leads-academy" → "Onboarding Social Leads Academy"
9
- */
10
- export declare function folderNameToTitle(folderName: string): string;
11
- /**
12
- * Polish a transcript using an LLM.
13
- * Returns separate summary and transcript.
14
- */
15
- export declare function polishTranscript(rawTranscript: string): Promise<PolishedTranscript>;
16
- /**
17
- * Generate a module summary from multiple lesson summaries.
18
- */
19
- export declare function generateModuleSummary(moduleName: string, lessonSummaries: Array<{
20
- name: string;
21
- title: string;
22
- summary: string;
23
- }>): Promise<string>;
24
- //# sourceMappingURL=transcriptPolisher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transcriptPolisher.d.ts","sourceRoot":"","sources":["../../src/ai/transcriptPolisher.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAW5D;AAkCD;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA0BzF;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,GACvE,OAAO,CAAC,MAAM,CAAC,CAkBjB"}
@@ -1,89 +0,0 @@
1
- import { prompt, isConfigured } from "./openRouter.js";
2
- /**
3
- * Convert folder name to readable title.
4
- * "01-1-herzlich-willkommen" → "Herzlich Willkommen"
5
- * "02-onboarding-social-leads-academy" → "Onboarding Social Leads Academy"
6
- */
7
- export function folderNameToTitle(folderName) {
8
- return folderName
9
- // Remove leading numbers and separators (e.g., "01-1-", "02-")
10
- .replace(/^[\d]+-[\d]*-?/, "")
11
- // Replace remaining dashes with spaces
12
- .replace(/-/g, " ")
13
- // Capitalize each word
14
- .split(" ")
15
- .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
16
- .join(" ")
17
- .trim();
18
- }
19
- const SYSTEM_PROMPT = `Du bist ein Experte für die Aufbereitung von Video-Transkripten.
20
-
21
- Deine Aufgabe:
22
- 1. Erstelle eine kurze TLDR-Zusammenfassung (2-3 Sätze)
23
- 2. Strukturiere den Text in sinnvolle Absätze
24
- 3. Füge Markdown-Formatierung hinzu:
25
- - **Fettschrift** für wichtige Begriffe und Kernaussagen
26
- - *Kursiv* für Betonungen
27
- - Überschriften (## oder ###) für klare Themenwechsel
28
- - Aufzählungen wo es Sinn macht
29
-
30
- Regeln:
31
- - Behalte den Originaltext bei, ändere keine Wörter
32
- - Korrigiere nur offensichtliche Transkriptionsfehler
33
- - Füge Absätze an natürlichen Sprechpausen ein
34
- - Halte alles auf Deutsch`;
35
- const USER_PROMPT_TEMPLATE = `Hier ist ein Video-Transkript das aufbereitet werden soll:
36
-
37
- ---
38
- {transcript}
39
- ---
40
-
41
- Antworte in folgendem Format:
42
-
43
- ## TLDR
44
- [2-3 Sätze Zusammenfassung]
45
-
46
- ## Transkript
47
-
48
- [Aufbereiteter Text mit Markdown-Formatierung]`;
49
- /**
50
- * Polish a transcript using an LLM.
51
- * Returns separate summary and transcript.
52
- */
53
- export async function polishTranscript(rawTranscript) {
54
- if (!isConfigured()) {
55
- return {
56
- summary: "",
57
- transcript: rawTranscript,
58
- };
59
- }
60
- const userPrompt = USER_PROMPT_TEMPLATE.replace("{transcript}", rawTranscript);
61
- const result = await prompt(userPrompt, SYSTEM_PROMPT, {
62
- maxTokens: 8192,
63
- temperature: 0.2,
64
- });
65
- // Parse the response
66
- const tldrMatch = result.match(/## TLDR\s*\n+([\s\S]*?)(?=\n## Transkript|$)/i);
67
- const transcriptMatch = result.match(/## Transkript\s*\n+([\s\S]*?)$/i);
68
- const summary = tldrMatch?.[1]?.trim() ?? "";
69
- const transcript = transcriptMatch?.[1]?.trim() ?? result;
70
- return {
71
- summary,
72
- transcript,
73
- };
74
- }
75
- /**
76
- * Generate a module summary from multiple lesson summaries.
77
- */
78
- export async function generateModuleSummary(moduleName, lessonSummaries) {
79
- if (!isConfigured() || lessonSummaries.length === 0) {
80
- return "";
81
- }
82
- const moduleTitle = folderNameToTitle(moduleName);
83
- const summariesText = lessonSummaries
84
- .map((l, i) => `### ${i + 1}. ${l.title}\n${l.summary}`)
85
- .join("\n\n");
86
- const result = await prompt(`Hier sind die Zusammenfassungen aller Lektionen des Moduls "${moduleTitle}":\n\n${summariesText}\n\nErstelle eine übergreifende Zusammenfassung des gesamten Moduls (5-8 Sätze). Fasse die wichtigsten Lernziele und Kernkonzepte zusammen.`, "Du bist ein Experte für Kurszusammenfassungen. Antworte auf Deutsch in klarem, präzisem Stil.", { maxTokens: 512, temperature: 0.3 });
87
- return `# Zusammenfassung: ${moduleTitle}\n\n${result.trim()}\n\n---\n\n## Lektionen\n\n${summariesText}`;
88
- }
89
- //# sourceMappingURL=transcriptPolisher.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"transcriptPolisher.js","sourceRoot":"","sources":["../../src/ai/transcriptPolisher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAOvD;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,UAAkB;IAClD,OAAO,UAAU;QACf,+DAA+D;SAC9D,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC;QAC9B,uCAAuC;SACtC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC;QACnB,uBAAuB;SACtB,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,GAAG,CAAC;SACT,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,aAAa,GAAG;;;;;;;;;;;;;;;0BAeI,CAAC;AAE3B,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;+CAakB,CAAC;AAEhD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,aAAqB;IAC1D,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC;QACpB,OAAO;YACL,OAAO,EAAE,EAAE;YACX,UAAU,EAAE,aAAa;SAC1B,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,oBAAoB,CAAC,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAE/E,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,EAAE,aAAa,EAAE;QACrD,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,GAAG;KACjB,CAAC,CAAC;IAEH,qBAAqB;IACrB,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAChF,MAAM,eAAe,GAAG,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAExE,MAAM,OAAO,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7C,MAAM,UAAU,GAAG,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,MAAM,CAAC;IAE1D,OAAO;QACL,OAAO;QACP,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAAkB,EAClB,eAAwE;IAExE,IAAI,CAAC,YAAY,EAAE,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,WAAW,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;IAElD,MAAM,aAAa,GAAG,eAAe;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;SACvD,IAAI,CAAC,MAAM,CAAC,CAAC;IAEhB,MAAM,MAAM,GAAG,MAAM,MAAM,CACzB,+DAA+D,WAAW,SAAS,aAAa,6IAA6I,EAC7O,+FAA+F,EAC/F,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CACrC,CAAC;IAEF,OAAO,sBAAsB,WAAW,OAAO,MAAM,CAAC,IAAI,EAAE,8BAA8B,aAAa,EAAE,CAAC;AAC5G,CAAC"}
@@ -1,14 +0,0 @@
1
- import { type WhisperModel } from "../../transcription/whisperService.js";
2
- interface EnrichOptions {
3
- model?: WhisperModel;
4
- language?: string;
5
- force?: boolean;
6
- limit?: number;
7
- polish?: boolean;
8
- }
9
- /**
10
- * Enrich command - transcribe videos in a course directory.
11
- */
12
- export declare function enrichCommand(courseDir: string, options: EnrichOptions): Promise<void>;
13
- export {};
14
- //# sourceMappingURL=enrich.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enrich.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/enrich.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,uCAAuC,CAAC;AAQ/C,UAAU,aAAa;IACrB,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AA8GD;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,IAAI,CAAC,CA8Mf"}
@@ -1,271 +0,0 @@
1
- import chalk from "chalk";
2
- import ora from "ora";
3
- import { existsSync, readdirSync, writeFileSync, readFileSync } from "node:fs";
4
- import { join, dirname, basename } from "node:path";
5
- import { transcribeVideo, } from "../../transcription/whisperService.js";
6
- import { polishTranscript, generateModuleSummary, folderNameToTitle } from "../../ai/transcriptPolisher.js";
7
- import { isConfigured as isOpenRouterConfigured, getCumulativeUsage, resetCumulativeUsage, } from "../../ai/openRouter.js";
8
- /**
9
- * Find all lesson directories with videos, grouped by module.
10
- */
11
- function findLessonsWithVideos(courseDir) {
12
- const lessons = [];
13
- function scanDir(dir) {
14
- const entries = readdirSync(dir, { withFileTypes: true });
15
- for (const entry of entries) {
16
- const fullPath = join(dir, entry.name);
17
- if (entry.isDirectory()) {
18
- const videoPath = join(fullPath, "video.mp4");
19
- if (existsSync(videoPath)) {
20
- // This is a lesson directory
21
- const moduleDir = dirname(fullPath);
22
- lessons.push({
23
- path: fullPath,
24
- name: entry.name,
25
- moduleDir,
26
- moduleName: basename(moduleDir),
27
- });
28
- }
29
- else {
30
- scanDir(fullPath);
31
- }
32
- }
33
- }
34
- }
35
- scanDir(courseDir);
36
- return lessons;
37
- }
38
- /**
39
- * Check if a lesson already has a transcript.
40
- */
41
- function hasTranscript(lessonDir) {
42
- return (existsSync(join(lessonDir, "transcript.md")) ||
43
- existsSync(join(lessonDir, "transcript-raw.txt")));
44
- }
45
- /**
46
- * Check if a lesson has been polished.
47
- */
48
- function isPolished(lessonDir) {
49
- const meta = loadMeta(lessonDir);
50
- return !!meta?.polishedAt;
51
- }
52
- /**
53
- * Load lesson metadata.
54
- */
55
- function loadMeta(lessonDir) {
56
- const metaPath = join(lessonDir, ".meta.json");
57
- if (!existsSync(metaPath)) {
58
- return null;
59
- }
60
- try {
61
- const content = readFileSync(metaPath, "utf-8");
62
- return JSON.parse(content);
63
- }
64
- catch {
65
- return null;
66
- }
67
- }
68
- /**
69
- * Save lesson metadata.
70
- */
71
- function saveMeta(lessonDir, meta) {
72
- const metaPath = join(lessonDir, ".meta.json");
73
- writeFileSync(metaPath, JSON.stringify(meta, null, 2), "utf-8");
74
- }
75
- /**
76
- * Group lessons by module directory.
77
- */
78
- function groupByModule(lessons) {
79
- const modules = new Map();
80
- for (const lesson of lessons) {
81
- const existing = modules.get(lesson.moduleDir) ?? [];
82
- existing.push(lesson);
83
- modules.set(lesson.moduleDir, existing);
84
- }
85
- return modules;
86
- }
87
- /**
88
- * Enrich command - transcribe videos in a course directory.
89
- */
90
- export async function enrichCommand(courseDir, options) {
91
- console.log(chalk.blue("\n📝 Enrich: Video Transcription\n"));
92
- if (!existsSync(courseDir)) {
93
- console.log(chalk.red(`Course directory not found: ${courseDir}`));
94
- process.exit(1);
95
- }
96
- const model = options.model ?? "small";
97
- const language = options.language ?? "de";
98
- const shouldPolish = options.polish ?? false;
99
- console.log(chalk.gray(` Model: ${model}`));
100
- console.log(chalk.gray(` Language: ${language}`));
101
- if (shouldPolish) {
102
- if (isOpenRouterConfigured()) {
103
- console.log(chalk.gray(` Polish: enabled (OpenRouter)`));
104
- resetCumulativeUsage(); // Reset usage tracking
105
- }
106
- else {
107
- console.log(chalk.yellow(` Polish: disabled (OPENROUTER_API_KEY not set)`));
108
- }
109
- }
110
- console.log(chalk.gray(` Directory: ${courseDir}\n`));
111
- // Find all lessons with videos
112
- const allLessons = findLessonsWithVideos(courseDir);
113
- console.log(chalk.gray(` Found ${allLessons.length} lessons with videos\n`));
114
- if (allLessons.length === 0) {
115
- console.log(chalk.yellow("No videos found to transcribe."));
116
- return;
117
- }
118
- // Filter lessons that need processing
119
- let lessonsToProcess = allLessons.filter((lesson) => {
120
- if (options.force)
121
- return true;
122
- if (shouldPolish && hasTranscript(lesson.path) && !isPolished(lesson.path)) {
123
- return true;
124
- }
125
- return !hasTranscript(lesson.path);
126
- });
127
- if (options.limit) {
128
- lessonsToProcess = lessonsToProcess.slice(0, options.limit);
129
- }
130
- if (lessonsToProcess.length === 0) {
131
- console.log(chalk.green("All videos already transcribed. Use --force to re-transcribe."));
132
- return;
133
- }
134
- console.log(chalk.blue(`Processing ${lessonsToProcess.length} videos...\n`));
135
- let transcribed = 0;
136
- let polished = 0;
137
- let failed = 0;
138
- // Track polished lessons for module summaries
139
- const polishedLessons = [];
140
- for (const lesson of lessonsToProcess) {
141
- const videoPath = join(lesson.path, "video.mp4");
142
- const transcriptMdPath = join(lesson.path, "transcript.md");
143
- const summaryPath = join(lesson.path, "summary.md");
144
- const transcriptTxtPath = join(lesson.path, "transcript-raw.txt");
145
- const spinner = ora(` ${lesson.name}`).start();
146
- try {
147
- let transcriptText;
148
- // Check if we already have a raw transcript
149
- if (existsSync(transcriptTxtPath) && shouldPolish && !options.force) {
150
- transcriptText = readFileSync(transcriptTxtPath, "utf-8");
151
- spinner.text = ` ${lesson.name} (polishing...)`;
152
- }
153
- else {
154
- // Transcribe video
155
- const result = await transcribeVideo(videoPath, { model, language });
156
- transcriptText = result.text;
157
- writeFileSync(transcriptTxtPath, transcriptText, "utf-8");
158
- const speedFactor = result.duration > 0
159
- ? (result.duration / result.processingTime).toFixed(1)
160
- : "?";
161
- spinner.text = ` ${lesson.name} (${Math.round(result.duration)}s → ${result.processingTime.toFixed(1)}s, ${speedFactor}x)`;
162
- transcribed++;
163
- }
164
- // Polish with LLM if requested
165
- if (shouldPolish && isOpenRouterConfigured()) {
166
- spinner.text = ` ${lesson.name} (polishing with AI...)`;
167
- try {
168
- const polishedResult = await polishTranscript(transcriptText);
169
- // Save summary separately
170
- const lessonTitle = folderNameToTitle(lesson.name);
171
- if (polishedResult.summary) {
172
- writeFileSync(summaryPath, `# Zusammenfassung: ${lessonTitle}\n\n${polishedResult.summary}\n`, "utf-8");
173
- }
174
- // Save formatted transcript with title
175
- const transcriptWithTitle = `# Transkript: ${lessonTitle}\n\n${polishedResult.transcript}`;
176
- writeFileSync(transcriptMdPath, transcriptWithTitle, "utf-8");
177
- polished++;
178
- polishedLessons.push(lesson);
179
- const meta = loadMeta(lesson.path) ?? {
180
- syncedAt: new Date().toISOString(),
181
- updatedAt: null,
182
- videoUrl: null,
183
- videoType: null,
184
- };
185
- meta.polishedAt = new Date().toISOString();
186
- saveMeta(lesson.path, meta);
187
- }
188
- catch (polishError) {
189
- // Save unpolished as fallback
190
- writeFileSync(transcriptMdPath, transcriptText, "utf-8");
191
- console.log(chalk.yellow(`\n Polish failed: ${polishError}`));
192
- }
193
- }
194
- else {
195
- // Save raw transcript as markdown
196
- writeFileSync(transcriptMdPath, transcriptText, "utf-8");
197
- }
198
- // Update metadata
199
- const meta = loadMeta(lesson.path) ?? {
200
- syncedAt: new Date().toISOString(),
201
- updatedAt: null,
202
- videoUrl: null,
203
- videoType: null,
204
- };
205
- meta.transcribedAt = new Date().toISOString();
206
- saveMeta(lesson.path, meta);
207
- const statusSuffix = shouldPolish && isOpenRouterConfigured() ? " + polished" : "";
208
- spinner.succeed(` ${lesson.name}${statusSuffix}`);
209
- }
210
- catch (error) {
211
- spinner.fail(` ${lesson.name}`);
212
- console.log(chalk.red(` Error: ${error}`));
213
- failed++;
214
- }
215
- }
216
- // Generate module summaries if we polished any lessons
217
- if (polished > 0 && isOpenRouterConfigured()) {
218
- console.log(chalk.blue("\n📚 Generating module summaries...\n"));
219
- const moduleGroups = groupByModule(polishedLessons);
220
- for (const [moduleDir, moduleLessons] of moduleGroups) {
221
- const moduleName = basename(moduleDir);
222
- const spinner = ora(` ${moduleName}`).start();
223
- try {
224
- // Collect all lesson summaries for this module
225
- const lessonSummaries = [];
226
- for (const lesson of moduleLessons) {
227
- const summaryPath = join(lesson.path, "summary.md");
228
- if (existsSync(summaryPath)) {
229
- const content = readFileSync(summaryPath, "utf-8");
230
- // Extract just the summary text (skip the heading)
231
- const summaryText = content.replace(/^#[^\n]+\n+/, "").trim();
232
- const lessonTitle = folderNameToTitle(lesson.name);
233
- lessonSummaries.push({ name: lesson.name, title: lessonTitle, summary: summaryText });
234
- }
235
- }
236
- if (lessonSummaries.length > 0) {
237
- const moduleSummary = await generateModuleSummary(moduleName, lessonSummaries);
238
- const moduleSummaryPath = join(moduleDir, "summary.md");
239
- writeFileSync(moduleSummaryPath, moduleSummary, "utf-8");
240
- spinner.succeed(` ${moduleName} (${lessonSummaries.length} lessons)`);
241
- }
242
- else {
243
- spinner.warn(` ${moduleName} (no summaries found)`);
244
- }
245
- }
246
- catch (error) {
247
- spinner.fail(` ${moduleName}`);
248
- console.log(chalk.red(` Error: ${error}`));
249
- }
250
- }
251
- }
252
- // Final summary
253
- console.log(chalk.green(`\n✅ Enrichment complete!`));
254
- console.log(chalk.gray(` Transcribed: ${transcribed}`));
255
- if (polished > 0) {
256
- console.log(chalk.gray(` Polished: ${polished}`));
257
- }
258
- if (failed > 0) {
259
- console.log(chalk.red(` Failed: ${failed}`));
260
- }
261
- // Show API usage if polishing was done
262
- if (polished > 0 && isOpenRouterConfigured()) {
263
- const usage = getCumulativeUsage();
264
- console.log(chalk.gray(`\n API Usage:`));
265
- console.log(chalk.gray(` Tokens: ${usage.totalTokens.toLocaleString()} (${usage.promptTokens.toLocaleString()} in / ${usage.completionTokens.toLocaleString()} out)`));
266
- if (usage.cost !== undefined && usage.cost > 0) {
267
- console.log(chalk.gray(` Cost: $${usage.cost.toFixed(4)}`));
268
- }
269
- }
270
- }
271
- //# sourceMappingURL=enrich.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"enrich.js","sourceRoot":"","sources":["../../../src/cli/commands/enrich.ts"],"names":[],"mappings":"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"}
@@ -1,20 +0,0 @@
1
- interface SyncGHLOptions {
2
- skipVideos?: boolean;
3
- skipContent?: boolean;
4
- dryRun?: boolean;
5
- limit?: number;
6
- visible?: boolean;
7
- quality?: string;
8
- courseName?: string;
9
- }
10
- /**
11
- * Detects if a URL is a GHL/ClientClub portal.
12
- */
13
- export declare function isGHLPortal(url: string): boolean;
14
- /**
15
- * Handles the sync-ghl command.
16
- * Downloads all content from a GoHighLevel/ClientClub course portal.
17
- */
18
- export declare function syncGhlCommand(url: string, options: SyncGHLOptions): Promise<void>;
19
- export {};
20
- //# sourceMappingURL=syncGhl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"syncGhl.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/syncGhl.ts"],"names":[],"mappings":"AA8EA,UAAU,cAAc;IACtB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAaD;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAqBhD;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAyTxF"}