@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,146 @@
1
+ /**
2
+ * WWDC video topic classification 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 } from '../../utils/constants.js';
8
+ /**
9
+ * Extract all topic categories
10
+ */
11
+ export async function extractAllTopics() {
12
+ const url = WWDC_URLS.TOPICS;
13
+ logger.info('Extracting topic categories list...');
14
+ try {
15
+ const response = await httpClient.get(url);
16
+ const html = await response.text();
17
+ const dom = new JSDOM(html);
18
+ const document = dom.window.document;
19
+ const topics = [];
20
+ // Find topic links - look for both /videos/topics/xxx and /videos/xxx/ formats
21
+ const topicLinks = document.querySelectorAll('a[href*="/videos/"]');
22
+ topicLinks.forEach((link) => {
23
+ const href = link.getAttribute('href') || '';
24
+ // Look for topic links in different formats
25
+ const match = href.match(/\/videos\/topics\/([a-z-]+)/) ||
26
+ href.match(/\/videos\/([a-z-]+)\/?$/);
27
+ if (match && !href.includes('/play/')) {
28
+ const id = match[1];
29
+ // Skip non-topic links
30
+ if (id === 'all-videos' || id === 'collections' || id === 'about' ||
31
+ id === 'wwdc' || /^\d+$/.test(id)) {
32
+ return;
33
+ }
34
+ // Extract name from heading or link text
35
+ const heading = link.querySelector('h3, h4') || link;
36
+ const name = heading.textContent?.trim() || '';
37
+ if (!name) {
38
+ return;
39
+ }
40
+ // Extract video count if available
41
+ let videoCount = 0; // Default to 0
42
+ const countElement = link.querySelector('p');
43
+ if (countElement) {
44
+ const countMatch = countElement.textContent?.match(/(\d+)\s*videos?/i);
45
+ if (countMatch) {
46
+ videoCount = parseInt(countMatch[1]);
47
+ }
48
+ }
49
+ topics.push({
50
+ id,
51
+ name,
52
+ url: `${WWDC_URLS.BASE.replace('/videos', '')}${href}`,
53
+ videoCount,
54
+ });
55
+ }
56
+ });
57
+ // Remove duplicates
58
+ const uniqueTopics = Array.from(new Map(topics.map(t => [t.id, t])).values());
59
+ // Sort alphabetically by name
60
+ uniqueTopics.sort((a, b) => a.name.localeCompare(b.name));
61
+ logger.info(`Found ${uniqueTopics.length} topic categories`);
62
+ return uniqueTopics;
63
+ }
64
+ catch (error) {
65
+ logger.error('Failed to extract topic categories:', error);
66
+ throw new Error(`Failed to extract topics: ${error instanceof Error ? error.message : String(error)}`);
67
+ }
68
+ }
69
+ /**
70
+ * Extract all videos for a specific topic
71
+ */
72
+ export async function extractTopicVideos(topicId) {
73
+ const url = WWDC_URLS.getTopicUrl(topicId);
74
+ logger.info(`Extracting video list for topic ${topicId}...`);
75
+ try {
76
+ const response = await httpClient.get(url);
77
+ const html = await response.text();
78
+ const dom = new JSDOM(html);
79
+ const document = dom.window.document;
80
+ const videos = [];
81
+ // Find video cards
82
+ const videoCards = document.querySelectorAll('a[href*="/videos/play/"]');
83
+ videoCards.forEach((card) => {
84
+ const href = card.getAttribute('href') || '';
85
+ const match = href.match(/\/videos\/play\/wwdc(\d{4})\/(\d+)\//);
86
+ if (match) {
87
+ const year = match[1];
88
+ const id = match[2];
89
+ // Extract title
90
+ const titleEl = card.querySelector('h4, .title, [class*="title"]');
91
+ const title = titleEl?.textContent?.trim() || '';
92
+ // Extract duration
93
+ const durationEl = card.querySelector('.video-duration, [class*="duration"], time');
94
+ const duration = durationEl?.textContent?.trim() || '';
95
+ // Extract description
96
+ const descEl = card.querySelector('p, .description, [class*="description"]');
97
+ const description = descEl?.textContent?.trim();
98
+ // Extract thumbnail
99
+ const imgEl = card.querySelector('img');
100
+ const thumbnail = imgEl?.getAttribute('src') || imgEl?.getAttribute('data-src') || undefined;
101
+ if (title) {
102
+ videos.push({
103
+ id,
104
+ year,
105
+ title,
106
+ duration,
107
+ description,
108
+ thumbnail,
109
+ url: `${WWDC_URLS.BASE.replace('/videos', '')}${href}`,
110
+ });
111
+ }
112
+ }
113
+ });
114
+ logger.info(`Found ${videos.length} videos`);
115
+ return videos;
116
+ }
117
+ catch (error) {
118
+ logger.error(`Failed to extract videos for topic ${topicId}:`, error);
119
+ throw error;
120
+ }
121
+ }
122
+ /**
123
+ * Standard topic mapping (ensures consistency)
124
+ */
125
+ export const TOPIC_ID_TO_NAME = {
126
+ 'accessibility-inclusion': 'Accessibility & Inclusion',
127
+ 'app-services': 'App Services',
128
+ 'app-store-distribution-marketing': 'App Store, Distribution & Marketing',
129
+ 'audio-video': 'Audio & Video',
130
+ 'business-education': 'Business & Education',
131
+ 'design': 'Design',
132
+ 'developer-tools': 'Developer Tools',
133
+ 'essentials': 'Essentials',
134
+ 'graphics-games': 'Graphics & Games',
135
+ 'health-fitness': 'Health & Fitness',
136
+ 'maps-location': 'Maps & Location',
137
+ 'machine-learning-ai': 'Machine Learning & AI',
138
+ 'photos-camera': 'Photos & Camera',
139
+ 'privacy-security': 'Privacy & Security',
140
+ 'safari-web': 'Safari & Web',
141
+ 'spatial-computing': 'Spatial Computing',
142
+ 'swift': 'Swift',
143
+ 'swiftui-ui-frameworks': 'SwiftUI & UI Frameworks',
144
+ 'system-services': 'System Services',
145
+ };
146
+ //# sourceMappingURL=topics-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"topics-extractor.js","sourceRoot":"","sources":["../../../src/tools/wwdc/topics-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * WWDC video list extractor
3
+ */
4
+ import type { VideoListItem } from '../../types/wwdc.js';
5
+ /**
6
+ * Extract all WWDC video list for specified year
7
+ */
8
+ export declare function extractVideoList(year: string): Promise<VideoListItem[]>;
9
+ /**
10
+ * Get all supported WWDC years
11
+ */
12
+ export declare function getAvailableYears(): Promise<string[]>;
13
+ //# sourceMappingURL=video-list-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-list-extractor.d.ts","sourceRoot":"","sources":["../../../src/tools/wwdc/video-list-extractor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEzD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,EAAE,CAAC,CA6D7E;AAqKD;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAuC3D"}
@@ -0,0 +1,238 @@
1
+ /**
2
+ * WWDC video list 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 } from '../../utils/constants.js';
8
+ /**
9
+ * Extract all WWDC video list for specified year
10
+ */
11
+ export async function extractVideoList(year) {
12
+ const url = WWDC_URLS.getYearUrl(year);
13
+ logger.info(`Extracting video list for WWDC${year} from ${url}`);
14
+ try {
15
+ const response = await httpClient.get(url);
16
+ const html = await response.text();
17
+ const dom = new JSDOM(html);
18
+ const document = dom.window.document;
19
+ const uniqueVideos = new Map();
20
+ // Find all video cards
21
+ const videoElements = document.querySelectorAll('.video-card, .collection-item, article[data-video-id], a[href*="/videos/play/"]');
22
+ videoElements.forEach(element => {
23
+ const video = extractVideoFromElement(element, year);
24
+ if (video && !uniqueVideos.has(video.id)) {
25
+ uniqueVideos.set(video.id, video);
26
+ }
27
+ });
28
+ // If first method found nothing, try alternative selectors
29
+ if (uniqueVideos.size === 0) {
30
+ logger.warn('No videos found with primary selectors, trying alternative method');
31
+ // Find all video links
32
+ const videoLinks = document.querySelectorAll(`a[href*="/videos/play/wwdc${year}/"]`);
33
+ videoLinks.forEach(link => {
34
+ const href = link.getAttribute('href') || '';
35
+ const match = href.match(/\/videos\/play\/wwdc\d+\/(\d+)\/?/);
36
+ if (match) {
37
+ const id = match[1];
38
+ if (!uniqueVideos.has(id)) {
39
+ const title = extractTitleFromLink(link);
40
+ const url = WWDC_URLS.getVideoUrl(year, id);
41
+ uniqueVideos.set(id, {
42
+ id,
43
+ url,
44
+ title,
45
+ duration: extractDurationFromLink(link),
46
+ thumbnail: extractThumbnailFromLink(link),
47
+ });
48
+ }
49
+ }
50
+ });
51
+ }
52
+ const videos = Array.from(uniqueVideos.values());
53
+ logger.info(`Found ${videos.length} videos for WWDC${year}`);
54
+ return videos;
55
+ }
56
+ catch (error) {
57
+ logger.error(`Failed to extract video list for WWDC${year}:`, error);
58
+ throw new Error(`Failed to extract video list for WWDC${year}: ${error instanceof Error ? error.message : String(error)}`);
59
+ }
60
+ }
61
+ /**
62
+ * Extract video information from element
63
+ */
64
+ function extractVideoFromElement(element, year) {
65
+ // Extract video ID
66
+ let id = null;
67
+ // Get from data attribute
68
+ id = element.getAttribute('data-video-id');
69
+ // Get from link
70
+ if (!id) {
71
+ const link = element.querySelector('a[href*="/videos/play/"]') || element;
72
+ const href = link.getAttribute('href') || '';
73
+ const match = href.match(/\/videos\/play\/wwdc\d+\/(\d+)\/?/);
74
+ if (match) {
75
+ id = match[1];
76
+ }
77
+ }
78
+ if (!id) {
79
+ return null;
80
+ }
81
+ // Extract title
82
+ const title = extractTitle(element);
83
+ // Build URL
84
+ const url = WWDC_URLS.getVideoUrl(year, id);
85
+ // Extract duration
86
+ const duration = extractDuration(element);
87
+ // Extract thumbnail
88
+ const thumbnail = extractThumbnail(element);
89
+ return {
90
+ id,
91
+ url,
92
+ title,
93
+ duration,
94
+ thumbnail,
95
+ };
96
+ }
97
+ /**
98
+ * Extract title
99
+ */
100
+ function extractTitle(element) {
101
+ const selectors = [
102
+ '.video-title',
103
+ '.item-title',
104
+ 'h2',
105
+ 'h3',
106
+ 'h4',
107
+ '[itemprop="name"]',
108
+ ];
109
+ for (const selector of selectors) {
110
+ const titleElement = element.querySelector(selector);
111
+ if (titleElement?.textContent) {
112
+ return titleElement.textContent.trim();
113
+ }
114
+ }
115
+ // Get from image alt attribute
116
+ const img = element.querySelector('img[alt]');
117
+ if (img) {
118
+ const alt = img.getAttribute('alt') || '';
119
+ if (alt && !alt.toLowerCase().includes('thumbnail')) {
120
+ return alt.trim();
121
+ }
122
+ }
123
+ return 'Untitled';
124
+ }
125
+ /**
126
+ * Extract title from link element
127
+ */
128
+ function extractTitleFromLink(link) {
129
+ // Try to get from link text
130
+ const linkText = link.textContent?.trim();
131
+ if (linkText && linkText.length > 3) {
132
+ return linkText;
133
+ }
134
+ // Try to get from parent element
135
+ const parent = link.parentElement;
136
+ if (parent) {
137
+ return extractTitle(parent);
138
+ }
139
+ // Try to get from adjacent element
140
+ const nextSibling = link.nextElementSibling;
141
+ if (nextSibling?.textContent) {
142
+ return nextSibling.textContent.trim();
143
+ }
144
+ return 'Untitled';
145
+ }
146
+ /**
147
+ * Extract duration
148
+ */
149
+ function extractDuration(element) {
150
+ const selectors = [
151
+ '.video-duration',
152
+ '.duration',
153
+ '.time',
154
+ '[itemprop="duration"]',
155
+ ];
156
+ for (const selector of selectors) {
157
+ const durationElement = element.querySelector(selector);
158
+ if (durationElement?.textContent) {
159
+ const duration = durationElement.textContent.trim();
160
+ // Validate if it's time format
161
+ if (/\d+:\d+/.test(duration)) {
162
+ return duration;
163
+ }
164
+ }
165
+ }
166
+ return '';
167
+ }
168
+ /**
169
+ * Extract duration from link element
170
+ */
171
+ function extractDurationFromLink(link) {
172
+ const parent = link.closest('.video-card, .collection-item, article');
173
+ if (parent) {
174
+ return extractDuration(parent);
175
+ }
176
+ return '';
177
+ }
178
+ /**
179
+ * Extract thumbnail
180
+ */
181
+ function extractThumbnail(element) {
182
+ const img = element.querySelector('img[src*="devimages"], img.thumbnail, img.video-thumbnail');
183
+ if (img) {
184
+ const src = img.getAttribute('src') || '';
185
+ if (src) {
186
+ return src.startsWith('http') ? src : `${WWDC_URLS.BASE.replace('/videos', '')}${src}`;
187
+ }
188
+ }
189
+ return '';
190
+ }
191
+ /**
192
+ * Extract thumbnail from link element
193
+ */
194
+ function extractThumbnailFromLink(link) {
195
+ const parent = link.closest('.video-card, .collection-item, article');
196
+ if (parent) {
197
+ return extractThumbnail(parent);
198
+ }
199
+ return '';
200
+ }
201
+ /**
202
+ * Get all supported WWDC years
203
+ */
204
+ export async function getAvailableYears() {
205
+ const url = WWDC_URLS.BASE;
206
+ logger.info('Fetching available WWDC years');
207
+ try {
208
+ const response = await httpClient.get(url);
209
+ const html = await response.text();
210
+ const dom = new JSDOM(html);
211
+ const document = dom.window.document;
212
+ const years = [];
213
+ // Find all WWDC links
214
+ const wwdcLinks = document.querySelectorAll('a[href*="/videos/wwdc"]');
215
+ wwdcLinks.forEach(link => {
216
+ const href = link.getAttribute('href') || '';
217
+ const match = href.match(/wwdc(\d{2,4})/);
218
+ if (match) {
219
+ const year = match[1];
220
+ // Convert 2-digit year to 4-digit
221
+ const fullYear = year.length === 2 ? `20${year}` : year;
222
+ if (!years.includes(fullYear)) {
223
+ years.push(fullYear);
224
+ }
225
+ }
226
+ });
227
+ // Sort by year in descending order
228
+ years.sort((a, b) => parseInt(b) - parseInt(a));
229
+ logger.info(`Found ${years.length} WWDC years: ${years.join(', ')}`);
230
+ return years;
231
+ }
232
+ catch (error) {
233
+ logger.error('Failed to fetch available years:', error);
234
+ // Return known years as fallback
235
+ return ['2025', '2024', '2023', '2022', '2021', '2020'];
236
+ }
237
+ }
238
+ //# sourceMappingURL=video-list-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"video-list-extractor.js","sourceRoot":"","sources":["../../../src/tools/wwdc/video-list-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * WWDC Video MCP Tool Handlers
3
+ */
4
+ /**
5
+ * List WWDC videos
6
+ */
7
+ export declare function handleListWWDCVideos(year?: string, topic?: string, hasCode?: boolean, limit?: number): Promise<string>;
8
+ /**
9
+ * Search WWDC content
10
+ */
11
+ export declare function handleSearchWWDCContent(query: string, searchIn?: 'transcript' | 'code' | 'both', year?: string, language?: string, limit?: number): Promise<string>;
12
+ /**
13
+ * Get WWDC video details
14
+ */
15
+ export declare function handleGetWWDCVideo(year: string, videoId: string, includeTranscript?: boolean, includeCode?: boolean): Promise<string>;
16
+ /**
17
+ * Get WWDC code examples
18
+ */
19
+ export declare function handleGetWWDCCodeExamples(framework?: string, topic?: string, year?: string, language?: string, limit?: number): Promise<string>;
20
+ /**
21
+ * Browse WWDC topics
22
+ */
23
+ export declare function handleBrowseWWDCTopics(topicId?: string, includeVideos?: boolean, year?: string, limit?: number): Promise<string>;
24
+ /**
25
+ * Find related WWDC videos
26
+ */
27
+ export declare function handleFindRelatedWWDCVideos(videoId: string, year: string, includeExplicitRelated?: boolean, includeTopicRelated?: boolean, includeYearRelated?: boolean, limit?: number): Promise<string>;
28
+ /**
29
+ * List all available WWDC years
30
+ */
31
+ export declare function handleListWWDCYears(): Promise<string>;
32
+ //# sourceMappingURL=wwdc-handlers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wwdc-handlers.d.ts","sourceRoot":"","sources":["../../../src/tools/wwdc/wwdc-handlers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiCH;;GAEG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,OAAO,EACjB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,MAAM,CAAC,CAwFjB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,MAAM,EACb,QAAQ,GAAE,YAAY,GAAG,MAAM,GAAG,MAAe,EACjD,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,MAAM,CAAC,CAoFjB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,iBAAiB,GAAE,OAAc,EACjC,WAAW,GAAE,OAAc,GAC1B,OAAO,CAAC,MAAM,CAAC,CAYjB;AAED;;GAEG;AACH,wBAAsB,yBAAyB,CAC7C,SAAS,CAAC,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,MAAM,EACd,IAAI,CAAC,EAAE,MAAM,EACb,QAAQ,CAAC,EAAE,MAAM,EACjB,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,MAAM,CAAC,CAqGjB;AA2VD;;GAEG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,CAAC,EAAE,MAAM,EAChB,aAAa,GAAE,OAAc,EAC7B,IAAI,CAAC,EAAE,MAAM,EACb,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,MAAM,CAAC,CAqGjB;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,MAAM,EACZ,sBAAsB,GAAE,OAAc,EACtC,mBAAmB,GAAE,OAAc,EACnC,kBAAkB,GAAE,OAAe,EACnC,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC,MAAM,CAAC,CA6JjB;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CA0C3D"}