@mweinbach/apple-docs-mcp 1.0.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 (267) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +560 -0
  3. package/dist/constants/browser-headers.d.ts +48 -0
  4. package/dist/constants/browser-headers.d.ts.map +1 -0
  5. package/dist/constants/browser-headers.js +166 -0
  6. package/dist/constants/browser-headers.js.map +1 -0
  7. package/dist/index.d.ts +83 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +215 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schemas/analyze-api.schema.d.ts +42 -0
  12. package/dist/schemas/analyze-api.schema.d.ts.map +1 -0
  13. package/dist/schemas/analyze-api.schema.js +23 -0
  14. package/dist/schemas/analyze-api.schema.js.map +1 -0
  15. package/dist/schemas/apple-docs.schema.d.ts +18 -0
  16. package/dist/schemas/apple-docs.schema.d.ts.map +1 -0
  17. package/dist/schemas/apple-docs.schema.js +10 -0
  18. package/dist/schemas/apple-docs.schema.js.map +1 -0
  19. package/dist/schemas/doc-content.schema.d.ts +24 -0
  20. package/dist/schemas/doc-content.schema.d.ts.map +1 -0
  21. package/dist/schemas/doc-content.schema.js +10 -0
  22. package/dist/schemas/doc-content.schema.js.map +1 -0
  23. package/dist/schemas/documentation-updates.schema.d.ts +27 -0
  24. package/dist/schemas/documentation-updates.schema.d.ts.map +1 -0
  25. package/dist/schemas/documentation-updates.schema.js +12 -0
  26. package/dist/schemas/documentation-updates.schema.js.map +1 -0
  27. package/dist/schemas/framework-symbols.schema.d.ts +24 -0
  28. package/dist/schemas/framework-symbols.schema.d.ts.map +1 -0
  29. package/dist/schemas/framework-symbols.schema.js +11 -0
  30. package/dist/schemas/framework-symbols.schema.js.map +1 -0
  31. package/dist/schemas/index.d.ts +15 -0
  32. package/dist/schemas/index.d.ts.map +1 -0
  33. package/dist/schemas/index.js +15 -0
  34. package/dist/schemas/index.js.map +1 -0
  35. package/dist/schemas/platform-compatibility.schema.d.ts +18 -0
  36. package/dist/schemas/platform-compatibility.schema.d.ts.map +1 -0
  37. package/dist/schemas/platform-compatibility.schema.js +8 -0
  38. package/dist/schemas/platform-compatibility.schema.js.map +1 -0
  39. package/dist/schemas/references.schema.d.ts +18 -0
  40. package/dist/schemas/references.schema.d.ts.map +1 -0
  41. package/dist/schemas/references.schema.js +9 -0
  42. package/dist/schemas/references.schema.js.map +1 -0
  43. package/dist/schemas/related-apis.schema.d.ts +21 -0
  44. package/dist/schemas/related-apis.schema.d.ts.map +1 -0
  45. package/dist/schemas/related-apis.schema.js +9 -0
  46. package/dist/schemas/related-apis.schema.js.map +1 -0
  47. package/dist/schemas/sample-code.schema.d.ts +21 -0
  48. package/dist/schemas/sample-code.schema.d.ts.map +1 -0
  49. package/dist/schemas/sample-code.schema.js +10 -0
  50. package/dist/schemas/sample-code.schema.js.map +1 -0
  51. package/dist/schemas/search.schema.d.ts +15 -0
  52. package/dist/schemas/search.schema.d.ts.map +1 -0
  53. package/dist/schemas/search.schema.js +8 -0
  54. package/dist/schemas/search.schema.js.map +1 -0
  55. package/dist/schemas/similar-apis.schema.d.ts +21 -0
  56. package/dist/schemas/similar-apis.schema.d.ts.map +1 -0
  57. package/dist/schemas/similar-apis.schema.js +9 -0
  58. package/dist/schemas/similar-apis.schema.js.map +1 -0
  59. package/dist/schemas/technologies.schema.d.ts +21 -0
  60. package/dist/schemas/technologies.schema.d.ts.map +1 -0
  61. package/dist/schemas/technologies.schema.js +10 -0
  62. package/dist/schemas/technologies.schema.js.map +1 -0
  63. package/dist/schemas/technology-overviews.schema.d.ts +24 -0
  64. package/dist/schemas/technology-overviews.schema.d.ts.map +1 -0
  65. package/dist/schemas/technology-overviews.schema.js +11 -0
  66. package/dist/schemas/technology-overviews.schema.js.map +1 -0
  67. package/dist/schemas/wwdc.schemas.d.ts +208 -0
  68. package/dist/schemas/wwdc.schemas.d.ts.map +1 -0
  69. package/dist/schemas/wwdc.schemas.js +97 -0
  70. package/dist/schemas/wwdc.schemas.js.map +1 -0
  71. package/dist/tools/definitions.d.ts +10 -0
  72. package/dist/tools/definitions.d.ts.map +1 -0
  73. package/dist/tools/definitions.js +690 -0
  74. package/dist/tools/definitions.js.map +1 -0
  75. package/dist/tools/doc-fetcher.d.ts +19 -0
  76. package/dist/tools/doc-fetcher.d.ts.map +1 -0
  77. package/dist/tools/doc-fetcher.js +487 -0
  78. package/dist/tools/doc-fetcher.js.map +1 -0
  79. package/dist/tools/doc-formatter.d.ts +69 -0
  80. package/dist/tools/doc-formatter.d.ts.map +1 -0
  81. package/dist/tools/doc-formatter.js +208 -0
  82. package/dist/tools/doc-formatter.js.map +1 -0
  83. package/dist/tools/find-similar-apis.d.ts +5 -0
  84. package/dist/tools/find-similar-apis.d.ts.map +1 -0
  85. package/dist/tools/find-similar-apis.js +275 -0
  86. package/dist/tools/find-similar-apis.js.map +1 -0
  87. package/dist/tools/get-documentation-updates.d.ts +5 -0
  88. package/dist/tools/get-documentation-updates.d.ts.map +1 -0
  89. package/dist/tools/get-documentation-updates.js +244 -0
  90. package/dist/tools/get-documentation-updates.js.map +1 -0
  91. package/dist/tools/get-platform-compatibility.d.ts +5 -0
  92. package/dist/tools/get-platform-compatibility.d.ts.map +1 -0
  93. package/dist/tools/get-platform-compatibility.js +205 -0
  94. package/dist/tools/get-platform-compatibility.js.map +1 -0
  95. package/dist/tools/get-related-apis.d.ts +5 -0
  96. package/dist/tools/get-related-apis.d.ts.map +1 -0
  97. package/dist/tools/get-related-apis.js +155 -0
  98. package/dist/tools/get-related-apis.js.map +1 -0
  99. package/dist/tools/get-sample-code.d.ts +5 -0
  100. package/dist/tools/get-sample-code.d.ts.map +1 -0
  101. package/dist/tools/get-sample-code.js +375 -0
  102. package/dist/tools/get-sample-code.js.map +1 -0
  103. package/dist/tools/get-technology-overviews.d.ts +5 -0
  104. package/dist/tools/get-technology-overviews.d.ts.map +1 -0
  105. package/dist/tools/get-technology-overviews.js +306 -0
  106. package/dist/tools/get-technology-overviews.js.map +1 -0
  107. package/dist/tools/handlers.d.ts +29 -0
  108. package/dist/tools/handlers.d.ts.map +1 -0
  109. package/dist/tools/handlers.js +350 -0
  110. package/dist/tools/handlers.js.map +1 -0
  111. package/dist/tools/list-technologies.d.ts +5 -0
  112. package/dist/tools/list-technologies.d.ts.map +1 -0
  113. package/dist/tools/list-technologies.js +165 -0
  114. package/dist/tools/list-technologies.js.map +1 -0
  115. package/dist/tools/resolve-references-batch.d.ts +5 -0
  116. package/dist/tools/resolve-references-batch.d.ts.map +1 -0
  117. package/dist/tools/resolve-references-batch.js +199 -0
  118. package/dist/tools/resolve-references-batch.js.map +1 -0
  119. package/dist/tools/search-framework-symbols.d.ts +7 -0
  120. package/dist/tools/search-framework-symbols.d.ts.map +1 -0
  121. package/dist/tools/search-framework-symbols.js +235 -0
  122. package/dist/tools/search-framework-symbols.js.map +1 -0
  123. package/dist/tools/search-parser.d.ts +15 -0
  124. package/dist/tools/search-parser.d.ts.map +1 -0
  125. package/dist/tools/search-parser.js +188 -0
  126. package/dist/tools/search-parser.js.map +1 -0
  127. package/dist/tools/search-result-parser.d.ts +52 -0
  128. package/dist/tools/search-result-parser.d.ts.map +1 -0
  129. package/dist/tools/search-result-parser.js +137 -0
  130. package/dist/tools/search-result-parser.js.map +1 -0
  131. package/dist/tools/tools-guide.d.ts +124 -0
  132. package/dist/tools/tools-guide.d.ts.map +1 -0
  133. package/dist/tools/tools-guide.js +389 -0
  134. package/dist/tools/tools-guide.js.map +1 -0
  135. package/dist/tools/wwdc/content-extractor.d.ts +9 -0
  136. package/dist/tools/wwdc/content-extractor.d.ts.map +1 -0
  137. package/dist/tools/wwdc/content-extractor.js +520 -0
  138. package/dist/tools/wwdc/content-extractor.js.map +1 -0
  139. package/dist/tools/wwdc/topics-extractor.d.ts +32 -0
  140. package/dist/tools/wwdc/topics-extractor.d.ts.map +1 -0
  141. package/dist/tools/wwdc/topics-extractor.js +146 -0
  142. package/dist/tools/wwdc/topics-extractor.js.map +1 -0
  143. package/dist/tools/wwdc/video-list-extractor.d.ts +13 -0
  144. package/dist/tools/wwdc/video-list-extractor.d.ts.map +1 -0
  145. package/dist/tools/wwdc/video-list-extractor.js +238 -0
  146. package/dist/tools/wwdc/video-list-extractor.js.map +1 -0
  147. package/dist/tools/wwdc/wwdc-handlers.d.ts +32 -0
  148. package/dist/tools/wwdc/wwdc-handlers.d.ts.map +1 -0
  149. package/dist/tools/wwdc/wwdc-handlers.js +791 -0
  150. package/dist/tools/wwdc/wwdc-handlers.js.map +1 -0
  151. package/dist/types/apple-docs.d.ts +112 -0
  152. package/dist/types/apple-docs.d.ts.map +1 -0
  153. package/dist/types/apple-docs.js +5 -0
  154. package/dist/types/apple-docs.js.map +1 -0
  155. package/dist/types/cache.d.ts +28 -0
  156. package/dist/types/cache.d.ts.map +1 -0
  157. package/dist/types/cache.js +5 -0
  158. package/dist/types/cache.js.map +1 -0
  159. package/dist/types/content-sections.d.ts +37 -0
  160. package/dist/types/content-sections.d.ts.map +1 -0
  161. package/dist/types/content-sections.js +5 -0
  162. package/dist/types/content-sections.js.map +1 -0
  163. package/dist/types/error.d.ts +39 -0
  164. package/dist/types/error.d.ts.map +1 -0
  165. package/dist/types/error.js +21 -0
  166. package/dist/types/error.js.map +1 -0
  167. package/dist/types/headers.d.ts +95 -0
  168. package/dist/types/headers.d.ts.map +1 -0
  169. package/dist/types/headers.js +5 -0
  170. package/dist/types/headers.js.map +1 -0
  171. package/dist/types/http.d.ts +31 -0
  172. package/dist/types/http.d.ts.map +1 -0
  173. package/dist/types/http.js +5 -0
  174. package/dist/types/http.js.map +1 -0
  175. package/dist/types/index.d.ts +11 -0
  176. package/dist/types/index.d.ts.map +1 -0
  177. package/dist/types/index.js +12 -0
  178. package/dist/types/index.js.map +1 -0
  179. package/dist/types/search.d.ts +62 -0
  180. package/dist/types/search.d.ts.map +1 -0
  181. package/dist/types/search.js +5 -0
  182. package/dist/types/search.js.map +1 -0
  183. package/dist/types/sections.d.ts +64 -0
  184. package/dist/types/sections.d.ts.map +1 -0
  185. package/dist/types/sections.js +5 -0
  186. package/dist/types/sections.js.map +1 -0
  187. package/dist/types/tools/platform.d.ts +33 -0
  188. package/dist/types/tools/platform.d.ts.map +1 -0
  189. package/dist/types/tools/platform.js +5 -0
  190. package/dist/types/tools/platform.js.map +1 -0
  191. package/dist/types/tools/sample-code.d.ts +23 -0
  192. package/dist/types/tools/sample-code.d.ts.map +1 -0
  193. package/dist/types/tools/sample-code.js +5 -0
  194. package/dist/types/tools/sample-code.js.map +1 -0
  195. package/dist/types/tools/technology.d.ts +18 -0
  196. package/dist/types/tools/technology.d.ts.map +1 -0
  197. package/dist/types/tools/technology.js +5 -0
  198. package/dist/types/tools/technology.js.map +1 -0
  199. package/dist/types/tools/updates.d.ts +23 -0
  200. package/dist/types/tools/updates.d.ts.map +1 -0
  201. package/dist/types/tools/updates.js +5 -0
  202. package/dist/types/tools/updates.js.map +1 -0
  203. package/dist/types/wwdc.d.ts +200 -0
  204. package/dist/types/wwdc.d.ts.map +1 -0
  205. package/dist/types/wwdc.js +5 -0
  206. package/dist/types/wwdc.js.map +1 -0
  207. package/dist/utils/cache-warmer.d.ts +22 -0
  208. package/dist/utils/cache-warmer.d.ts.map +1 -0
  209. package/dist/utils/cache-warmer.js +115 -0
  210. package/dist/utils/cache-warmer.js.map +1 -0
  211. package/dist/utils/cache.d.ts +109 -0
  212. package/dist/utils/cache.d.ts.map +1 -0
  213. package/dist/utils/cache.js +302 -0
  214. package/dist/utils/cache.js.map +1 -0
  215. package/dist/utils/constants.d.ts +178 -0
  216. package/dist/utils/constants.d.ts.map +1 -0
  217. package/dist/utils/constants.js +266 -0
  218. package/dist/utils/constants.js.map +1 -0
  219. package/dist/utils/error-handler.d.ts +80 -0
  220. package/dist/utils/error-handler.d.ts.map +1 -0
  221. package/dist/utils/error-handler.js +437 -0
  222. package/dist/utils/error-handler.js.map +1 -0
  223. package/dist/utils/framework-mapper.d.ts +84 -0
  224. package/dist/utils/framework-mapper.d.ts.map +1 -0
  225. package/dist/utils/framework-mapper.js +534 -0
  226. package/dist/utils/framework-mapper.js.map +1 -0
  227. package/dist/utils/http-client.d.ts +130 -0
  228. package/dist/utils/http-client.d.ts.map +1 -0
  229. package/dist/utils/http-client.js +464 -0
  230. package/dist/utils/http-client.js.map +1 -0
  231. package/dist/utils/http-headers-generator.d.ts +151 -0
  232. package/dist/utils/http-headers-generator.d.ts.map +1 -0
  233. package/dist/utils/http-headers-generator.js +407 -0
  234. package/dist/utils/http-headers-generator.js.map +1 -0
  235. package/dist/utils/logger.d.ts +44 -0
  236. package/dist/utils/logger.d.ts.map +1 -0
  237. package/dist/utils/logger.js +73 -0
  238. package/dist/utils/logger.js.map +1 -0
  239. package/dist/utils/preloader.d.ts +20 -0
  240. package/dist/utils/preloader.d.ts.map +1 -0
  241. package/dist/utils/preloader.js +82 -0
  242. package/dist/utils/preloader.js.map +1 -0
  243. package/dist/utils/rate-limiter.d.ts +28 -0
  244. package/dist/utils/rate-limiter.d.ts.map +1 -0
  245. package/dist/utils/rate-limiter.js +48 -0
  246. package/dist/utils/rate-limiter.js.map +1 -0
  247. package/dist/utils/topic-mapper.d.ts +18 -0
  248. package/dist/utils/topic-mapper.d.ts.map +1 -0
  249. package/dist/utils/topic-mapper.js +182 -0
  250. package/dist/utils/topic-mapper.js.map +1 -0
  251. package/dist/utils/url-converter.d.ts +22 -0
  252. package/dist/utils/url-converter.d.ts.map +1 -0
  253. package/dist/utils/url-converter.js +70 -0
  254. package/dist/utils/url-converter.js.map +1 -0
  255. package/dist/utils/user-agent-pool.d.ts +241 -0
  256. package/dist/utils/user-agent-pool.d.ts.map +1 -0
  257. package/dist/utils/user-agent-pool.js +557 -0
  258. package/dist/utils/user-agent-pool.js.map +1 -0
  259. package/dist/utils/wwdc-data-source-path.d.ts +9 -0
  260. package/dist/utils/wwdc-data-source-path.d.ts.map +1 -0
  261. package/dist/utils/wwdc-data-source-path.js +22 -0
  262. package/dist/utils/wwdc-data-source-path.js.map +1 -0
  263. package/dist/utils/wwdc-data-source.d.ts +36 -0
  264. package/dist/utils/wwdc-data-source.d.ts.map +1 -0
  265. package/dist/utils/wwdc-data-source.js +133 -0
  266. package/dist/utils/wwdc-data-source.js.map +1 -0
  267. package/package.json +83 -0
