@nahisaho/katashiro-collector 0.1.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/dist/api/api-client.d.ts +70 -0
- package/dist/api/api-client.d.ts.map +1 -0
- package/dist/api/api-client.js +132 -0
- package/dist/api/api-client.js.map +1 -0
- package/dist/api/index.d.ts +5 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +5 -0
- package/dist/api/index.js.map +1 -0
- package/dist/feed/feed-reader.d.ts +70 -0
- package/dist/feed/feed-reader.d.ts.map +1 -0
- package/dist/feed/feed-reader.js +272 -0
- package/dist/feed/feed-reader.js.map +1 -0
- package/dist/feed/index.d.ts +5 -0
- package/dist/feed/index.d.ts.map +1 -0
- package/dist/feed/index.js +5 -0
- package/dist/feed/index.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces.d.ts +53 -0
- package/dist/interfaces.d.ts.map +1 -0
- package/dist/interfaces.js +9 -0
- package/dist/interfaces.js.map +1 -0
- package/dist/media/index.d.ts +5 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +5 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/media-extractor.d.ts +74 -0
- package/dist/media/media-extractor.d.ts.map +1 -0
- package/dist/media/media-extractor.js +287 -0
- package/dist/media/media-extractor.js.map +1 -0
- package/dist/scraper/index.d.ts +5 -0
- package/dist/scraper/index.d.ts.map +1 -0
- package/dist/scraper/index.js +5 -0
- package/dist/scraper/index.js.map +1 -0
- package/dist/scraper/web-scraper.d.ts +48 -0
- package/dist/scraper/web-scraper.d.ts.map +1 -0
- package/dist/scraper/web-scraper.js +144 -0
- package/dist/scraper/web-scraper.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/web-search/index.d.ts +8 -0
- package/dist/web-search/index.d.ts.map +1 -0
- package/dist/web-search/index.js +8 -0
- package/dist/web-search/index.js.map +1 -0
- package/dist/web-search/web-search-client.d.ts +44 -0
- package/dist/web-search/web-search-client.d.ts.map +1 -0
- package/dist/web-search/web-search-client.js +131 -0
- package/dist/web-search/web-search-client.js.map +1 -0
- package/dist/youtube/index.d.ts +5 -0
- package/dist/youtube/index.d.ts.map +1 -0
- package/dist/youtube/index.js +5 -0
- package/dist/youtube/index.js.map +1 -0
- package/dist/youtube/youtube-transcript.d.ts +57 -0
- package/dist/youtube/youtube-transcript.d.ts.map +1 -0
- package/dist/youtube/youtube-transcript.js +228 -0
- package/dist/youtube/youtube-transcript.js.map +1 -0
- package/package.json +44 -0
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* YouTubeTranscript - YouTube字幕・メタデータ取得
|
|
3
|
+
*
|
|
4
|
+
* @requirement REQ-COLLECT-003
|
|
5
|
+
* @design DES-KATASHIRO-001 §2.2 Collector Container
|
|
6
|
+
* @task TSK-012
|
|
7
|
+
*/
|
|
8
|
+
import { ok, err, formatTimestamp, } from '@nahisaho/katashiro-core';
|
|
9
|
+
/**
|
|
10
|
+
* YouTube字幕・メタデータ取得実装
|
|
11
|
+
*/
|
|
12
|
+
export class YouTubeTranscript {
|
|
13
|
+
userAgent = 'Mozilla/5.0 (compatible; KATASHIRO/0.1.0)';
|
|
14
|
+
/**
|
|
15
|
+
* YouTube URLから動画IDを抽出
|
|
16
|
+
*/
|
|
17
|
+
extractVideoId(url) {
|
|
18
|
+
const patterns = [
|
|
19
|
+
// Standard: https://www.youtube.com/watch?v=VIDEO_ID
|
|
20
|
+
/[?&]v=([a-zA-Z0-9_-]{11})/,
|
|
21
|
+
// Short: https://youtu.be/VIDEO_ID
|
|
22
|
+
/youtu\.be\/([a-zA-Z0-9_-]{11})/,
|
|
23
|
+
// Embed: https://www.youtube.com/embed/VIDEO_ID
|
|
24
|
+
/youtube\.com\/embed\/([a-zA-Z0-9_-]{11})/,
|
|
25
|
+
// V format: https://www.youtube.com/v/VIDEO_ID
|
|
26
|
+
/youtube\.com\/v\/([a-zA-Z0-9_-]{11})/,
|
|
27
|
+
];
|
|
28
|
+
for (const pattern of patterns) {
|
|
29
|
+
const match = url.match(pattern);
|
|
30
|
+
if (match?.[1]) {
|
|
31
|
+
return match[1];
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 字幕を取得
|
|
38
|
+
*/
|
|
39
|
+
async getTranscript(url, language) {
|
|
40
|
+
const videoId = this.extractVideoId(url);
|
|
41
|
+
if (!videoId) {
|
|
42
|
+
return err(new Error('Invalid YouTube URL: Could not extract video ID'));
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const segments = await this.fetchTranscript(videoId, language);
|
|
46
|
+
return ok(segments);
|
|
47
|
+
}
|
|
48
|
+
catch (error) {
|
|
49
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
50
|
+
return err(new Error(`Transcript fetch error: ${message}`));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 動画メタデータを取得
|
|
55
|
+
*/
|
|
56
|
+
async getVideoMetadata(url) {
|
|
57
|
+
const videoId = this.extractVideoId(url);
|
|
58
|
+
if (!videoId) {
|
|
59
|
+
return err(new Error('Invalid YouTube URL: Could not extract video ID'));
|
|
60
|
+
}
|
|
61
|
+
try {
|
|
62
|
+
const metadata = await this.fetchMetadata(videoId);
|
|
63
|
+
return ok(metadata);
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
67
|
+
return err(new Error(`Metadata fetch error: ${message}`));
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* 字幕セグメントをテキストにフォーマット
|
|
72
|
+
*/
|
|
73
|
+
formatTranscript(segments) {
|
|
74
|
+
if (segments.length === 0) {
|
|
75
|
+
return '';
|
|
76
|
+
}
|
|
77
|
+
return segments
|
|
78
|
+
.map((segment) => {
|
|
79
|
+
const timestamp = this.formatTime(segment.startTime);
|
|
80
|
+
return `[${timestamp}] ${segment.text}`;
|
|
81
|
+
})
|
|
82
|
+
.join('\n');
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* 秒をMM:SS形式に変換
|
|
86
|
+
*/
|
|
87
|
+
formatTime(seconds) {
|
|
88
|
+
const mins = Math.floor(seconds / 60);
|
|
89
|
+
const secs = Math.floor(seconds % 60);
|
|
90
|
+
return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* YouTube APIから字幕を取得
|
|
94
|
+
* Note: 本番環境ではyoutube-transcript等のライブラリ使用推奨
|
|
95
|
+
*/
|
|
96
|
+
async fetchTranscript(videoId, language) {
|
|
97
|
+
// YouTube字幕取得のため、まず動画ページを取得
|
|
98
|
+
const videoPageUrl = `https://www.youtube.com/watch?v=${videoId}`;
|
|
99
|
+
const response = await fetch(videoPageUrl, {
|
|
100
|
+
headers: {
|
|
101
|
+
'User-Agent': this.userAgent,
|
|
102
|
+
'Accept-Language': language ?? 'en',
|
|
103
|
+
},
|
|
104
|
+
});
|
|
105
|
+
if (!response.ok) {
|
|
106
|
+
throw new Error(`HTTP error: ${response.status}`);
|
|
107
|
+
}
|
|
108
|
+
const html = await response.text();
|
|
109
|
+
// ytInitialPlayerResponse から字幕情報を抽出
|
|
110
|
+
const captionsMatch = html.match(/"captions":\s*({.*?"captionTracks".*?})\s*,\s*"videoDetails"/s);
|
|
111
|
+
if (!captionsMatch?.[1]) {
|
|
112
|
+
throw new Error('No captions available for this video');
|
|
113
|
+
}
|
|
114
|
+
try {
|
|
115
|
+
// 字幕トラックURLを取得
|
|
116
|
+
const captionsJson = captionsMatch[1].replace(/\\"/g, '"');
|
|
117
|
+
const captionUrlMatch = captionsJson.match(/"baseUrl":\s*"(https:[^"]+)"/);
|
|
118
|
+
if (!captionUrlMatch?.[1]) {
|
|
119
|
+
throw new Error('Could not find caption URL');
|
|
120
|
+
}
|
|
121
|
+
const captionUrl = captionUrlMatch[1].replace(/\\u0026/g, '&');
|
|
122
|
+
// 字幕XMLを取得
|
|
123
|
+
const captionResponse = await fetch(captionUrl);
|
|
124
|
+
if (!captionResponse.ok) {
|
|
125
|
+
throw new Error('Failed to fetch captions');
|
|
126
|
+
}
|
|
127
|
+
const captionXml = await captionResponse.text();
|
|
128
|
+
return this.parseTranscriptXml(captionXml);
|
|
129
|
+
}
|
|
130
|
+
catch (parseError) {
|
|
131
|
+
throw new Error(`Failed to parse captions: ${parseError instanceof Error ? parseError.message : 'Unknown error'}`);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* 字幕XMLをパース
|
|
136
|
+
*/
|
|
137
|
+
parseTranscriptXml(xml) {
|
|
138
|
+
const segments = [];
|
|
139
|
+
const textRegex = /<text start="([^"]+)" dur="([^"]+)"[^>]*>([^<]*)<\/text>/g;
|
|
140
|
+
let match;
|
|
141
|
+
while ((match = textRegex.exec(xml)) !== null) {
|
|
142
|
+
const startStr = match[1];
|
|
143
|
+
const durationStr = match[2];
|
|
144
|
+
const textStr = match[3];
|
|
145
|
+
if (startStr && durationStr && textStr !== undefined) {
|
|
146
|
+
const startTime = parseFloat(startStr);
|
|
147
|
+
const duration = parseFloat(durationStr);
|
|
148
|
+
const text = this.decodeHtmlEntities(textStr);
|
|
149
|
+
segments.push({
|
|
150
|
+
text,
|
|
151
|
+
startTime,
|
|
152
|
+
endTime: startTime + duration,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return segments;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* HTMLエンティティをデコード
|
|
160
|
+
*/
|
|
161
|
+
decodeHtmlEntities(text) {
|
|
162
|
+
return text
|
|
163
|
+
.replace(/&/g, '&')
|
|
164
|
+
.replace(/</g, '<')
|
|
165
|
+
.replace(/>/g, '>')
|
|
166
|
+
.replace(/"/g, '"')
|
|
167
|
+
.replace(/'/g, "'")
|
|
168
|
+
.replace(/'/g, "'")
|
|
169
|
+
.replace(/\n/g, ' ')
|
|
170
|
+
.trim();
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* 動画メタデータを取得
|
|
174
|
+
*/
|
|
175
|
+
async fetchMetadata(videoId) {
|
|
176
|
+
const videoPageUrl = `https://www.youtube.com/watch?v=${videoId}`;
|
|
177
|
+
const response = await fetch(videoPageUrl, {
|
|
178
|
+
headers: {
|
|
179
|
+
'User-Agent': this.userAgent,
|
|
180
|
+
},
|
|
181
|
+
});
|
|
182
|
+
if (!response.ok) {
|
|
183
|
+
throw new Error(`HTTP error: ${response.status}`);
|
|
184
|
+
}
|
|
185
|
+
const html = await response.text();
|
|
186
|
+
// ytInitialPlayerResponse からメタデータを抽出
|
|
187
|
+
const title = this.extractMetaContent(html, 'title') ?? 'Unknown';
|
|
188
|
+
const description = this.extractMetaContent(html, 'description') ?? '';
|
|
189
|
+
const thumbnailUrl = this.extractMetaContent(html, 'thumbnailUrl');
|
|
190
|
+
// 再生時間を抽出
|
|
191
|
+
const durationMatch = html.match(/"lengthSeconds":\s*"(\d+)"/);
|
|
192
|
+
const duration = durationMatch?.[1] ? parseInt(durationMatch[1], 10) : undefined;
|
|
193
|
+
return {
|
|
194
|
+
type: 'video',
|
|
195
|
+
title,
|
|
196
|
+
description,
|
|
197
|
+
thumbnailUrl: thumbnailUrl ?? undefined,
|
|
198
|
+
duration,
|
|
199
|
+
sourceUrl: videoPageUrl,
|
|
200
|
+
fetchedAt: formatTimestamp(),
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* メタタグからコンテンツを抽出
|
|
205
|
+
*/
|
|
206
|
+
extractMetaContent(html, property) {
|
|
207
|
+
const patterns = [
|
|
208
|
+
new RegExp(`<meta[^>]+property="og:${property}"[^>]+content="([^"]*)"`, 'i'),
|
|
209
|
+
new RegExp(`<meta[^>]+name="${property}"[^>]+content="([^"]*)"`, 'i'),
|
|
210
|
+
new RegExp(`<meta[^>]+itemprop="${property}"[^>]+content="([^"]*)"`, 'i'),
|
|
211
|
+
];
|
|
212
|
+
for (const pattern of patterns) {
|
|
213
|
+
const match = html.match(pattern);
|
|
214
|
+
if (match?.[1]) {
|
|
215
|
+
return this.decodeHtmlEntities(match[1]);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
// タイトルは<title>タグからも取得
|
|
219
|
+
if (property === 'title') {
|
|
220
|
+
const titleMatch = html.match(/<title[^>]*>([^<]+)<\/title>/i);
|
|
221
|
+
if (titleMatch?.[1]) {
|
|
222
|
+
return titleMatch[1].replace(/ - YouTube$/, '').trim();
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=youtube-transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube-transcript.js","sourceRoot":"","sources":["../../src/youtube/youtube-transcript.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@nahisaho/katashiro-collector",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "KATASHIRO Collector - 情報収集パッケージ",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"import": "./dist/index.js"
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
"files": [
|
|
15
|
+
"dist"
|
|
16
|
+
],
|
|
17
|
+
"scripts": {
|
|
18
|
+
"build": "tsc",
|
|
19
|
+
"clean": "rm -rf dist",
|
|
20
|
+
"test": "vitest run",
|
|
21
|
+
"test:watch": "vitest"
|
|
22
|
+
},
|
|
23
|
+
"dependencies": {
|
|
24
|
+
"@nahisaho/katashiro-core": "*"
|
|
25
|
+
},
|
|
26
|
+
"keywords": [
|
|
27
|
+
"katashiro",
|
|
28
|
+
"collector"
|
|
29
|
+
],
|
|
30
|
+
"author": "nahisaho",
|
|
31
|
+
"license": "MIT",
|
|
32
|
+
"repository": {
|
|
33
|
+
"type": "git",
|
|
34
|
+
"url": "https://github.com/nahisaho/katashiro.git",
|
|
35
|
+
"directory": "packages/collector"
|
|
36
|
+
},
|
|
37
|
+
"publishConfig": {
|
|
38
|
+
"access": "public"
|
|
39
|
+
},
|
|
40
|
+
"homepage": "https://github.com/nahisaho/katashiro#readme",
|
|
41
|
+
"bugs": {
|
|
42
|
+
"url": "https://github.com/nahisaho/katashiro/issues"
|
|
43
|
+
}
|
|
44
|
+
}
|