offcourse 0.0.2 → 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 (139) hide show
  1. package/README.md +255 -20
  2. package/dist/cli/commands/config.d.ts +13 -0
  3. package/dist/cli/commands/config.d.ts.map +1 -0
  4. package/dist/cli/commands/config.js +66 -0
  5. package/dist/cli/commands/config.js.map +1 -0
  6. package/dist/cli/commands/inspect.d.ts +11 -0
  7. package/dist/cli/commands/inspect.d.ts.map +1 -0
  8. package/dist/cli/commands/inspect.js +365 -0
  9. package/dist/cli/commands/inspect.js.map +1 -0
  10. package/dist/cli/commands/login.d.ts +12 -0
  11. package/dist/cli/commands/login.d.ts.map +1 -0
  12. package/dist/cli/commands/login.js +55 -0
  13. package/dist/cli/commands/login.js.map +1 -0
  14. package/dist/cli/commands/status.d.ts +15 -0
  15. package/dist/cli/commands/status.d.ts.map +1 -0
  16. package/dist/cli/commands/status.js +118 -0
  17. package/dist/cli/commands/status.js.map +1 -0
  18. package/dist/cli/commands/sync.d.ts +15 -0
  19. package/dist/cli/commands/sync.d.ts.map +1 -0
  20. package/dist/cli/commands/sync.js +921 -0
  21. package/dist/cli/commands/sync.js.map +1 -0
  22. package/dist/cli/commands/syncHighLevel.d.ts +23 -0
  23. package/dist/cli/commands/syncHighLevel.d.ts.map +1 -0
  24. package/dist/cli/commands/syncHighLevel.js +479 -0
  25. package/dist/cli/commands/syncHighLevel.js.map +1 -0
  26. package/dist/cli/index.d.ts +3 -0
  27. package/dist/cli/index.d.ts.map +1 -0
  28. package/dist/cli/index.js +106 -0
  29. package/dist/cli/index.js.map +1 -0
  30. package/dist/config/configManager.d.ts +31 -0
  31. package/dist/config/configManager.d.ts.map +1 -0
  32. package/dist/config/configManager.js +68 -0
  33. package/dist/config/configManager.js.map +1 -0
  34. package/dist/config/paths.d.ts +21 -0
  35. package/dist/config/paths.d.ts.map +1 -0
  36. package/dist/config/paths.js +33 -0
  37. package/dist/config/paths.js.map +1 -0
  38. package/dist/config/schema.d.ts +60 -0
  39. package/dist/config/schema.d.ts.map +1 -0
  40. package/dist/config/schema.js +50 -0
  41. package/dist/config/schema.js.map +1 -0
  42. package/dist/downloader/hlsDownloader.d.ts +58 -0
  43. package/dist/downloader/hlsDownloader.d.ts.map +1 -0
  44. package/dist/downloader/hlsDownloader.js +263 -0
  45. package/dist/downloader/hlsDownloader.js.map +1 -0
  46. package/dist/downloader/hlsValidator.d.ts +35 -0
  47. package/dist/downloader/hlsValidator.d.ts.map +1 -0
  48. package/dist/downloader/hlsValidator.js +152 -0
  49. package/dist/downloader/hlsValidator.js.map +1 -0
  50. package/dist/downloader/index.d.ts +29 -0
  51. package/dist/downloader/index.d.ts.map +1 -0
  52. package/dist/downloader/index.js +55 -0
  53. package/dist/downloader/index.js.map +1 -0
  54. package/dist/downloader/loomDownloader.d.ts +56 -0
  55. package/dist/downloader/loomDownloader.d.ts.map +1 -0
  56. package/dist/downloader/loomDownloader.js +562 -0
  57. package/dist/downloader/loomDownloader.js.map +1 -0
  58. package/dist/downloader/queue.d.ts +56 -0
  59. package/dist/downloader/queue.d.ts.map +1 -0
  60. package/dist/downloader/queue.js +88 -0
  61. package/dist/downloader/queue.js.map +1 -0
  62. package/dist/downloader/vimeoDownloader.d.ts +52 -0
  63. package/dist/downloader/vimeoDownloader.d.ts.map +1 -0
  64. package/dist/downloader/vimeoDownloader.js +569 -0
  65. package/dist/downloader/vimeoDownloader.js.map +1 -0
  66. package/dist/scraper/extractor.d.ts +53 -0
  67. package/dist/scraper/extractor.d.ts.map +1 -0
  68. package/dist/scraper/extractor.js +627 -0
  69. package/dist/scraper/extractor.js.map +1 -0
  70. package/dist/scraper/highlevel/extractor.d.ts +89 -0
  71. package/dist/scraper/highlevel/extractor.d.ts.map +1 -0
  72. package/dist/scraper/highlevel/extractor.js +373 -0
  73. package/dist/scraper/highlevel/extractor.js.map +1 -0
  74. package/dist/scraper/highlevel/index.d.ts +3 -0
  75. package/dist/scraper/highlevel/index.d.ts.map +1 -0
  76. package/dist/scraper/highlevel/index.js +3 -0
  77. package/dist/scraper/highlevel/index.js.map +1 -0
  78. package/dist/scraper/highlevel/navigator.d.ts +86 -0
  79. package/dist/scraper/highlevel/navigator.d.ts.map +1 -0
  80. package/dist/scraper/highlevel/navigator.js +505 -0
  81. package/dist/scraper/highlevel/navigator.js.map +1 -0
  82. package/dist/scraper/highlevel/schemas.d.ts +188 -0
  83. package/dist/scraper/highlevel/schemas.d.ts.map +1 -0
  84. package/dist/scraper/highlevel/schemas.js +139 -0
  85. package/dist/scraper/highlevel/schemas.js.map +1 -0
  86. package/dist/scraper/navigator.d.ts +68 -0
  87. package/dist/scraper/navigator.d.ts.map +1 -0
  88. package/dist/scraper/navigator.js +257 -0
  89. package/dist/scraper/navigator.js.map +1 -0
  90. package/dist/scraper/schemas.d.ts +57 -0
  91. package/dist/scraper/schemas.d.ts.map +1 -0
  92. package/dist/scraper/schemas.js +135 -0
  93. package/dist/scraper/schemas.js.map +1 -0
  94. package/dist/scraper/videoInterceptor.d.ts +23 -0
  95. package/dist/scraper/videoInterceptor.d.ts.map +1 -0
  96. package/dist/scraper/videoInterceptor.js +330 -0
  97. package/dist/scraper/videoInterceptor.js.map +1 -0
  98. package/dist/shared/auth.d.ts +58 -0
  99. package/dist/shared/auth.d.ts.map +1 -0
  100. package/dist/shared/auth.js +197 -0
  101. package/dist/shared/auth.js.map +1 -0
  102. package/dist/shared/firebase.d.ts +60 -0
  103. package/dist/shared/firebase.d.ts.map +1 -0
  104. package/dist/shared/firebase.js +102 -0
  105. package/dist/shared/firebase.js.map +1 -0
  106. package/dist/shared/fs.d.ts +31 -0
  107. package/dist/shared/fs.d.ts.map +1 -0
  108. package/dist/shared/fs.js +77 -0
  109. package/dist/shared/fs.js.map +1 -0
  110. package/dist/shared/http.d.ts +15 -0
  111. package/dist/shared/http.d.ts.map +1 -0
  112. package/dist/shared/http.js +31 -0
  113. package/dist/shared/http.js.map +1 -0
  114. package/dist/shared/index.d.ts +7 -0
  115. package/dist/shared/index.d.ts.map +1 -0
  116. package/dist/shared/index.js +7 -0
  117. package/dist/shared/index.js.map +1 -0
  118. package/dist/shared/slug.d.ts +11 -0
  119. package/dist/shared/slug.d.ts.map +1 -0
  120. package/dist/shared/slug.js +25 -0
  121. package/dist/shared/slug.js.map +1 -0
  122. package/dist/shared/url.d.ts +43 -0
  123. package/dist/shared/url.d.ts.map +1 -0
  124. package/dist/shared/url.js +54 -0
  125. package/dist/shared/url.js.map +1 -0
  126. package/dist/state/database.d.ts +246 -0
  127. package/dist/state/database.d.ts.map +1 -0
  128. package/dist/state/database.js +679 -0
  129. package/dist/state/database.js.map +1 -0
  130. package/dist/state/index.d.ts +2 -0
  131. package/dist/state/index.d.ts.map +1 -0
  132. package/dist/state/index.js +2 -0
  133. package/dist/state/index.js.map +1 -0
  134. package/dist/storage/fileSystem.d.ts +56 -0
  135. package/dist/storage/fileSystem.d.ts.map +1 -0
  136. package/dist/storage/fileSystem.js +129 -0
  137. package/dist/storage/fileSystem.js.map +1 -0
  138. package/package.json +71 -11
  139. package/cli.js +0 -45
