@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,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":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAoBrD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,GAAG,GAAG,SAAS,CAAC,MAAM,CAAC;IAC7B,MAAM,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAEnD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QAErC,MAAM,MAAM,GAAY,EAAE,CAAC;QAE3B,+EAA+E;QAC/E,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,qBAAqB,CAAC,CAAC;QAEpE,UAAU,CAAC,OAAO,CAAC,CAAC,IAAa,EAAE,EAAE;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAE7C,4CAA4C;YAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC;gBAC3C,IAAI,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAElD,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtC,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAEpB,uBAAuB;gBACvB,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,KAAK,aAAa,IAAI,EAAE,KAAK,OAAO;oBAC7D,EAAE,KAAK,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;oBACtC,OAAO;gBACT,CAAC;gBAED,yCAAyC;gBACzC,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC;gBACrD,MAAM,IAAI,GAAG,OAAO,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAE/C,IAAI,CAAC,IAAI,EAAE,CAAC;oBACV,OAAO;gBACT,CAAC;gBAED,mCAAmC;gBACnC,IAAI,UAAU,GAAG,CAAC,CAAC,CAAE,eAAe;gBACpC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;gBAC7C,IAAI,YAAY,EAAE,CAAC;oBACjB,MAAM,UAAU,GAAG,YAAY,CAAC,WAAW,EAAE,KAAK,CAAC,kBAAkB,CAAC,CAAC;oBACvE,IAAI,UAAU,EAAE,CAAC;wBACf,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;oBACvC,CAAC;gBACH,CAAC;gBAED,MAAM,CAAC,IAAI,CAAC;oBACV,EAAE;oBACF,IAAI;oBACJ,GAAG,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE;oBACtD,UAAU;iBACX,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,oBAAoB;QACpB,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAC7B,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAC7C,CAAC;QAEF,8BAA8B;QAC9B,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAE1D,MAAM,CAAC,IAAI,CAAC,SAAS,YAAY,CAAC,MAAM,mBAAmB,CAAC,CAAC;QAC7D,OAAO,YAAY,CAAC;IAEtB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,6BAA6B,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzG,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAe;IACtD,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,CAAC,mCAAmC,OAAO,KAAK,CAAC,CAAC;IAE7D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QAErC,MAAM,MAAM,GAAiB,EAAE,CAAC;QAEhC,mBAAmB;QACnB,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,0BAA0B,CAAC,CAAC;QAEzE,UAAU,CAAC,OAAO,CAAC,CAAC,IAAa,EAAE,EAAE;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;YAEjE,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAEpB,gBAAgB;gBAChB,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,CAAC,8BAA8B,CAAC,CAAC;gBACnE,MAAM,KAAK,GAAG,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAEjD,mBAAmB;gBACnB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,4CAA4C,CAAC,CAAC;gBACpF,MAAM,QAAQ,GAAG,UAAU,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;gBAEvD,sBAAsB;gBACtB,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,yCAAyC,CAAC,CAAC;gBAC7E,MAAM,WAAW,GAAG,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;gBAEhD,oBAAoB;gBACpB,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;gBACxC,MAAM,SAAS,GAAG,KAAK,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,KAAK,EAAE,YAAY,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;gBAE7F,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,CAAC,IAAI,CAAC;wBACV,EAAE;wBACF,IAAI;wBACJ,KAAK;wBACL,QAAQ;wBACR,WAAW;wBACX,SAAS;wBACT,GAAG,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE;qBACvD,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,SAAS,CAAC,CAAC;QAC7C,OAAO,MAAM,CAAC;IAEhB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,sCAAsC,OAAO,GAAG,EAAE,KAAK,CAAC,CAAC;QACtE,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA2B;IACtD,yBAAyB,EAAE,2BAA2B;IACtD,cAAc,EAAE,cAAc;IAC9B,kCAAkC,EAAE,qCAAqC;IACzE,aAAa,EAAE,eAAe;IAC9B,oBAAoB,EAAE,sBAAsB;IAC5C,QAAQ,EAAE,QAAQ;IAClB,iBAAiB,EAAE,iBAAiB;IACpC,YAAY,EAAE,YAAY;IAC1B,gBAAgB,EAAE,kBAAkB;IACpC,gBAAgB,EAAE,kBAAkB;IACpC,eAAe,EAAE,iBAAiB;IAClC,qBAAqB,EAAE,uBAAuB;IAC9C,eAAe,EAAE,iBAAiB;IAClC,kBAAkB,EAAE,oBAAoB;IACxC,YAAY,EAAE,cAAc;IAC5B,mBAAmB,EAAE,mBAAmB;IACxC,OAAO,EAAE,OAAO;IAChB,uBAAuB,EAAE,yBAAyB;IAClD,iBAAiB,EAAE,iBAAiB;CACrC,CAAC"}
|
|
@@ -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":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAGrD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,IAAY;IACjD,MAAM,GAAG,GAAG,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,IAAI,CAAC,iCAAiC,IAAI,SAAS,GAAG,EAAE,CAAC,CAAC;IAEjE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QAErC,MAAM,YAAY,GAAG,IAAI,GAAG,EAAyB,CAAC;QAEtD,uBAAuB;QACvB,MAAM,aAAa,GAAG,QAAQ,CAAC,gBAAgB,CAC7C,iFAAiF,CAClF,CAAC;QAEF,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;YAC9B,MAAM,KAAK,GAAG,uBAAuB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrD,IAAI,KAAK,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;gBACzC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,2DAA2D;QAC3D,IAAI,YAAY,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;YAEjF,uBAAuB;YACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,gBAAgB,CAAC,6BAA6B,IAAI,KAAK,CAAC,CAAC;YAErF,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACxB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;gBAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBAE9D,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;oBACpB,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;wBAC1B,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;wBACzC,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;wBAE5C,YAAY,CAAC,GAAG,CAAC,EAAE,EAAE;4BACnB,EAAE;4BACF,GAAG;4BACH,KAAK;4BACL,QAAQ,EAAE,uBAAuB,CAAC,IAAI,CAAC;4BACvC,SAAS,EAAE,wBAAwB,CAAC,IAAI,CAAC;yBAC1C,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;QAED,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,CAAC,CAAC;QACjD,MAAM,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,MAAM,mBAAmB,IAAI,EAAE,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC;IAEhB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,wCAAwC,IAAI,GAAG,EAAE,KAAK,CAAC,CAAC;QACrE,MAAM,IAAI,KAAK,CAAC,wCAAwC,IAAI,KAAK,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAC7H,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,OAAgB,EAAE,IAAY;IAC7D,mBAAmB;IACnB,IAAI,EAAE,GAAkB,IAAI,CAAC;IAE7B,0BAA0B;IAC1B,EAAE,GAAG,OAAO,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC;IAE3C,gBAAgB;IAChB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,0BAA0B,CAAC,IAAI,OAAO,CAAC;QAC1E,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC9D,IAAI,KAAK,EAAE,CAAC;YACV,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAChB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gBAAgB;IAChB,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IAEpC,YAAY;IACZ,MAAM,GAAG,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAE5C,mBAAmB;IACnB,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE1C,oBAAoB;IACpB,MAAM,SAAS,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;IAE5C,OAAO;QACL,EAAE;QACF,GAAG;QACH,KAAK;QACL,QAAQ;QACR,SAAS;KACV,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,OAAgB;IACpC,MAAM,SAAS,GAAG;QAChB,cAAc;QACd,aAAa;QACb,IAAI;QACJ,IAAI;QACJ,IAAI;QACJ,mBAAmB;KACpB,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACrD,IAAI,YAAY,EAAE,WAAW,EAAE,CAAC;YAC9B,OAAO,YAAY,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAED,+BAA+B;IAC/B,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAC9C,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACpD,OAAO,GAAG,CAAC,IAAI,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,IAAa;IACzC,4BAA4B;IAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAC1C,IAAI,QAAQ,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,iCAAiC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC;IAClC,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED,mCAAmC;IACnC,MAAM,WAAW,GAAG,IAAI,CAAC,kBAAkB,CAAC;IAC5C,IAAI,WAAW,EAAE,WAAW,EAAE,CAAC;QAC7B,OAAO,WAAW,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACxC,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,OAAgB;IACvC,MAAM,SAAS,GAAG;QAChB,iBAAiB;QACjB,WAAW;QACX,OAAO;QACP,uBAAuB;KACxB,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,MAAM,eAAe,GAAG,OAAO,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,eAAe,EAAE,WAAW,EAAE,CAAC;YACjC,MAAM,QAAQ,GAAG,eAAe,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;YACpD,+BAA+B;YAC/B,IAAI,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC7B,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,IAAa;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;IACtE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,eAAe,CAAC,MAAM,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,OAAgB;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,aAAa,CAAC,2DAA2D,CAAC,CAAC;IAC/F,IAAI,GAAG,EAAE,CAAC;QACR,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QAC1C,IAAI,GAAG,EAAE,CAAC;YACR,OAAO,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC;QACzF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,IAAa;IAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,wCAAwC,CAAC,CAAC;IACtE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC;IAC3B,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;IAE7C,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC;QAErC,MAAM,KAAK,GAAa,EAAE,CAAC;QAE3B,sBAAsB;QACtB,MAAM,SAAS,GAAG,QAAQ,CAAC,gBAAgB,CAAC,yBAAyB,CAAC,CAAC;QAEvE,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YACvB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YAC1C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACtB,kCAAkC;gBAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;gBACxD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC9B,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,mCAAmC;QACnC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAEhD,MAAM,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,gBAAgB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,OAAO,KAAK,CAAC;IAEf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,CAAC,KAAK,CAAC,kCAAkC,EAAE,KAAK,CAAC,CAAC;QACxD,iCAAiC;QACjC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1D,CAAC;AACH,CAAC"}
|
|
@@ -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"}
|