@@ -0,0 +1,520 @@
1
+ /**
2
+ * WWDC video content extractor
3
+ */
4
+ import { JSDOM } from 'jsdom';
5
+ import { httpClient } from '../../utils/http-client.js';
6
+ import { logger } from '../../utils/logger.js';
7
+ import { WWDC_URLS, WWDC_CONFIG } from '../../utils/constants.js';
8
+ import { inferTopics } from '../../utils/topic-mapper.js';
9
+ /**
10
+ * Extract complete content for a single WWDC video
11
+ */
12
+ export async function extractVideoContent(videoUrl, videoId, year, knownTopics) {
13
+ try {
14
+ logger.info(`Extracting content for WWDC${year} video ${videoId}`);
15
+ // Get page HTML
16
+ const response = await httpClient.get(videoUrl);
17
+ const html = await response.text();
18
+ const dom = new JSDOM(html);
19
+ const document = dom.window.document;
20
+ // Extract basic information
21
+ const title = extractTitle(document);
22
+ const speakers = extractSpeakers(document);
23
+ const duration = extractDuration(document);
24
+ // Use known topics or infer topics
25
+ const topics = knownTopics || inferTopics(title, extractDescription(document));
26
+ // Detect if there's a Code tab (WWDC22 and later) - now only used for logging
27
+ const hasCodeTab = detectCodeTab(document, year);
28
+ logger.info(`Video ${videoId} has code tab: ${hasCodeTab}`);
29
+ // Extract transcript
30
+ const transcript = await extractTranscript(document, videoUrl);
31
+ const hasTranscript = transcript !== undefined;
32
+ // Extract code examples
33
+ let codeExamples;
34
+ // First try to extract from dedicated code page (WWDC22 and later)
35
+ codeExamples = await extractCodeExamples(document, videoUrl);
36
+ // If no code found and it's an early year, try extracting from transcript
37
+ if ((!codeExamples || codeExamples.length === 0) && parseInt(year) < WWDC_CONFIG.CODE_TAB_INTRODUCED_YEAR) {
38
+ codeExamples = extractCodeFromTranscript(document);
39
+ }
40
+ const hasCode = codeExamples !== undefined && codeExamples.length > 0;
41
+ // Extract chapter information
42
+ const chapters = extractChapters(document);
43
+ // Extract resource links
44
+ const resources = await extractResources(document, videoUrl);
45
+ // Extract related videos
46
+ const relatedVideos = await extractRelatedVideos(document, videoUrl);
47
+ const video = {
48
+ id: videoId,
49
+ year,
50
+ url: videoUrl,
51
+ title,
52
+ speakers,
53
+ duration,
54
+ topics,
55
+ hasTranscript,
56
+ hasCode,
57
+ transcript: hasTranscript ? transcript : undefined,
58
+ codeExamples: hasCode ? codeExamples : undefined,
59
+ chapters: chapters.length > 0 ? chapters : undefined,
60
+ resources,
61
+ relatedVideos: relatedVideos.length > 0 ? relatedVideos : undefined,
62
+ extractedAt: new Date().toISOString(),
63
+ };
64
+ return video;
65
+ }
66
+ catch (error) {
67
+ logger.error(`Failed to extract video ${videoId}:`, error);
68
+ throw error;
69
+ }
70
+ }
71
+ /**
72
+ * Extract title
73
+ */
74
+ function extractTitle(document) {
75
+ // Try multiple selectors
76
+ const selectors = [
77
+ 'h1.video-title',
78
+ 'h1[itemprop="name"]',
79
+ '.hero-title',
80
+ 'h1',
81
+ ];
82
+ for (const selector of selectors) {
83
+ const element = document.querySelector(selector);
84
+ if (element?.textContent) {
85
+ return element.textContent.trim();
86
+ }
87
+ }
88
+ return 'Untitled Video';
89
+ }
90
+ /**
91
+ * Extract description
92
+ */
93
+ function extractDescription(document) {
94
+ const selectors = [
95
+ '.video-description',
96
+ '.description',
97
+ '[itemprop="description"]',
98
+ 'meta[name="description"]',
99
+ ];
100
+ for (const selector of selectors) {
101
+ const element = document.querySelector(selector);
102
+ if (element) {
103
+ if (selector.includes('meta')) {
104
+ return element.getAttribute('content') || '';
105
+ }
106
+ return element.textContent?.trim() || '';
107
+ }
108
+ }
109
+ return '';
110
+ }
111
+ /**
112
+ * Extract speakers
113
+ */
114
+ function extractSpeakers(document) {
115
+ const speakers = [];
116
+ // Try to extract from description
117
+ const description = document.querySelector('.video-description, .description');
118
+ if (description) {
119
+ const text = description.textContent || '';
120
+ // Match "with [Speaker]" or "by [Speaker]" patterns
121
+ const speakerMatch = text.match(/(?:with|by)\s+([^.]+?)(?:\.|$)/i);
122
+ if (speakerMatch) {
123
+ const speakerText = speakerMatch[1];
124
+ // Split multiple speakers
125
+ speakers.push(...speakerText.split(/,\s*and\s*|,\s*|\s+and\s+/).map((s) => s.trim()));
126
+ }
127
+ }
128
+ return speakers.filter(s => s.length > 0);
129
+ }
130
+ /**
131
+ * Extract duration
132
+ */
133
+ function extractDuration(document) {
134
+ const selectors = [
135
+ '.video-duration',
136
+ '[itemprop="duration"]',
137
+ '.duration',
138
+ ];
139
+ for (const selector of selectors) {
140
+ const element = document.querySelector(selector);
141
+ if (element?.textContent) {
142
+ return element.textContent.trim();
143
+ }
144
+ }
145
+ return '';
146
+ }
147
+ /**
148
+ * Detect if there's a Code tab
149
+ */
150
+ function detectCodeTab(document, year) {
151
+ // WWDC22 and later typically have Code tabs
152
+ if (parseInt(year) >= WWDC_CONFIG.CODE_TAB_INTRODUCED_YEAR) {
153
+ const codeTab = document.querySelector('[data-supplement="code"], .code-tab, #code');
154
+ return codeTab !== null;
155
+ }
156
+ return false;
157
+ }
158
+ /**
159
+ * Extract transcript
160
+ */
161
+ async function extractTranscript(document, videoUrl) {
162
+ try {
163
+ // Find transcript container
164
+ const transcriptContainer = document.querySelector('.transcript, [data-supplement="transcript"], #transcript');
165
+ if (!transcriptContainer) {
166
+ // If page doesn't have transcript, try loading transcript tab
167
+ const transcriptUrl = videoUrl.replace(/\/$/, '') + '/transcript';
168
+ const transcriptResponse = await httpClient.get(transcriptUrl).catch(() => null);
169
+ const transcriptHtml = transcriptResponse ? await transcriptResponse.text() : null;
170
+ if (transcriptHtml) {
171
+ const transcriptDom = new JSDOM(transcriptHtml);
172
+ const transcriptDoc = transcriptDom.window.document;
173
+ return extractTranscriptFromDocument(transcriptDoc);
174
+ }
175
+ return undefined;
176
+ }
177
+ return extractTranscriptFromDocument(document);
178
+ }
179
+ catch (error) {
180
+ logger.warn('Failed to extract transcript:', error);
181
+ return undefined;
182
+ }
183
+ }
184
+ /**
185
+ * Extract transcript data from document
186
+ */
187
+ function extractTranscriptFromDocument(document) {
188
+ const segments = [];
189
+ let fullText = '';
190
+ // Find all transcript paragraphs
191
+ const paragraphs = document.querySelectorAll('.transcript p, .transcript-line, [data-timestamp]');
192
+ paragraphs.forEach((p) => {
193
+ const timestamp = p.getAttribute('data-timestamp') ||
194
+ p.querySelector('.timestamp')?.textContent || '';
195
+ const text = p.textContent?.replace(/^\d+:\d+\s*/, '').trim() || '';
196
+ if (text) {
197
+ if (timestamp) {
198
+ segments.push({ timestamp, text });
199
+ }
200
+ fullText += text + '\n\n';
201
+ }
202
+ });
203
+ return {
204
+ fullText: fullText.trim(),
205
+ segments,
206
+ };
207
+ }
208
+ /**
209
+ * Extract code examples (new page format)
210
+ */
211
+ async function extractCodeExamples(_document, videoUrl) {
212
+ const examples = [];
213
+ try {
214
+ // Try to load code tab page
215
+ const codeUrl = videoUrl.replace(/\/$/, '') + '/code';
216
+ logger.info(`Fetching code page: ${codeUrl}`);
217
+ const codeResponse = await httpClient.get(codeUrl).catch((err) => {
218
+ logger.warn(`Failed to fetch code page: ${err.message}`);
219
+ return null;
220
+ });
221
+ const codeHtml = codeResponse ? await codeResponse.text() : null;
222
+ if (codeHtml) {
223
+ logger.info(`Code page loaded, length: ${codeHtml.length}`);
224
+ const codeDom = new JSDOM(codeHtml);
225
+ const codeDoc = codeDom.window.document;
226
+ // Find all code blocks - WWDC2025 uses pre.code-source
227
+ const codeBlocks = codeDoc.querySelectorAll('pre.code-source, .code-listing, pre code, .code-sample');
228
+ logger.info(`Found ${codeBlocks.length} code blocks`);
229
+ codeBlocks.forEach((block) => {
230
+ // Get code content
231
+ const codeEl = block.querySelector('code') || block;
232
+ let code = codeEl.textContent || '';
233
+ // Clean up code indentation
234
+ code = cleanCodeIndentation(code);
235
+ if (!code || code.length < 10) {
236
+ return;
237
+ } // Skip too short code
238
+ // Find title and timestamp - usually in previous sibling element
239
+ let title = '';
240
+ let timestamp = '';
241
+ const prevSibling = block.previousElementSibling;
242
+ if (prevSibling) {
243
+ const text = prevSibling.textContent || '';
244
+ // Extract timestamp format like "11:02 - Speech Transcriber setup"
245
+ const match = text.match(/^(\d+:\d+)\s*-\s*(.+)$/);
246
+ if (match) {
247
+ timestamp = match[1];
248
+ title = match[2].trim();
249
+ }
250
+ else {
251
+ title = text.trim();
252
+ }
253
+ }
254
+ // If not found, try other methods
255
+ if (!timestamp) {
256
+ timestamp = block.closest('[data-timestamp]')?.getAttribute('data-timestamp') || '';
257
+ }
258
+ const language = detectLanguage(block);
259
+ examples.push({
260
+ timestamp,
261
+ title,
262
+ language,
263
+ code,
264
+ });
265
+ });
266
+ // Remove duplicates - sometimes same code block appears multiple times
267
+ const uniqueExamples = removeDuplicateCodeExamples(examples);
268
+ logger.info(`Extracted ${uniqueExamples.length} unique code examples (from ${examples.length} total)`);
269
+ return uniqueExamples;
270
+ }
271
+ else {
272
+ logger.warn('No code page HTML received');
273
+ }
274
+ return examples;
275
+ }
276
+ catch (error) {
277
+ logger.error('Failed to extract code examples:', error);
278
+ }
279
+ logger.info(`Returning ${examples.length} code examples`);
280
+ return examples;
281
+ }
282
+ /**
283
+ * Extract code from transcript (legacy pages)
284
+ */
285
+ function extractCodeFromTranscript(document) {
286
+ const examples = [];
287
+ // Find code blocks in transcript
288
+ const codeBlocks = document.querySelectorAll('.transcript pre code, .transcript .code-voice');
289
+ codeBlocks.forEach((block) => {
290
+ let code = block.textContent || '';
291
+ code = cleanCodeIndentation(code);
292
+ if (code && code.length > 20) { // Filter out too short code snippets
293
+ examples.push({
294
+ language: detectLanguage(block),
295
+ code,
296
+ });
297
+ }
298
+ });
299
+ return examples;
300
+ }
301
+ /**
302
+ * Detect code language
303
+ */
304
+ function detectLanguage(element) {
305
+ // Detect from class attribute
306
+ const className = element.className;
307
+ if (className.includes('swift')) {
308
+ return 'swift';
309
+ }
310
+ if (className.includes('objc') || className.includes('objective-c')) {
311
+ return 'objc';
312
+ }
313
+ if (className.includes('javascript') || className.includes('js')) {
314
+ return 'javascript';
315
+ }
316
+ // Detect from data attributes
317
+ const dataLang = element.getAttribute('data-language') ||
318
+ element.getAttribute('data-lang');
319
+ if (dataLang) {
320
+ return dataLang.toLowerCase();
321
+ }
322
+ // Default to Swift (most WWDC code is Swift)
323
+ return 'swift';
324
+ }
325
+ /**
326
+ * Extract chapter information
327
+ */
328
+ function extractChapters(document) {
329
+ const chapters = [];
330
+ const chapterElements = document.querySelectorAll('.chapter, .timeline-chapter, [data-chapter]');
331
+ chapterElements.forEach((element) => {
332
+ const title = element.querySelector('.chapter-title')?.textContent ||
333
+ element.textContent?.trim() || '';
334
+ const timestamp = element.getAttribute('data-timestamp') ||
335
+ element.querySelector('.timestamp')?.textContent || '';
336
+ if (title && timestamp) {
337
+ chapters.push({ title, timestamp });
338
+ }
339
+ });
340
+ return chapters;
341
+ }
342
+ /**
343
+ * Extract resource links
344
+ */
345
+ async function extractResources(document, videoUrl) {
346
+ const resources = {
347
+ resourceLinks: [],
348
+ };
349
+ try {
350
+ // Try to extract resources section from page
351
+ const resourceSection = document.querySelector('.resources-section, [data-resources], #resources');
352
+ if (!resourceSection) {
353
+ // If page doesn't have resources section, try loading resources tab
354
+ const resourcesUrl = videoUrl.replace(/\/$/, '') + '/resources';
355
+ logger.info(`Attempting to load resources page: ${resourcesUrl}`);
356
+ const resourcesResponse = await httpClient.get(resourcesUrl).catch(() => null);
357
+ if (resourcesResponse) {
358
+ const resourcesHtml = await resourcesResponse.text();
359
+ const resourcesDom = new JSDOM(resourcesHtml);
360
+ const resourcesDoc = resourcesDom.window.document;
361
+ return extractResourcesFromDocument(resourcesDoc);
362
+ }
363
+ }
364
+ else {
365
+ return extractResourcesFromDocument(document);
366
+ }
367
+ }
368
+ catch (error) {
369
+ logger.warn('Failed to extract resources:', error);
370
+ }
371
+ // Fallback: at least try to extract video download links
372
+ const downloadLinks = document.querySelectorAll('a[href*=".mp4"], a[download]');
373
+ downloadLinks.forEach((link) => {
374
+ const href = link.getAttribute('href') || '';
375
+ const text = link.textContent?.toLowerCase() || '';
376
+ if (href.includes('_hd.mp4') || text.includes('hd')) {
377
+ resources.hdVideo = href.startsWith('http') ? href : `${WWDC_URLS.BASE.replace('/videos', '')}${href}`;
378
+ }
379
+ else if (href.includes('_sd.mp4') || text.includes('sd')) {
380
+ resources.sdVideo = href.startsWith('http') ? href : `${WWDC_URLS.BASE.replace('/videos', '')}${href}`;
381
+ }
382
+ });
383
+ return resources;
384
+ }
385
+ /**
386
+ * Extract resources from document
387
+ */
388
+ function extractResourcesFromDocument(document) {
389
+ const resources = {
390
+ resourceLinks: [],
391
+ };
392
+ // Extract all resource links
393
+ const resourceLinks = document.querySelectorAll('a[href]');
394
+ const processedUrls = new Set();
395
+ resourceLinks.forEach((link) => {
396
+ const href = link.getAttribute('href') || '';
397
+ const text = link.textContent?.trim() || '';
398
+ if (!href || !text) {
399
+ return;
400
+ }
401
+ // Build complete URL
402
+ const fullUrl = href.startsWith('http') ? href : `${WWDC_URLS.BASE.replace('/videos', '')}${href}`;
403
+ // Avoid duplicates
404
+ if (processedUrls.has(fullUrl)) {
405
+ return;
406
+ }
407
+ processedUrls.add(fullUrl);
408
+ // Identify different types of resources
409
+ if (href.includes('_hd.mp4') || text.toLowerCase().includes('hd video')) {
410
+ resources.hdVideo = fullUrl;
411
+ }
412
+ else if (href.includes('_sd.mp4') || text.toLowerCase().includes('sd video')) {
413
+ resources.sdVideo = fullUrl;
414
+ }
415
+ else if (href.includes('sample-code') || href.endsWith('.zip')) {
416
+ resources.sampleProject = fullUrl;
417
+ }
418
+ else if (href.includes('/documentation/') ||
419
+ href.includes('/design/') ||
420
+ href.includes('/technotes/') ||
421
+ href.includes('/forums/') ||
422
+ text.includes('Human Interface Guidelines') ||
423
+ text.includes('Documentation') ||
424
+ text.includes('Forum')) {
425
+ // Add to resource links list
426
+ resources.resourceLinks.push({
427
+ title: text,
428
+ url: fullUrl,
429
+ });
430
+ }
431
+ });
432
+ return resources;
433
+ }
434
+ /**
435
+ * Extract related videos
436
+ */
437
+ async function extractRelatedVideos(document, videoUrl) {
438
+ const relatedVideos = [];
439
+ try {
440
+ // Find related videos section
441
+ const relatedSection = document.querySelector('.related-videos, [data-related], #related');
442
+ if (!relatedSection) {
443
+ // Try to find related video links from page bottom
444
+ const videoLinks = document.querySelectorAll('a[href*="/videos/play/wwdc"]');
445
+ const currentVideoId = videoUrl.match(/\/(\d+)\/?$/)?.[1];
446
+ videoLinks.forEach((link) => {
447
+ const href = link.getAttribute('href') || '';
448
+ const match = href.match(/\/videos\/play\/wwdc(\d{4})\/(\d+)\/?/);
449
+ if (match && match[2] !== currentVideoId) {
450
+ const year = match[1];
451
+ const id = match[2];
452
+ const title = link.textContent?.trim() || '';
453
+ // Filter out current video and already added videos
454
+ if (title && !relatedVideos.find(v => v.id === id)) {
455
+ relatedVideos.push({
456
+ id,
457
+ year,
458
+ title,
459
+ url: href.startsWith('http') ? href : `${WWDC_URLS.BASE.replace('/videos', '')}${href}`,
460
+ });
461
+ }
462
+ }
463
+ });
464
+ }
465
+ }
466
+ catch (error) {
467
+ logger.warn('Failed to extract related videos:', error);
468
+ }
469
+ return relatedVideos;
470
+ }
471
+ /**
472
+ * Clean up code indentation
473
+ */
474
+ function cleanCodeIndentation(code) {
475
+ const lines = code.split('\n');
476
+ // Remove empty lines at start and end
477
+ while (lines.length > 0 && lines[0].trim() === '') {
478
+ lines.shift();
479
+ }
480
+ while (lines.length > 0 && lines[lines.length - 1].trim() === '') {
481
+ lines.pop();
482
+ }
483
+ if (lines.length === 0) {
484
+ return '';
485
+ }
486
+ // Find minimum indentation (excluding empty lines)
487
+ const minIndent = lines
488
+ .filter(line => line.trim().length > 0)
489
+ .reduce((min, line) => {
490
+ const indent = line.match(/^(\s*)/)?.[1].length || 0;
491
+ return Math.min(min, indent);
492
+ }, Infinity);
493
+ // Remove common indentation
494
+ if (minIndent > 0 && minIndent !== Infinity) {
495
+ return lines
496
+ .map(line => line.substring(minIndent))
497
+ .join('\n')
498
+ .trim();
499
+ }
500
+ return lines.join('\n').trim();
501
+ }
502
+ /**
503
+ * Remove duplicate code examples
504
+ */
505
+ function removeDuplicateCodeExamples(examples) {
506
+ const seen = new Map();
507
+ for (const example of examples) {
508
+ // Use code content as key
509
+ const key = example.code.trim();
510
+ // If haven't seen this code, or current one has better metadata (title or timestamp)
511
+ const existing = seen.get(key);
512
+ if (!existing ||
513
+ (example.title && !existing.title) ||
514
+ (example.timestamp && !existing.timestamp)) {
515
+ seen.set(key, example);
516
+ }
517
+ }
518
+ return Array.from(seen.values());
519
+ }
520
+ //# sourceMappingURL=content-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"content-extractor.js","sourceRoot":"","sources":["../../../src/tools/wwdc/content-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * WWDC video topic classification extractor
3
+ */
4
+ export interface Topic {
5
+ id: string;
6
+ name: string;
7
+ url: string;
8
+ description?: string;
9
+ videoCount?: number;
10
+ }
11
+ export interface TopicVideo {
12
+ id: string;
13
+ year: string;
14
+ title: string;
15
+ duration: string;
16
+ description?: string;
17
+ thumbnail?: string;
18
+ url: string;
19
+ }
20
+ /**
21
+ * Extract all topic categories
22
+ */
23
+ export declare function extractAllTopics(): Promise<Topic[]>;
24
+ /**
25
+ * Extract all videos for a specific topic
26
+ */
27
+ export declare function extractTopicVideos(topicId: string): Promise<TopicVideo[]>;
28
+ /**
29
+ * Standard topic mapping (ensures consistency)
30
+ */
31
+ export declare const TOPIC_ID_TO_NAME: Record<string, string>;
32
+ //# sourceMappingURL=topics-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topics-extractor.d.ts","sourceRoot":"","sources":["../../../src/tools/wwdc/topics-extractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAyEzD;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CA4D/E;AAED;;GAEG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoBnD,CAAC"}