@@ -0,0 +1,365 @@
1
+ import chalk from "chalk";
2
+ import ora from "ora";
3
+ import { join } from "node:path";
4
+ import { loadConfig } from "../../config/configManager.js";
5
+ import { expandPath } from "../../config/paths.js";
6
+ import { getAuthenticatedSession, isSkoolLoginPage } from "../../shared/auth.js";
7
+ import { ensureDir, outputFile } from "../../shared/fs.js";
8
+ const SKOOL_DOMAIN = "www.skool.com";
9
+ const SKOOL_LOGIN_URL = "https://www.skool.com/login";
10
+ /**
11
+ * Inspects the page structure and logs useful debugging info.
12
+ */
13
+ export async function inspectCommand(url, options) {
14
+ console.log(chalk.blue("\nšŸ” Page Inspector\n"));
15
+ const config = loadConfig();
16
+ const spinner = ora("Connecting...").start();
17
+ let browser;
18
+ let session;
19
+ try {
20
+ const result = await getAuthenticatedSession({
21
+ domain: SKOOL_DOMAIN,
22
+ loginUrl: SKOOL_LOGIN_URL,
23
+ isLoginPage: isSkoolLoginPage,
24
+ }, { headless: false } // Always visible for inspection
25
+ );
26
+ browser = result.browser;
27
+ session = result.session;
28
+ spinner.succeed("Connected");
29
+ }
30
+ catch {
31
+ spinner.fail("Failed to connect");
32
+ console.log(chalk.red("\nāŒ Please run: course-grab login\n"));
33
+ process.exit(1);
34
+ }
35
+ try {
36
+ // Collect network requests to find video URLs
37
+ const videoRequests = [];
38
+ session.page.on("request", (request) => {
39
+ const reqUrl = request.url();
40
+ const resourceType = request.resourceType();
41
+ if (resourceType === "media" ||
42
+ reqUrl.includes(".mp4") ||
43
+ reqUrl.includes(".m3u8") ||
44
+ reqUrl.includes(".webm") ||
45
+ reqUrl.includes("vimeo") ||
46
+ reqUrl.includes("wistia") ||
47
+ reqUrl.includes("mux.com") ||
48
+ reqUrl.includes("cloudflare") ||
49
+ reqUrl.includes("stream")) {
50
+ videoRequests.push({ url: reqUrl, resourceType });
51
+ }
52
+ });
53
+ const pageSpinner = ora("Loading page...").start();
54
+ await session.page.goto(url, { timeout: 60000 });
55
+ // Use domcontentloaded instead of networkidle - some pages never stop loading
56
+ await session.page.waitForLoadState("domcontentloaded");
57
+ // Give it a moment for JS to render
58
+ await session.page.waitForTimeout(2000);
59
+ pageSpinner.succeed("Page loaded");
60
+ console.log(chalk.cyan("\nšŸ“„ Page Info:\n"));
61
+ console.log(` URL: ${session.page.url()}`);
62
+ console.log(` Title: ${await session.page.title()}`);
63
+ // Look for video preview/placeholder elements
64
+ const previewInfo = await session.page.evaluate(() => {
65
+ const previews = [];
66
+ // Common video preview patterns
67
+ const previewSelectors = [
68
+ // Play buttons
69
+ '[class*="play"]',
70
+ '[class*="Play"]',
71
+ 'button[class*="video"]',
72
+ '[aria-label*="play" i]',
73
+ '[aria-label*="Play" i]',
74
+ // Thumbnail overlays
75
+ '[class*="thumbnail"]',
76
+ '[class*="poster"]',
77
+ '[class*="preview"]',
78
+ '[class*="cover"]',
79
+ // SVG play icons
80
+ 'svg[class*="play"]',
81
+ // Clickable video containers
82
+ '[class*="video-container"]',
83
+ '[class*="player-container"]',
84
+ '[class*="video-wrapper"]',
85
+ // Data attributes
86
+ "[data-video]",
87
+ "[data-video-id]",
88
+ "[data-src]",
89
+ ];
90
+ for (const selector of previewSelectors) {
91
+ const elements = document.querySelectorAll(selector);
92
+ elements.forEach((el) => {
93
+ const rect = el.getBoundingClientRect();
94
+ // Only consider visible, reasonably sized elements
95
+ if (rect.width > 50 && rect.height > 50) {
96
+ previews.push({
97
+ selector,
98
+ description: `<${el.tagName.toLowerCase()}> class="${el.className}" (${Math.round(rect.width)}x${Math.round(rect.height)})`,
99
+ element: el.outerHTML.substring(0, 200),
100
+ });
101
+ }
102
+ });
103
+ }
104
+ return previews;
105
+ });
106
+ if (previewInfo.length > 0) {
107
+ console.log(chalk.yellow("\nšŸŽ¬ Potential Video Previews/Placeholders:\n"));
108
+ const seen = new Set();
109
+ for (const preview of previewInfo) {
110
+ if (seen.has(preview.description))
111
+ continue;
112
+ seen.add(preview.description);
113
+ console.log(` ${preview.description}`);
114
+ console.log(chalk.gray(` selector: ${preview.selector}`));
115
+ console.log(chalk.gray(` html: ${preview.element.substring(0, 100)}...`));
116
+ }
117
+ }
118
+ // If --click flag, try to click on video preview
119
+ if (options.click) {
120
+ console.log(chalk.cyan("\nšŸ‘† Attempting to click video preview...\n"));
121
+ const clicked = await session.page.evaluate(() => {
122
+ // Try various selectors for play button
123
+ const playSelectors = [
124
+ '[class*="play"]',
125
+ '[class*="Play"]',
126
+ 'button[class*="video"]',
127
+ '[class*="poster"]',
128
+ '[class*="thumbnail"]',
129
+ '[class*="video-container"]',
130
+ '[class*="player"]',
131
+ ];
132
+ for (const selector of playSelectors) {
133
+ const el = document.querySelector(selector);
134
+ if (el && el instanceof HTMLElement) {
135
+ const rect = el.getBoundingClientRect();
136
+ if (rect.width > 50 && rect.height > 50) {
137
+ el.click();
138
+ return { clicked: true, selector, element: el.outerHTML.substring(0, 100) };
139
+ }
140
+ }
141
+ }
142
+ return { clicked: false };
143
+ });
144
+ if (clicked.clicked) {
145
+ console.log(chalk.green(` āœ“ Clicked on: ${clicked.selector}`));
146
+ console.log(chalk.gray(` ${clicked.element}...`));
147
+ // Wait for video element to appear
148
+ console.log(chalk.gray(" Waiting for video element..."));
149
+ try {
150
+ await session.page.waitForSelector("video, iframe[src*='vimeo'], iframe[src*='wistia'], iframe[src*='youtube']", {
151
+ timeout: 5000,
152
+ });
153
+ console.log(chalk.green(" āœ“ Video element appeared!"));
154
+ }
155
+ catch {
156
+ console.log(chalk.yellow(" ⚠ No video element detected after click"));
157
+ }
158
+ // Small delay for any animations/loading
159
+ await session.page.waitForTimeout(1000);
160
+ }
161
+ else {
162
+ console.log(chalk.yellow(" ⚠ No clickable preview found"));
163
+ }
164
+ }
165
+ // Analyze page structure
166
+ const analysis = await session.page.evaluate(() => {
167
+ const result = {};
168
+ // Find all iframes (potential video embeds)
169
+ const iframes = document.querySelectorAll("iframe");
170
+ result.iframes = Array.from(iframes).map((iframe) => ({
171
+ src: iframe.src,
172
+ id: iframe.id,
173
+ className: iframe.className,
174
+ width: iframe.width,
175
+ height: iframe.height,
176
+ }));
177
+ // Find all video elements
178
+ const videos = document.querySelectorAll("video");
179
+ result.videos = Array.from(videos).map((video) => ({
180
+ src: video.src,
181
+ poster: video.poster,
182
+ className: video.className,
183
+ sources: Array.from(video.querySelectorAll("source")).map((s) => ({
184
+ src: s.src,
185
+ type: s.type,
186
+ })),
187
+ }));
188
+ // Find elements with video-related classes
189
+ const videoRelated = document.querySelectorAll('[class*="video"], [class*="player"], [class*="wistia"], [class*="vimeo"], [class*="embed"], [class*="media"]');
190
+ result.videoRelatedElements = Array.from(videoRelated).map((el) => ({
191
+ tagName: el.tagName,
192
+ className: el.className,
193
+ id: el.id,
194
+ dataAttributes: Object.fromEntries(Array.from(el.attributes)
195
+ .filter((attr) => attr.name.startsWith("data-"))
196
+ .map((attr) => [attr.name, attr.value])),
197
+ // Include src attributes that might have video URLs
198
+ src: el.getAttribute("src"),
199
+ href: el.getAttribute("href"),
200
+ }));
201
+ // Look for any script tags that might contain video configuration
202
+ const scripts = document.querySelectorAll("script");
203
+ const videoScripts = [];
204
+ scripts.forEach((script) => {
205
+ const content = script.textContent || "";
206
+ if (content.includes("vimeo") ||
207
+ content.includes("wistia") ||
208
+ content.includes("video") ||
209
+ content.includes("player") ||
210
+ content.includes("mux") ||
211
+ content.includes("cloudflare")) {
212
+ // Extract just the relevant parts
213
+ const matches = content.match(/(https?:\/\/[^\s"']+\.(mp4|m3u8|webm|mov)[^\s"']*)/gi);
214
+ if (matches) {
215
+ videoScripts.push(...matches);
216
+ }
217
+ // Also look for video IDs
218
+ const idMatches = content.match(/"(video[_-]?id|videoId|id)":\s*"([^"]+)"/gi);
219
+ if (idMatches) {
220
+ videoScripts.push(...idMatches);
221
+ }
222
+ }
223
+ });
224
+ result.videoScripts = [...new Set(videoScripts)];
225
+ // Find navigation/sidebar elements (for lessons)
226
+ const navElements = document.querySelectorAll('nav, [class*="sidebar"], [class*="nav"], [class*="menu"], [class*="lesson"]');
227
+ result.navigationElements = Array.from(navElements)
228
+ .slice(0, 10)
229
+ .map((el) => ({
230
+ tagName: el.tagName,
231
+ className: el.className,
232
+ id: el.id,
233
+ childCount: el.children.length,
234
+ links: Array.from(el.querySelectorAll("a")).map((a) => ({
235
+ href: a.href,
236
+ text: a.textContent?.trim().substring(0, 50),
237
+ })),
238
+ }));
239
+ // Find main content area
240
+ const contentAreas = document.querySelectorAll('main, article, [class*="content"], [class*="post"], [class*="body"]');
241
+ result.contentAreas = Array.from(contentAreas)
242
+ .slice(0, 5)
243
+ .map((el) => ({
244
+ tagName: el.tagName,
245
+ className: el.className,
246
+ id: el.id,
247
+ textLength: el.textContent?.length ?? 0,
248
+ hasVideo: el.querySelector("video, iframe") !== null,
249
+ }));
250
+ // Find all links to /classroom/
251
+ const classroomLinks = document.querySelectorAll('a[href*="/classroom/"]');
252
+ result.classroomLinks = Array.from(classroomLinks).map((a) => ({
253
+ href: a.href,
254
+ text: a.textContent?.trim().substring(0, 100),
255
+ className: a.className,
256
+ parentClass: a.parentElement?.className,
257
+ }));
258
+ // Get page structure overview
259
+ const getAllClasses = (el, depth = 0) => {
260
+ if (depth > 3)
261
+ return [];
262
+ const classes = [];
263
+ if (el.className && typeof el.className === "string") {
264
+ classes.push(`${" ".repeat(depth)}${el.tagName}.${el.className.split(" ").join(".")}`);
265
+ }
266
+ Array.from(el.children).forEach((child) => {
267
+ classes.push(...getAllClasses(child, depth + 1));
268
+ });
269
+ return classes;
270
+ };
271
+ result.bodyStructure = getAllClasses(document.body).slice(0, 100);
272
+ return result;
273
+ });
274
+ // Output analysis
275
+ console.log(chalk.cyan("\nšŸŽ¬ Video Sources:\n"));
276
+ if (analysis.iframes.length > 0) {
277
+ console.log(chalk.yellow(" Iframes:"));
278
+ for (const iframe of analysis.iframes) {
279
+ console.log(` - ${iframe.src}`);
280
+ console.log(chalk.gray(` class: ${iframe.className}`));
281
+ }
282
+ }
283
+ if (analysis.videos.length > 0) {
284
+ console.log(chalk.yellow("\n Video elements:"));
285
+ for (const video of analysis.videos) {
286
+ console.log(` - ${video.src || "(no src)"}`);
287
+ for (const source of video.sources) {
288
+ console.log(` source: ${source.src}`);
289
+ }
290
+ }
291
+ }
292
+ // Show video URLs found in scripts
293
+ const videoScripts = analysis.videoScripts;
294
+ if (videoScripts.length > 0) {
295
+ console.log(chalk.yellow("\n Video URLs from scripts:"));
296
+ for (const url of videoScripts.slice(0, 10)) {
297
+ console.log(chalk.green(` - ${url}`));
298
+ }
299
+ }
300
+ if (analysis.videoRelatedElements.length > 0) {
301
+ console.log(chalk.yellow("\n Video-related elements:"));
302
+ for (const el of analysis.videoRelatedElements.slice(0, 10)) {
303
+ console.log(` - <${el.tagName.toLowerCase()}> class="${el.className}"`);
304
+ if (el.src) {
305
+ console.log(chalk.green(` src: ${el.src}`));
306
+ }
307
+ if (Object.keys(el.dataAttributes).length > 0) {
308
+ console.log(chalk.gray(` data: ${JSON.stringify(el.dataAttributes)}`));
309
+ }
310
+ }
311
+ }
312
+ console.log(chalk.cyan("\nšŸ“š Classroom Links:\n"));
313
+ for (const link of analysis.classroomLinks.slice(0, 15)) {
314
+ console.log(` - ${link.text || "(no text)"}`);
315
+ console.log(chalk.gray(` ${link.href}`));
316
+ console.log(chalk.gray(` class: ${link.className}`));
317
+ }
318
+ console.log(chalk.cyan("\n🧭 Navigation Elements:\n"));
319
+ for (const nav of analysis.navigationElements) {
320
+ console.log(` <${nav.tagName.toLowerCase()}> class="${nav.className}"`);
321
+ if (nav.links.length > 0) {
322
+ console.log(chalk.gray(` Links: ${nav.links.length}`));
323
+ for (const link of nav.links.slice(0, 5)) {
324
+ console.log(chalk.gray(` - ${link.text}: ${link.href}`));
325
+ }
326
+ }
327
+ }
328
+ // Save full analysis to file if requested
329
+ if (options.output || options.full) {
330
+ const outputDir = expandPath(options.output ?? config.outputDir);
331
+ await ensureDir(outputDir);
332
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
333
+ const filename = `inspect-${timestamp}.json`;
334
+ const filepath = join(outputDir, filename);
335
+ await outputFile(filepath, JSON.stringify(analysis, null, 2));
336
+ console.log(chalk.green(`\nšŸ“ Full analysis saved to: ${filepath}\n`));
337
+ // Also save HTML
338
+ if (options.full) {
339
+ const html = await session.page.content();
340
+ const htmlPath = join(outputDir, `inspect-${timestamp}.html`);
341
+ await outputFile(htmlPath, html);
342
+ console.log(chalk.green(`šŸ“ HTML saved to: ${htmlPath}\n`));
343
+ }
344
+ }
345
+ // Show network requests that looked like video
346
+ if (videoRequests.length > 0) {
347
+ console.log(chalk.cyan("\nšŸ“” Video-related Network Requests:\n"));
348
+ const seen = new Set();
349
+ for (const req of videoRequests) {
350
+ if (seen.has(req.url))
351
+ continue;
352
+ seen.add(req.url);
353
+ console.log(chalk.green(` - ${req.url.substring(0, 120)}`));
354
+ console.log(chalk.gray(` type: ${req.resourceType}`));
355
+ }
356
+ }
357
+ console.log(chalk.gray("\nšŸ’” Tips:"));
358
+ console.log(chalk.gray(" - Use --click to trigger lazy-loaded video players"));
359
+ console.log(chalk.gray(" - Use --full to save complete HTML for offline analysis\n"));
360
+ }
361
+ finally {
362
+ await browser.close();
363
+ }
364
+ }
365
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../../src/cli/commands/inspect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Handles the login command.
3
+ * Opens a browser for the user to log in manually.
4
+ */
5
+ export declare function loginCommand(options: {
6
+ force?: boolean;
7
+ }): Promise<void>;
8
+ /**
9
+ * Handles the logout command.
10
+ */
11
+ export declare function logoutCommand(): Promise<void>;
12
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAWA;;;GAGG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuC9E;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAQnD"}
@@ -0,0 +1,55 @@
1
+ import chalk from "chalk";
2
+ import { clearSession, getAuthenticatedSession, hasValidSession, isSkoolLoginPage, } from "../../shared/auth.js";
3
+ const SKOOL_DOMAIN = "www.skool.com";
4
+ const SKOOL_LOGIN_URL = "https://www.skool.com/login";
5
+ /**
6
+ * Handles the login command.
7
+ * Opens a browser for the user to log in manually.
8
+ */
9
+ export async function loginCommand(options) {
10
+ console.log(chalk.blue("\nšŸ” Skool.com Login\n"));
11
+ if ((await hasValidSession(SKOOL_DOMAIN)) && !options.force) {
12
+ console.log(chalk.yellow("āš ļø You already have an active session."));
13
+ console.log(chalk.gray(" Use --force to re-login anyway.\n"));
14
+ return;
15
+ }
16
+ if (options.force) {
17
+ await clearSession(SKOOL_DOMAIN);
18
+ console.log(chalk.gray(" Cleared existing session.\n"));
19
+ }
20
+ try {
21
+ const { browser } = await getAuthenticatedSession({
22
+ domain: SKOOL_DOMAIN,
23
+ loginUrl: SKOOL_LOGIN_URL,
24
+ isLoginPage: isSkoolLoginPage,
25
+ }, { headless: false });
26
+ // Close the browser after successful login
27
+ await browser.close();
28
+ console.log(chalk.green("āœ… Login successful!"));
29
+ console.log(chalk.gray(" Your session has been saved.\n"));
30
+ console.log(chalk.gray(" You can now use: offcourse sync <url>\n"));
31
+ }
32
+ catch (error) {
33
+ if (error instanceof Error && error.message.includes("Timeout")) {
34
+ console.log(chalk.red("\nāŒ Login timed out."));
35
+ console.log(chalk.gray(" Please try again and complete the login within 5 minutes.\n"));
36
+ }
37
+ else {
38
+ console.log(chalk.red("\nāŒ Login failed:"), error);
39
+ }
40
+ process.exit(1);
41
+ }
42
+ }
43
+ /**
44
+ * Handles the logout command.
45
+ */
46
+ export async function logoutCommand() {
47
+ console.log(chalk.blue("\nšŸ”“ Logging out...\n"));
48
+ if (await clearSession(SKOOL_DOMAIN)) {
49
+ console.log(chalk.green("āœ… Session cleared successfully.\n"));
50
+ }
51
+ else {
52
+ console.log(chalk.yellow("āš ļø No active session found.\n"));
53
+ }
54
+ }
55
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../../src/cli/commands/login.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EACL,YAAY,EACZ,uBAAuB,EACvB,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAE9B,MAAM,YAAY,GAAG,eAAe,CAAC;AACrC,MAAM,eAAe,GAAG,6BAA6B,CAAC;AAEtD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAA4B;IAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAElD,IAAI,CAAC,MAAM,eAAe,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yCAAyC,CAAC,CAAC,CAAC;QACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC,CAAC;QAChE,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,MAAM,YAAY,CAAC,YAAY,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,uBAAuB,CAC/C;YACE,MAAM,EAAE,YAAY;YACpB,QAAQ,EAAE,eAAe;YACzB,WAAW,EAAE,gBAAgB;SAC9B,EACD,EAAE,QAAQ,EAAE,KAAK,EAAE,CACpB,CAAC;QAEF,2CAA2C;QAC3C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAEtB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC;YAC/C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC,CAAC;QAC5F,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAEjD,IAAI,MAAM,YAAY,CAAC,YAAY,CAAC,EAAE,CAAC;QACrC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC;IAChE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,gCAAgC,CAAC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ export interface StatusOptions {
2
+ errors?: boolean;
3
+ pending?: boolean;
4
+ all?: boolean;
5
+ }
6
+ /**
7
+ * Handles the status command.
8
+ * Shows the current sync state for a course.
9
+ */
10
+ export declare function statusCommand(url: string, options: StatusOptions): void;
11
+ /**
12
+ * List all synced courses.
13
+ */
14
+ export declare function statusListCommand(): Promise<void>;
15
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,GAAG,CAAC,EAAE,OAAO,CAAC;CACf;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI,CAkFvE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCvD"}
@@ -0,0 +1,118 @@
1
+ import chalk from "chalk";
2
+ import { CourseDatabase, extractCommunitySlug, LessonStatus, getDbPath, } from "../../state/index.js";
3
+ import { existsSync } from "node:fs";
4
+ /**
5
+ * Handles the status command.
6
+ * Shows the current sync state for a course.
7
+ */
8
+ export function statusCommand(url, options) {
9
+ console.log(chalk.blue("\nšŸ“Š Course Status\n"));
10
+ // Validate URL
11
+ if (!url.includes("skool.com")) {
12
+ console.log(chalk.red("āŒ Invalid URL. Please provide a Skool URL."));
13
+ process.exit(1);
14
+ }
15
+ const communitySlug = extractCommunitySlug(url);
16
+ const dbPath = getDbPath(communitySlug);
17
+ if (!existsSync(dbPath)) {
18
+ console.log(chalk.yellow(` No sync state found for: ${communitySlug}`));
19
+ console.log(chalk.gray(` Run 'offcourse sync ${url}' to start syncing.\n`));
20
+ return;
21
+ }
22
+ const db = new CourseDatabase(communitySlug);
23
+ try {
24
+ const meta = db.getCourseMetadata();
25
+ const summary = db.getStatusSummary();
26
+ console.log(chalk.white(` Course: ${meta.name}`));
27
+ console.log(chalk.gray(` URL: ${meta.url}`));
28
+ console.log(chalk.gray(` Last sync: ${meta.lastSyncAt ?? "never"}`));
29
+ console.log();
30
+ console.log(chalk.gray(` Modules: ${meta.totalModules}`));
31
+ console.log(chalk.gray(` Lessons: ${meta.totalLessons}`));
32
+ console.log();
33
+ console.log(chalk.green(` āœ… Downloaded: ${summary.downloaded}`));
34
+ if (summary.validated > 0) {
35
+ console.log(chalk.blue(` ā¬‡ļø Ready to download: ${summary.validated}`));
36
+ }
37
+ if (summary.pending > 0) {
38
+ console.log(chalk.gray(` šŸ” Not scanned yet: ${summary.pending}`));
39
+ }
40
+ if (summary.skipped > 0) {
41
+ console.log(chalk.gray(` āž– No video: ${summary.skipped}`));
42
+ }
43
+ if (summary.error > 0) {
44
+ console.log(chalk.red(` āŒ Failed: ${summary.error}`));
45
+ }
46
+ // Show error details if requested
47
+ if (options.errors || options.all) {
48
+ const errorLessons = db.getLessonsByStatus(LessonStatus.ERROR);
49
+ if (errorLessons.length > 0) {
50
+ console.log(chalk.red("\n āŒ Failed Lessons:\n"));
51
+ for (const lesson of errorLessons) {
52
+ console.log(chalk.red(` • ${lesson.moduleName} > ${lesson.name}`));
53
+ if (lesson.errorMessage) {
54
+ console.log(chalk.gray(` ${lesson.errorMessage}`));
55
+ }
56
+ if (lesson.errorCode) {
57
+ console.log(chalk.gray(` Code: ${lesson.errorCode}`));
58
+ }
59
+ }
60
+ }
61
+ }
62
+ // Show not-scanned details if requested
63
+ if (options.pending || options.all) {
64
+ const pendingLessons = db.getLessonsByStatus(LessonStatus.PENDING);
65
+ if (pendingLessons.length > 0) {
66
+ console.log(chalk.yellow("\n šŸ” Not Yet Scanned:\n"));
67
+ let currentModule = "";
68
+ for (const lesson of pendingLessons) {
69
+ if (lesson.moduleName !== currentModule) {
70
+ currentModule = lesson.moduleName;
71
+ console.log(chalk.blue(`\n šŸ“– ${currentModule}`));
72
+ }
73
+ console.log(chalk.gray(` • ${lesson.name}`));
74
+ }
75
+ }
76
+ }
77
+ console.log();
78
+ }
79
+ finally {
80
+ db.close();
81
+ }
82
+ }
83
+ /**
84
+ * List all synced courses.
85
+ */
86
+ export async function statusListCommand() {
87
+ console.log(chalk.blue("\nšŸ“š Synced Courses\n"));
88
+ const { getDbDir } = await import("../../state/index.js");
89
+ const { readdirSync } = await import("node:fs");
90
+ const dbDir = getDbDir();
91
+ if (!existsSync(dbDir)) {
92
+ console.log(chalk.gray(" No courses synced yet.\n"));
93
+ return;
94
+ }
95
+ const files = readdirSync(dbDir).filter((f) => f.endsWith(".db"));
96
+ if (files.length === 0) {
97
+ console.log(chalk.gray(" No courses synced yet.\n"));
98
+ return;
99
+ }
100
+ for (const file of files) {
101
+ const slug = file.replace(".db", "");
102
+ const db = new CourseDatabase(slug);
103
+ try {
104
+ const meta = db.getCourseMetadata();
105
+ const summary = db.getStatusSummary();
106
+ console.log(chalk.white(` ${meta.name || slug}`));
107
+ console.log(chalk.gray(` └─ ${summary.downloaded}/${meta.totalLessons} downloaded`));
108
+ if (summary.error > 0) {
109
+ console.log(chalk.red(` ${summary.error} errors`));
110
+ }
111
+ console.log();
112
+ }
113
+ finally {
114
+ db.close();
115
+ }
116
+ }
117
+ }
118
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/cli/commands/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface SyncOptions {
2
+ skipVideos?: boolean;
3
+ skipContent?: boolean;
4
+ dryRun?: boolean;
5
+ limit?: number;
6
+ force?: boolean;
7
+ retryFailed?: boolean;
8
+ visible?: boolean;
9
+ }
10
+ /**
11
+ * Handles the sync command.
12
+ * Downloads all content from a Skool course with incremental state tracking.
13
+ */
14
+ export declare function syncCommand(url: string, options: SyncOptions): Promise<void>;
15
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/sync.ts"],"names":[],"mappings":"AAgGA,MAAM,WAAW,WAAW;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAmMlF"}