offcourse 1.0.0 → 1.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 (280) hide show
  1. package/README.md +107 -8
  2. package/dist/cli/commands/config.js.map +1 -1
  3. package/dist/cli/commands/inspect.js +1 -1
  4. package/dist/cli/commands/inspect.js.map +1 -1
  5. package/dist/cli/commands/sync.d.ts +1 -2
  6. package/dist/cli/commands/sync.d.ts.map +1 -1
  7. package/dist/cli/commands/sync.js +17 -15
  8. package/dist/cli/commands/sync.js.map +1 -1
  9. package/dist/cli/commands/syncHighLevel.d.ts +1 -2
  10. package/dist/cli/commands/syncHighLevel.d.ts.map +1 -1
  11. package/dist/cli/commands/syncHighLevel.js +8 -9
  12. package/dist/cli/commands/syncHighLevel.js.map +1 -1
  13. package/dist/cli/commands/syncLearningSuite.d.ts +35 -0
  14. package/dist/cli/commands/syncLearningSuite.d.ts.map +1 -0
  15. package/dist/cli/commands/syncLearningSuite.js +765 -0
  16. package/dist/cli/commands/syncLearningSuite.js.map +1 -0
  17. package/dist/cli/index.js +39 -1
  18. package/dist/cli/index.js.map +1 -1
  19. package/dist/config/configManager.d.ts.map +1 -1
  20. package/dist/config/configManager.js +4 -0
  21. package/dist/config/configManager.js.map +1 -1
  22. package/dist/downloader/hlsDownloader.d.ts +10 -4
  23. package/dist/downloader/hlsDownloader.d.ts.map +1 -1
  24. package/dist/downloader/hlsDownloader.js +60 -29
  25. package/dist/downloader/hlsDownloader.js.map +1 -1
  26. package/dist/downloader/hlsValidator.d.ts.map +1 -1
  27. package/dist/downloader/hlsValidator.js +6 -2
  28. package/dist/downloader/hlsValidator.js.map +1 -1
  29. package/dist/downloader/index.d.ts +7 -0
  30. package/dist/downloader/index.d.ts.map +1 -1
  31. package/dist/downloader/index.js +9 -6
  32. package/dist/downloader/index.js.map +1 -1
  33. package/dist/downloader/loomDownloader.d.ts +1 -1
  34. package/dist/downloader/loomDownloader.d.ts.map +1 -1
  35. package/dist/downloader/loomDownloader.js +32 -27
  36. package/dist/downloader/loomDownloader.js.map +1 -1
  37. package/dist/downloader/queue.d.ts +4 -4
  38. package/dist/downloader/queue.d.ts.map +1 -1
  39. package/dist/downloader/queue.js.map +1 -1
  40. package/dist/downloader/vimeoDownloader.d.ts.map +1 -1
  41. package/dist/downloader/vimeoDownloader.js +7 -3
  42. package/dist/downloader/vimeoDownloader.js.map +1 -1
  43. package/dist/scraper/extractor.d.ts +4 -0
  44. package/dist/scraper/extractor.d.ts.map +1 -1
  45. package/dist/scraper/extractor.js +79 -79
  46. package/dist/scraper/extractor.js.map +1 -1
  47. package/dist/scraper/highlevel/extractor.d.ts +11 -19
  48. package/dist/scraper/highlevel/extractor.d.ts.map +1 -1
  49. package/dist/scraper/highlevel/extractor.js +72 -85
  50. package/dist/scraper/highlevel/extractor.js.map +1 -1
  51. package/dist/scraper/highlevel/navigator.d.ts +3 -10
  52. package/dist/scraper/highlevel/navigator.d.ts.map +1 -1
  53. package/dist/scraper/highlevel/navigator.js +140 -127
  54. package/dist/scraper/highlevel/navigator.js.map +1 -1
  55. package/dist/scraper/highlevel/schemas.d.ts +188 -0
  56. package/dist/scraper/highlevel/schemas.d.ts.map +1 -0
  57. package/dist/scraper/highlevel/schemas.js +139 -0
  58. package/dist/scraper/highlevel/schemas.js.map +1 -0
  59. package/dist/scraper/learningsuite/extractor.d.ts +50 -0
  60. package/dist/scraper/learningsuite/extractor.d.ts.map +1 -0
  61. package/dist/scraper/learningsuite/extractor.js +429 -0
  62. package/dist/scraper/learningsuite/extractor.js.map +1 -0
  63. package/dist/scraper/learningsuite/index.d.ts +4 -0
  64. package/dist/scraper/learningsuite/index.d.ts.map +1 -0
  65. package/dist/scraper/{ghl → learningsuite}/index.js +1 -1
  66. package/dist/scraper/learningsuite/index.js.map +1 -0
  67. package/dist/scraper/learningsuite/navigator.d.ts +122 -0
  68. package/dist/scraper/learningsuite/navigator.d.ts.map +1 -0
  69. package/dist/scraper/learningsuite/navigator.js +736 -0
  70. package/dist/scraper/learningsuite/navigator.js.map +1 -0
  71. package/dist/scraper/learningsuite/schemas.d.ts +270 -0
  72. package/dist/scraper/learningsuite/schemas.d.ts.map +1 -0
  73. package/dist/scraper/learningsuite/schemas.js +147 -0
  74. package/dist/scraper/learningsuite/schemas.js.map +1 -0
  75. package/dist/scraper/navigator.d.ts +14 -11
  76. package/dist/scraper/navigator.d.ts.map +1 -1
  77. package/dist/scraper/navigator.js +61 -104
  78. package/dist/scraper/navigator.js.map +1 -1
  79. package/dist/scraper/schemas.d.ts +57 -0
  80. package/dist/scraper/schemas.d.ts.map +1 -0
  81. package/dist/scraper/schemas.js +135 -0
  82. package/dist/scraper/schemas.js.map +1 -0
  83. package/dist/scraper/videoInterceptor.d.ts +4 -0
  84. package/dist/scraper/videoInterceptor.d.ts.map +1 -1
  85. package/dist/scraper/videoInterceptor.js +66 -51
  86. package/dist/scraper/videoInterceptor.js.map +1 -1
  87. package/dist/shared/auth.d.ts +9 -9
  88. package/dist/shared/auth.d.ts.map +1 -1
  89. package/dist/shared/auth.js +24 -38
  90. package/dist/shared/auth.js.map +1 -1
  91. package/dist/shared/firebase.d.ts +60 -0
  92. package/dist/shared/firebase.d.ts.map +1 -0
  93. package/dist/shared/firebase.js +102 -0
  94. package/dist/shared/firebase.js.map +1 -0
  95. package/dist/shared/fs.d.ts.map +1 -1
  96. package/dist/shared/fs.js +4 -0
  97. package/dist/shared/fs.js.map +1 -1
  98. package/dist/shared/index.d.ts +3 -0
  99. package/dist/shared/index.d.ts.map +1 -1
  100. package/dist/shared/index.js +3 -0
  101. package/dist/shared/index.js.map +1 -1
  102. package/dist/shared/slug.d.ts +11 -0
  103. package/dist/shared/slug.d.ts.map +1 -0
  104. package/{src/shared/slug.ts → dist/shared/slug.js} +10 -11
  105. package/dist/shared/slug.js.map +1 -0
  106. package/dist/shared/url.d.ts +43 -0
  107. package/dist/shared/url.d.ts.map +1 -0
  108. package/{src/shared/url.ts → dist/shared/url.js} +12 -15
  109. package/dist/shared/url.js.map +1 -0
  110. package/dist/state/database.d.ts +1 -0
  111. package/dist/state/database.d.ts.map +1 -1
  112. package/dist/state/database.js +3 -0
  113. package/dist/state/database.js.map +1 -1
  114. package/dist/storage/fileSystem.d.ts +17 -17
  115. package/dist/storage/fileSystem.d.ts.map +1 -1
  116. package/dist/storage/fileSystem.js +39 -31
  117. package/dist/storage/fileSystem.js.map +1 -1
  118. package/package.json +5 -2
  119. package/.github/workflows/ci.yml +0 -50
  120. package/.husky/commit-msg +0 -2
  121. package/.husky/pre-commit +0 -1
  122. package/.husky/pre-push +0 -3
  123. package/.prettierrc +0 -8
  124. package/.release-it.json +0 -23
  125. package/ARCHITECTURE.md +0 -233
  126. package/CHANGELOG.md +0 -78
  127. package/commitlint.config.js +0 -4
  128. package/dist/ai/openRouter.d.ts +0 -47
  129. package/dist/ai/openRouter.d.ts.map +0 -1
  130. package/dist/ai/openRouter.js +0 -116
  131. package/dist/ai/openRouter.js.map +0 -1
  132. package/dist/ai/transcriptPolisher.d.ts +0 -24
  133. package/dist/ai/transcriptPolisher.d.ts.map +0 -1
  134. package/dist/ai/transcriptPolisher.js +0 -89
  135. package/dist/ai/transcriptPolisher.js.map +0 -1
  136. package/dist/cli/commands/enrich.d.ts +0 -14
  137. package/dist/cli/commands/enrich.d.ts.map +0 -1
  138. package/dist/cli/commands/enrich.js +0 -271
  139. package/dist/cli/commands/enrich.js.map +0 -1
  140. package/dist/cli/commands/syncGhl.d.ts +0 -20
  141. package/dist/cli/commands/syncGhl.d.ts.map +0 -1
  142. package/dist/cli/commands/syncGhl.js +0 -483
  143. package/dist/cli/commands/syncGhl.js.map +0 -1
  144. package/dist/cli/commands/syncHighLevel.test.d.ts +0 -2
  145. package/dist/cli/commands/syncHighLevel.test.d.ts.map +0 -1
  146. package/dist/cli/commands/syncHighLevel.test.js +0 -102
  147. package/dist/cli/commands/syncHighLevel.test.js.map +0 -1
  148. package/dist/config/paths.test.d.ts +0 -2
  149. package/dist/config/paths.test.d.ts.map +0 -1
  150. package/dist/config/paths.test.js +0 -70
  151. package/dist/config/paths.test.js.map +0 -1
  152. package/dist/config/schema.test.d.ts +0 -2
  153. package/dist/config/schema.test.d.ts.map +0 -1
  154. package/dist/config/schema.test.js +0 -151
  155. package/dist/config/schema.test.js.map +0 -1
  156. package/dist/downloader/hlsDownloader.test.d.ts +0 -2
  157. package/dist/downloader/hlsDownloader.test.d.ts.map +0 -1
  158. package/dist/downloader/hlsDownloader.test.js +0 -116
  159. package/dist/downloader/hlsDownloader.test.js.map +0 -1
  160. package/dist/downloader/loomDownloader.test.d.ts +0 -2
  161. package/dist/downloader/loomDownloader.test.d.ts.map +0 -1
  162. package/dist/downloader/loomDownloader.test.js +0 -36
  163. package/dist/downloader/loomDownloader.test.js.map +0 -1
  164. package/dist/downloader/queue.test.d.ts +0 -2
  165. package/dist/downloader/queue.test.d.ts.map +0 -1
  166. package/dist/downloader/queue.test.js +0 -158
  167. package/dist/downloader/queue.test.js.map +0 -1
  168. package/dist/downloader/videoDownloader.d.ts +0 -32
  169. package/dist/downloader/videoDownloader.d.ts.map +0 -1
  170. package/dist/downloader/videoDownloader.js +0 -173
  171. package/dist/downloader/videoDownloader.js.map +0 -1
  172. package/dist/downloader/vimeoDownloader.test.d.ts +0 -2
  173. package/dist/downloader/vimeoDownloader.test.d.ts.map +0 -1
  174. package/dist/downloader/vimeoDownloader.test.js +0 -51
  175. package/dist/downloader/vimeoDownloader.test.js.map +0 -1
  176. package/dist/scraper/auth.d.ts +0 -29
  177. package/dist/scraper/auth.d.ts.map +0 -1
  178. package/dist/scraper/auth.js +0 -115
  179. package/dist/scraper/auth.js.map +0 -1
  180. package/dist/scraper/extractor.test.d.ts +0 -2
  181. package/dist/scraper/extractor.test.d.ts.map +0 -1
  182. package/dist/scraper/extractor.test.js +0 -65
  183. package/dist/scraper/extractor.test.js.map +0 -1
  184. package/dist/scraper/ghl/auth.d.ts +0 -25
  185. package/dist/scraper/ghl/auth.d.ts.map +0 -1
  186. package/dist/scraper/ghl/auth.js +0 -187
  187. package/dist/scraper/ghl/auth.js.map +0 -1
  188. package/dist/scraper/ghl/extractor.d.ts +0 -96
  189. package/dist/scraper/ghl/extractor.d.ts.map +0 -1
  190. package/dist/scraper/ghl/extractor.js +0 -345
  191. package/dist/scraper/ghl/extractor.js.map +0 -1
  192. package/dist/scraper/ghl/index.d.ts +0 -4
  193. package/dist/scraper/ghl/index.d.ts.map +0 -1
  194. package/dist/scraper/ghl/index.js.map +0 -1
  195. package/dist/scraper/ghl/navigator.d.ts +0 -93
  196. package/dist/scraper/ghl/navigator.d.ts.map +0 -1
  197. package/dist/scraper/ghl/navigator.js +0 -447
  198. package/dist/scraper/ghl/navigator.js.map +0 -1
  199. package/dist/scraper/highlevel/auth.d.ts +0 -25
  200. package/dist/scraper/highlevel/auth.d.ts.map +0 -1
  201. package/dist/scraper/highlevel/auth.js +0 -189
  202. package/dist/scraper/highlevel/auth.js.map +0 -1
  203. package/dist/scraper/highlevel/extractor.test.d.ts +0 -2
  204. package/dist/scraper/highlevel/extractor.test.d.ts.map +0 -1
  205. package/dist/scraper/highlevel/extractor.test.js +0 -101
  206. package/dist/scraper/highlevel/extractor.test.js.map +0 -1
  207. package/dist/scraper/highlevel/navigator.test.d.ts +0 -2
  208. package/dist/scraper/highlevel/navigator.test.d.ts.map +0 -1
  209. package/dist/scraper/highlevel/navigator.test.js +0 -78
  210. package/dist/scraper/highlevel/navigator.test.js.map +0 -1
  211. package/dist/scraper/navigator.test.d.ts +0 -2
  212. package/dist/scraper/navigator.test.d.ts.map +0 -1
  213. package/dist/scraper/navigator.test.js +0 -63
  214. package/dist/scraper/navigator.test.js.map +0 -1
  215. package/dist/scraper/skoolApi.d.ts +0 -17
  216. package/dist/scraper/skoolApi.d.ts.map +0 -1
  217. package/dist/scraper/skoolApi.js +0 -72
  218. package/dist/scraper/skoolApi.js.map +0 -1
  219. package/dist/state/database.test.d.ts +0 -2
  220. package/dist/state/database.test.d.ts.map +0 -1
  221. package/dist/state/database.test.js +0 -34
  222. package/dist/state/database.test.js.map +0 -1
  223. package/dist/transcription/whisperService.d.ts +0 -27
  224. package/dist/transcription/whisperService.d.ts.map +0 -1
  225. package/dist/transcription/whisperService.js +0 -102
  226. package/dist/transcription/whisperService.js.map +0 -1
  227. package/eslint.config.js +0 -55
  228. package/src/__fixtures__/highlevel-post-response.json +0 -68
  229. package/src/__fixtures__/hls-master-playlist.m3u8 +0 -24
  230. package/src/cli/commands/__snapshots__/syncHighLevel.test.ts.snap +0 -38
  231. package/src/cli/commands/config.ts +0 -74
  232. package/src/cli/commands/inspect.ts +0 -441
  233. package/src/cli/commands/login.ts +0 -68
  234. package/src/cli/commands/status.ts +0 -147
  235. package/src/cli/commands/sync.ts +0 -1235
  236. package/src/cli/commands/syncHighLevel.test.ts +0 -144
  237. package/src/cli/commands/syncHighLevel.ts +0 -639
  238. package/src/cli/index.ts +0 -121
  239. package/src/config/configManager.ts +0 -75
  240. package/src/config/paths.test.ts +0 -83
  241. package/src/config/paths.ts +0 -36
  242. package/src/config/schema.test.ts +0 -173
  243. package/src/config/schema.ts +0 -65
  244. package/src/downloader/hlsDownloader.test.ts +0 -148
  245. package/src/downloader/hlsDownloader.ts +0 -327
  246. package/src/downloader/hlsValidator.ts +0 -196
  247. package/src/downloader/index.ts +0 -122
  248. package/src/downloader/loomDownloader.test.ts +0 -43
  249. package/src/downloader/loomDownloader.ts +0 -742
  250. package/src/downloader/queue.test.ts +0 -199
  251. package/src/downloader/queue.ts +0 -118
  252. package/src/downloader/vimeoDownloader.test.ts +0 -62
  253. package/src/downloader/vimeoDownloader.ts +0 -722
  254. package/src/scraper/extractor.test.ts +0 -124
  255. package/src/scraper/extractor.ts +0 -757
  256. package/src/scraper/highlevel/__snapshots__/extractor.test.ts.snap +0 -41
  257. package/src/scraper/highlevel/extractor.test.ts +0 -134
  258. package/src/scraper/highlevel/extractor.ts +0 -537
  259. package/src/scraper/highlevel/index.ts +0 -2
  260. package/src/scraper/highlevel/navigator.test.ts +0 -110
  261. package/src/scraper/highlevel/navigator.ts +0 -668
  262. package/src/scraper/highlevel/schemas.ts +0 -183
  263. package/src/scraper/navigator.test.ts +0 -122
  264. package/src/scraper/navigator.ts +0 -355
  265. package/src/scraper/schemas.ts +0 -177
  266. package/src/scraper/videoInterceptor.ts +0 -435
  267. package/src/shared/auth.test.ts +0 -58
  268. package/src/shared/auth.ts +0 -251
  269. package/src/shared/firebase.ts +0 -151
  270. package/src/shared/fs.ts +0 -80
  271. package/src/shared/http.ts +0 -34
  272. package/src/shared/index.ts +0 -6
  273. package/src/shared/url.test.ts +0 -122
  274. package/src/state/database.test.ts +0 -49
  275. package/src/state/database.ts +0 -919
  276. package/src/state/index.ts +0 -14
  277. package/src/storage/fileSystem.test.ts +0 -64
  278. package/src/storage/fileSystem.ts +0 -175
  279. package/tsconfig.json +0 -28
  280. package/vitest.config.ts +0 -29
@@ -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"}