@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.
- package/LICENSE +21 -0
- package/README.md +560 -0
- package/dist/constants/browser-headers.d.ts +48 -0
- package/dist/constants/browser-headers.d.ts.map +1 -0
- package/dist/constants/browser-headers.js +166 -0
- package/dist/constants/browser-headers.js.map +1 -0
- package/dist/index.d.ts +83 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +215 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas/analyze-api.schema.d.ts +42 -0
- package/dist/schemas/analyze-api.schema.d.ts.map +1 -0
- package/dist/schemas/analyze-api.schema.js +23 -0
- package/dist/schemas/analyze-api.schema.js.map +1 -0
- package/dist/schemas/apple-docs.schema.d.ts +18 -0
- package/dist/schemas/apple-docs.schema.d.ts.map +1 -0
- package/dist/schemas/apple-docs.schema.js +10 -0
- package/dist/schemas/apple-docs.schema.js.map +1 -0
- package/dist/schemas/doc-content.schema.d.ts +24 -0
- package/dist/schemas/doc-content.schema.d.ts.map +1 -0
- package/dist/schemas/doc-content.schema.js +10 -0
- package/dist/schemas/doc-content.schema.js.map +1 -0
- package/dist/schemas/documentation-updates.schema.d.ts +27 -0
- package/dist/schemas/documentation-updates.schema.d.ts.map +1 -0
- package/dist/schemas/documentation-updates.schema.js +12 -0
- package/dist/schemas/documentation-updates.schema.js.map +1 -0
- package/dist/schemas/framework-symbols.schema.d.ts +24 -0
- package/dist/schemas/framework-symbols.schema.d.ts.map +1 -0
- package/dist/schemas/framework-symbols.schema.js +11 -0
- package/dist/schemas/framework-symbols.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +15 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +15 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/schemas/platform-compatibility.schema.d.ts +18 -0
- package/dist/schemas/platform-compatibility.schema.d.ts.map +1 -0
- package/dist/schemas/platform-compatibility.schema.js +8 -0
- package/dist/schemas/platform-compatibility.schema.js.map +1 -0
- package/dist/schemas/references.schema.d.ts +18 -0
- package/dist/schemas/references.schema.d.ts.map +1 -0
- package/dist/schemas/references.schema.js +9 -0
- package/dist/schemas/references.schema.js.map +1 -0
- package/dist/schemas/related-apis.schema.d.ts +21 -0
- package/dist/schemas/related-apis.schema.d.ts.map +1 -0
- package/dist/schemas/related-apis.schema.js +9 -0
- package/dist/schemas/related-apis.schema.js.map +1 -0
- package/dist/schemas/sample-code.schema.d.ts +21 -0
- package/dist/schemas/sample-code.schema.d.ts.map +1 -0
- package/dist/schemas/sample-code.schema.js +10 -0
- package/dist/schemas/sample-code.schema.js.map +1 -0
- package/dist/schemas/search.schema.d.ts +15 -0
- package/dist/schemas/search.schema.d.ts.map +1 -0
- package/dist/schemas/search.schema.js +8 -0
- package/dist/schemas/search.schema.js.map +1 -0
- package/dist/schemas/similar-apis.schema.d.ts +21 -0
- package/dist/schemas/similar-apis.schema.d.ts.map +1 -0
- package/dist/schemas/similar-apis.schema.js +9 -0
- package/dist/schemas/similar-apis.schema.js.map +1 -0
- package/dist/schemas/technologies.schema.d.ts +21 -0
- package/dist/schemas/technologies.schema.d.ts.map +1 -0
- package/dist/schemas/technologies.schema.js +10 -0
- package/dist/schemas/technologies.schema.js.map +1 -0
- package/dist/schemas/technology-overviews.schema.d.ts +24 -0
- package/dist/schemas/technology-overviews.schema.d.ts.map +1 -0
- package/dist/schemas/technology-overviews.schema.js +11 -0
- package/dist/schemas/technology-overviews.schema.js.map +1 -0
- package/dist/schemas/wwdc.schemas.d.ts +208 -0
- package/dist/schemas/wwdc.schemas.d.ts.map +1 -0
- package/dist/schemas/wwdc.schemas.js +97 -0
- package/dist/schemas/wwdc.schemas.js.map +1 -0
- package/dist/tools/definitions.d.ts +10 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +690 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/doc-fetcher.d.ts +19 -0
- package/dist/tools/doc-fetcher.d.ts.map +1 -0
- package/dist/tools/doc-fetcher.js +487 -0
- package/dist/tools/doc-fetcher.js.map +1 -0
- package/dist/tools/doc-formatter.d.ts +69 -0
- package/dist/tools/doc-formatter.d.ts.map +1 -0
- package/dist/tools/doc-formatter.js +208 -0
- package/dist/tools/doc-formatter.js.map +1 -0
- package/dist/tools/find-similar-apis.d.ts +5 -0
- package/dist/tools/find-similar-apis.d.ts.map +1 -0
- package/dist/tools/find-similar-apis.js +275 -0
- package/dist/tools/find-similar-apis.js.map +1 -0
- package/dist/tools/get-documentation-updates.d.ts +5 -0
- package/dist/tools/get-documentation-updates.d.ts.map +1 -0
- package/dist/tools/get-documentation-updates.js +244 -0
- package/dist/tools/get-documentation-updates.js.map +1 -0
- package/dist/tools/get-platform-compatibility.d.ts +5 -0
- package/dist/tools/get-platform-compatibility.d.ts.map +1 -0
- package/dist/tools/get-platform-compatibility.js +205 -0
- package/dist/tools/get-platform-compatibility.js.map +1 -0
- package/dist/tools/get-related-apis.d.ts +5 -0
- package/dist/tools/get-related-apis.d.ts.map +1 -0
- package/dist/tools/get-related-apis.js +155 -0
- package/dist/tools/get-related-apis.js.map +1 -0
- package/dist/tools/get-sample-code.d.ts +5 -0
- package/dist/tools/get-sample-code.d.ts.map +1 -0
- package/dist/tools/get-sample-code.js +375 -0
- package/dist/tools/get-sample-code.js.map +1 -0
- package/dist/tools/get-technology-overviews.d.ts +5 -0
- package/dist/tools/get-technology-overviews.d.ts.map +1 -0
- package/dist/tools/get-technology-overviews.js +306 -0
- package/dist/tools/get-technology-overviews.js.map +1 -0
- package/dist/tools/handlers.d.ts +29 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +350 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/list-technologies.d.ts +5 -0
- package/dist/tools/list-technologies.d.ts.map +1 -0
- package/dist/tools/list-technologies.js +165 -0
- package/dist/tools/list-technologies.js.map +1 -0
- package/dist/tools/resolve-references-batch.d.ts +5 -0
- package/dist/tools/resolve-references-batch.d.ts.map +1 -0
- package/dist/tools/resolve-references-batch.js +199 -0
- package/dist/tools/resolve-references-batch.js.map +1 -0
- package/dist/tools/search-framework-symbols.d.ts +7 -0
- package/dist/tools/search-framework-symbols.d.ts.map +1 -0
- package/dist/tools/search-framework-symbols.js +235 -0
- package/dist/tools/search-framework-symbols.js.map +1 -0
- package/dist/tools/search-parser.d.ts +15 -0
- package/dist/tools/search-parser.d.ts.map +1 -0
- package/dist/tools/search-parser.js +188 -0
- package/dist/tools/search-parser.js.map +1 -0
- package/dist/tools/search-result-parser.d.ts +52 -0
- package/dist/tools/search-result-parser.d.ts.map +1 -0
- package/dist/tools/search-result-parser.js +137 -0
- package/dist/tools/search-result-parser.js.map +1 -0
- package/dist/tools/tools-guide.d.ts +124 -0
- package/dist/tools/tools-guide.d.ts.map +1 -0
- package/dist/tools/tools-guide.js +389 -0
- package/dist/tools/tools-guide.js.map +1 -0
- package/dist/tools/wwdc/content-extractor.d.ts +9 -0
- package/dist/tools/wwdc/content-extractor.d.ts.map +1 -0
- package/dist/tools/wwdc/content-extractor.js +520 -0
- package/dist/tools/wwdc/content-extractor.js.map +1 -0
- package/dist/tools/wwdc/topics-extractor.d.ts +32 -0
- package/dist/tools/wwdc/topics-extractor.d.ts.map +1 -0
- package/dist/tools/wwdc/topics-extractor.js +146 -0
- package/dist/tools/wwdc/topics-extractor.js.map +1 -0
- package/dist/tools/wwdc/video-list-extractor.d.ts +13 -0
- package/dist/tools/wwdc/video-list-extractor.d.ts.map +1 -0
- package/dist/tools/wwdc/video-list-extractor.js +238 -0
- package/dist/tools/wwdc/video-list-extractor.js.map +1 -0
- package/dist/tools/wwdc/wwdc-handlers.d.ts +32 -0
- package/dist/tools/wwdc/wwdc-handlers.d.ts.map +1 -0
- package/dist/tools/wwdc/wwdc-handlers.js +791 -0
- package/dist/tools/wwdc/wwdc-handlers.js.map +1 -0
- package/dist/types/apple-docs.d.ts +112 -0
- package/dist/types/apple-docs.d.ts.map +1 -0
- package/dist/types/apple-docs.js +5 -0
- package/dist/types/apple-docs.js.map +1 -0
- package/dist/types/cache.d.ts +28 -0
- package/dist/types/cache.d.ts.map +1 -0
- package/dist/types/cache.js +5 -0
- package/dist/types/cache.js.map +1 -0
- package/dist/types/content-sections.d.ts +37 -0
- package/dist/types/content-sections.d.ts.map +1 -0
- package/dist/types/content-sections.js +5 -0
- package/dist/types/content-sections.js.map +1 -0
- package/dist/types/error.d.ts +39 -0
- package/dist/types/error.d.ts.map +1 -0
- package/dist/types/error.js +21 -0
- package/dist/types/error.js.map +1 -0
- package/dist/types/headers.d.ts +95 -0
- package/dist/types/headers.d.ts.map +1 -0
- package/dist/types/headers.js +5 -0
- package/dist/types/headers.js.map +1 -0
- package/dist/types/http.d.ts +31 -0
- package/dist/types/http.d.ts.map +1 -0
- package/dist/types/http.js +5 -0
- package/dist/types/http.js.map +1 -0
- package/dist/types/index.d.ts +11 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +12 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/search.d.ts +62 -0
- package/dist/types/search.d.ts.map +1 -0
- package/dist/types/search.js +5 -0
- package/dist/types/search.js.map +1 -0
- package/dist/types/sections.d.ts +64 -0
- package/dist/types/sections.d.ts.map +1 -0
- package/dist/types/sections.js +5 -0
- package/dist/types/sections.js.map +1 -0
- package/dist/types/tools/platform.d.ts +33 -0
- package/dist/types/tools/platform.d.ts.map +1 -0
- package/dist/types/tools/platform.js +5 -0
- package/dist/types/tools/platform.js.map +1 -0
- package/dist/types/tools/sample-code.d.ts +23 -0
- package/dist/types/tools/sample-code.d.ts.map +1 -0
- package/dist/types/tools/sample-code.js +5 -0
- package/dist/types/tools/sample-code.js.map +1 -0
- package/dist/types/tools/technology.d.ts +18 -0
- package/dist/types/tools/technology.d.ts.map +1 -0
- package/dist/types/tools/technology.js +5 -0
- package/dist/types/tools/technology.js.map +1 -0
- package/dist/types/tools/updates.d.ts +23 -0
- package/dist/types/tools/updates.d.ts.map +1 -0
- package/dist/types/tools/updates.js +5 -0
- package/dist/types/tools/updates.js.map +1 -0
- package/dist/types/wwdc.d.ts +200 -0
- package/dist/types/wwdc.d.ts.map +1 -0
- package/dist/types/wwdc.js +5 -0
- package/dist/types/wwdc.js.map +1 -0
- package/dist/utils/cache-warmer.d.ts +22 -0
- package/dist/utils/cache-warmer.d.ts.map +1 -0
- package/dist/utils/cache-warmer.js +115 -0
- package/dist/utils/cache-warmer.js.map +1 -0
- package/dist/utils/cache.d.ts +109 -0
- package/dist/utils/cache.d.ts.map +1 -0
- package/dist/utils/cache.js +302 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/constants.d.ts +178 -0
- package/dist/utils/constants.d.ts.map +1 -0
- package/dist/utils/constants.js +266 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/error-handler.d.ts +80 -0
- package/dist/utils/error-handler.d.ts.map +1 -0
- package/dist/utils/error-handler.js +437 -0
- package/dist/utils/error-handler.js.map +1 -0
- package/dist/utils/framework-mapper.d.ts +84 -0
- package/dist/utils/framework-mapper.d.ts.map +1 -0
- package/dist/utils/framework-mapper.js +534 -0
- package/dist/utils/framework-mapper.js.map +1 -0
- package/dist/utils/http-client.d.ts +130 -0
- package/dist/utils/http-client.d.ts.map +1 -0
- package/dist/utils/http-client.js +464 -0
- package/dist/utils/http-client.js.map +1 -0
- package/dist/utils/http-headers-generator.d.ts +151 -0
- package/dist/utils/http-headers-generator.d.ts.map +1 -0
- package/dist/utils/http-headers-generator.js +407 -0
- package/dist/utils/http-headers-generator.js.map +1 -0
- package/dist/utils/logger.d.ts +44 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +73 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/preloader.d.ts +20 -0
- package/dist/utils/preloader.d.ts.map +1 -0
- package/dist/utils/preloader.js +82 -0
- package/dist/utils/preloader.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +28 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +48 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/topic-mapper.d.ts +18 -0
- package/dist/utils/topic-mapper.d.ts.map +1 -0
- package/dist/utils/topic-mapper.js +182 -0
- package/dist/utils/topic-mapper.js.map +1 -0
- package/dist/utils/url-converter.d.ts +22 -0
- package/dist/utils/url-converter.d.ts.map +1 -0
- package/dist/utils/url-converter.js +70 -0
- package/dist/utils/url-converter.js.map +1 -0
- package/dist/utils/user-agent-pool.d.ts +241 -0
- package/dist/utils/user-agent-pool.d.ts.map +1 -0
- package/dist/utils/user-agent-pool.js +557 -0
- package/dist/utils/user-agent-pool.js.map +1 -0
- package/dist/utils/wwdc-data-source-path.d.ts +9 -0
- package/dist/utils/wwdc-data-source-path.d.ts.map +1 -0
- package/dist/utils/wwdc-data-source-path.js +22 -0
- package/dist/utils/wwdc-data-source-path.js.map +1 -0
- package/dist/utils/wwdc-data-source.d.ts +36 -0
- package/dist/utils/wwdc-data-source.d.ts.map +1 -0
- package/dist/utils/wwdc-data-source.js +133 -0
- package/dist/utils/wwdc-data-source.js.map +1 -0
- 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"}
|