@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.
Files changed (61) hide show
  1. package/dist/api/api-client.d.ts +70 -0
  2. package/dist/api/api-client.d.ts.map +1 -0
  3. package/dist/api/api-client.js +132 -0
  4. package/dist/api/api-client.js.map +1 -0
  5. package/dist/api/index.d.ts +5 -0
  6. package/dist/api/index.d.ts.map +1 -0
  7. package/dist/api/index.js +5 -0
  8. package/dist/api/index.js.map +1 -0
  9. package/dist/feed/feed-reader.d.ts +70 -0
  10. package/dist/feed/feed-reader.d.ts.map +1 -0
  11. package/dist/feed/feed-reader.js +272 -0
  12. package/dist/feed/feed-reader.js.map +1 -0
  13. package/dist/feed/index.d.ts +5 -0
  14. package/dist/feed/index.d.ts.map +1 -0
  15. package/dist/feed/index.js +5 -0
  16. package/dist/feed/index.js.map +1 -0
  17. package/dist/index.d.ts +17 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +16 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/interfaces.d.ts +53 -0
  22. package/dist/interfaces.d.ts.map +1 -0
  23. package/dist/interfaces.js +9 -0
  24. package/dist/interfaces.js.map +1 -0
  25. package/dist/media/index.d.ts +5 -0
  26. package/dist/media/index.d.ts.map +1 -0
  27. package/dist/media/index.js +5 -0
  28. package/dist/media/index.js.map +1 -0
  29. package/dist/media/media-extractor.d.ts +74 -0
  30. package/dist/media/media-extractor.d.ts.map +1 -0
  31. package/dist/media/media-extractor.js +287 -0
  32. package/dist/media/media-extractor.js.map +1 -0
  33. package/dist/scraper/index.d.ts +5 -0
  34. package/dist/scraper/index.d.ts.map +1 -0
  35. package/dist/scraper/index.js +5 -0
  36. package/dist/scraper/index.js.map +1 -0
  37. package/dist/scraper/web-scraper.d.ts +48 -0
  38. package/dist/scraper/web-scraper.d.ts.map +1 -0
  39. package/dist/scraper/web-scraper.js +144 -0
  40. package/dist/scraper/web-scraper.js.map +1 -0
  41. package/dist/types.d.ts +82 -0
  42. package/dist/types.d.ts.map +1 -0
  43. package/dist/types.js +9 -0
  44. package/dist/types.js.map +1 -0
  45. package/dist/web-search/index.d.ts +8 -0
  46. package/dist/web-search/index.d.ts.map +1 -0
  47. package/dist/web-search/index.js +8 -0
  48. package/dist/web-search/index.js.map +1 -0
  49. package/dist/web-search/web-search-client.d.ts +44 -0
  50. package/dist/web-search/web-search-client.d.ts.map +1 -0
  51. package/dist/web-search/web-search-client.js +131 -0
  52. package/dist/web-search/web-search-client.js.map +1 -0
  53. package/dist/youtube/index.d.ts +5 -0
  54. package/dist/youtube/index.d.ts.map +1 -0
  55. package/dist/youtube/index.js +5 -0
  56. package/dist/youtube/index.js.map +1 -0
  57. package/dist/youtube/youtube-transcript.d.ts +57 -0
  58. package/dist/youtube/youtube-transcript.d.ts.map +1 -0
  59. package/dist/youtube/youtube-transcript.js +228 -0
  60. package/dist/youtube/youtube-transcript.js.map +1 -0
  61. package/package.json +44 -0
@@ -0,0 +1,70 @@
1
+ /**
2
+ * APIClient - 汎用APIクライアント
3
+ *
4
+ * @requirement REQ-COLLECT-005
5
+ * @design DES-KATASHIRO-001 §2.2 Collector Container
6
+ * @task TSK-014
7
+ */
8
+ import { type Result } from '@nahisaho/katashiro-core';
9
+ import type { IAPIClient } from '../index.js';
10
+ /**
11
+ * APIクライアント設定
12
+ */
13
+ export interface APIClientOptions {
14
+ readonly baseUrl: string;
15
+ readonly headers?: Record<string, string>;
16
+ readonly timeout?: number;
17
+ readonly rateLimit?: {
18
+ readonly requestsPerSecond: number;
19
+ };
20
+ }
21
+ /**
22
+ * 汎用APIクライアント実装
23
+ * レート制限、タイムアウト、リトライ機能を提供
24
+ */
25
+ export declare class APIClient implements IAPIClient {
26
+ private readonly baseUrl;
27
+ private readonly headers;
28
+ private readonly timeout;
29
+ private readonly requestsPerSecond;
30
+ private lastRequestTime;
31
+ private requestQueue;
32
+ constructor(options: APIClientOptions);
33
+ /**
34
+ * GETリクエスト
35
+ */
36
+ get<T>(endpoint: string, params?: Record<string, string>): Promise<Result<T, Error>>;
37
+ /**
38
+ * POSTリクエスト
39
+ */
40
+ post<T>(endpoint: string, body: unknown): Promise<Result<T, Error>>;
41
+ /**
42
+ * PUTリクエスト
43
+ */
44
+ put<T>(endpoint: string, body: unknown): Promise<Result<T, Error>>;
45
+ /**
46
+ * DELETEリクエスト
47
+ */
48
+ delete<T>(endpoint: string): Promise<Result<T, Error>>;
49
+ /**
50
+ * PATCHリクエスト
51
+ */
52
+ patch<T>(endpoint: string, body: unknown): Promise<Result<T, Error>>;
53
+ /**
54
+ * URLを構築
55
+ */
56
+ private buildUrl;
57
+ /**
58
+ * リクエスト実行(レート制限付き)
59
+ */
60
+ private request;
61
+ /**
62
+ * レート制限のための待機
63
+ */
64
+ private waitForRateLimit;
65
+ /**
66
+ * 指定時間待機
67
+ */
68
+ private sleep;
69
+ }
70
+ //# sourceMappingURL=api-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.d.ts","sourceRoot":"","sources":["../../src/api/api-client.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,KAAK,MAAM,EAAW,MAAM,0BAA0B,CAAC;AAChE,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE;QACnB,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;KACpC,CAAC;CACH;AAED;;;GAGG;AACH,qBAAa,SAAU,YAAW,UAAU;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAS;IAC3C,OAAO,CAAC,eAAe,CAAK;IAC5B,OAAO,CAAC,YAAY,CAAoC;gBAE5C,OAAO,EAAE,gBAAgB;IAWrC;;OAEG;IACG,GAAG,CAAC,CAAC,EACT,QAAQ,EAAE,MAAM,EAChB,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC9B,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAK5B;;OAEG;IACG,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAKzE;;OAEG;IACG,GAAG,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAKxE;;OAEG;IACG,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAK5D;;OAEG;IACG,KAAK,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAK1E;;OAEG;IACH,OAAO,CAAC,QAAQ;IAYhB;;OAEG;YACW,OAAO;IAwCrB;;OAEG;YACW,gBAAgB;IAiB9B;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * APIClient - 汎用APIクライアント
3
+ *
4
+ * @requirement REQ-COLLECT-005
5
+ * @design DES-KATASHIRO-001 §2.2 Collector Container
6
+ * @task TSK-014
7
+ */
8
+ import { ok, err } from '@nahisaho/katashiro-core';
9
+ /**
10
+ * 汎用APIクライアント実装
11
+ * レート制限、タイムアウト、リトライ機能を提供
12
+ */
13
+ export class APIClient {
14
+ baseUrl;
15
+ headers;
16
+ timeout;
17
+ requestsPerSecond;
18
+ lastRequestTime = 0;
19
+ requestQueue = Promise.resolve();
20
+ constructor(options) {
21
+ this.baseUrl = options.baseUrl.replace(/\/$/, ''); // Remove trailing slash
22
+ this.headers = {
23
+ 'Content-Type': 'application/json',
24
+ 'User-Agent': 'KATASHIRO/0.1.0',
25
+ ...options.headers,
26
+ };
27
+ this.timeout = options.timeout ?? 30000;
28
+ this.requestsPerSecond = options.rateLimit?.requestsPerSecond ?? 10;
29
+ }
30
+ /**
31
+ * GETリクエスト
32
+ */
33
+ async get(endpoint, params) {
34
+ const url = this.buildUrl(endpoint, params);
35
+ return this.request('GET', url);
36
+ }
37
+ /**
38
+ * POSTリクエスト
39
+ */
40
+ async post(endpoint, body) {
41
+ const url = this.buildUrl(endpoint);
42
+ return this.request('POST', url, body);
43
+ }
44
+ /**
45
+ * PUTリクエスト
46
+ */
47
+ async put(endpoint, body) {
48
+ const url = this.buildUrl(endpoint);
49
+ return this.request('PUT', url, body);
50
+ }
51
+ /**
52
+ * DELETEリクエスト
53
+ */
54
+ async delete(endpoint) {
55
+ const url = this.buildUrl(endpoint);
56
+ return this.request('DELETE', url);
57
+ }
58
+ /**
59
+ * PATCHリクエスト
60
+ */
61
+ async patch(endpoint, body) {
62
+ const url = this.buildUrl(endpoint);
63
+ return this.request('PATCH', url, body);
64
+ }
65
+ /**
66
+ * URLを構築
67
+ */
68
+ buildUrl(endpoint, params) {
69
+ const path = endpoint.startsWith('/') ? endpoint : `/${endpoint}`;
70
+ let url = `${this.baseUrl}${path}`;
71
+ if (params && Object.keys(params).length > 0) {
72
+ const searchParams = new URLSearchParams(params);
73
+ url += `?${searchParams.toString()}`;
74
+ }
75
+ return url;
76
+ }
77
+ /**
78
+ * リクエスト実行(レート制限付き)
79
+ */
80
+ async request(method, url, body) {
81
+ // Rate limiting - queue requests
82
+ await this.waitForRateLimit();
83
+ try {
84
+ const controller = new AbortController();
85
+ const timeoutId = setTimeout(() => controller.abort(), this.timeout);
86
+ const response = await fetch(url, {
87
+ method,
88
+ headers: this.headers,
89
+ body: body ? JSON.stringify(body) : undefined,
90
+ signal: controller.signal,
91
+ });
92
+ clearTimeout(timeoutId);
93
+ if (!response.ok) {
94
+ return err(new Error(`HTTP error: ${response.status} ${response.statusText}`));
95
+ }
96
+ const data = (await response.json());
97
+ return ok(data);
98
+ }
99
+ catch (error) {
100
+ if (error instanceof Error) {
101
+ if (error.name === 'AbortError') {
102
+ return err(new Error('Request timeout'));
103
+ }
104
+ return err(new Error(`Request failed: ${error.message}`));
105
+ }
106
+ return err(new Error('Unknown request error'));
107
+ }
108
+ }
109
+ /**
110
+ * レート制限のための待機
111
+ */
112
+ async waitForRateLimit() {
113
+ // Chain requests to ensure rate limiting
114
+ this.requestQueue = this.requestQueue.then(async () => {
115
+ const now = Date.now();
116
+ const minInterval = 1000 / this.requestsPerSecond;
117
+ const timeSinceLastRequest = now - this.lastRequestTime;
118
+ if (timeSinceLastRequest < minInterval) {
119
+ await this.sleep(minInterval - timeSinceLastRequest);
120
+ }
121
+ this.lastRequestTime = Date.now();
122
+ });
123
+ await this.requestQueue;
124
+ }
125
+ /**
126
+ * 指定時間待機
127
+ */
128
+ sleep(ms) {
129
+ return new Promise((resolve) => setTimeout(resolve, ms));
130
+ }
131
+ }
132
+ //# sourceMappingURL=api-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-client.js","sourceRoot":"","sources":["../../src/api/api-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * API module exports
3
+ */
4
+ export { APIClient, type APIClientOptions } from './api-client.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * API module exports
3
+ */
4
+ export { APIClient } from './api-client.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,SAAS,EAAyB,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * FeedReader - RSS/Atomフィードリーダー
3
+ *
4
+ * @requirement REQ-COLLECT-005
5
+ * @design DES-KATASHIRO-001 §2.2 Collector Container
6
+ * @task TSK-013
7
+ */
8
+ import { type Result } from '@nahisaho/katashiro-core';
9
+ import type { IFeedReader, FeedItem } from '../index.js';
10
+ type FeedType = 'rss' | 'atom' | 'auto';
11
+ /**
12
+ * RSS/Atomフィードリーダー実装
13
+ */
14
+ export declare class FeedReader implements IFeedReader {
15
+ private readonly userAgent;
16
+ /**
17
+ * フィードを取得・パース(IFeedReaderインターフェース実装)
18
+ */
19
+ fetch(feedUrl: string): Promise<Result<FeedItem[], Error>>;
20
+ /**
21
+ * フィードを取得・パース
22
+ */
23
+ fetchFeed(url: string): Promise<Result<FeedItem[], Error>>;
24
+ /**
25
+ * フィードタイプを検出
26
+ */
27
+ detectFeedType(xml: string): FeedType;
28
+ /**
29
+ * フィードをパース
30
+ */
31
+ parseFeed(xml: string, type: FeedType): Result<FeedItem[], Error>;
32
+ /**
33
+ * RSS 2.0フィードをパース
34
+ */
35
+ private parseRssFeed;
36
+ /**
37
+ * Atomフィードをパース
38
+ */
39
+ private parseAtomFeed;
40
+ /**
41
+ * XMLタグの内容を抽出
42
+ */
43
+ private extractTag;
44
+ /**
45
+ * Atomリンクを抽出
46
+ */
47
+ private extractAtomLink;
48
+ /**
49
+ * Atom著者を抽出
50
+ */
51
+ private extractAtomAuthor;
52
+ /**
53
+ * RSSカテゴリを抽出
54
+ */
55
+ private extractCategories;
56
+ /**
57
+ * Atomカテゴリを抽出
58
+ */
59
+ private extractAtomCategories;
60
+ /**
61
+ * HTMLタグを除去してテキストを抽出
62
+ */
63
+ extractTextContent(html: string): string;
64
+ /**
65
+ * 日付文字列をISO形式に変換
66
+ */
67
+ private parseDate;
68
+ }
69
+ export {};
70
+ //# sourceMappingURL=feed-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed-reader.d.ts","sourceRoot":"","sources":["../../src/feed/feed-reader.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,KAAK,MAAM,EAKZ,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEzD,KAAK,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAExC;;GAEG;AACH,qBAAa,UAAW,YAAW,WAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAA+C;IAEzE;;OAEG;IACG,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IAIhE;;OAEG;IACG,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;IA2BhE;;OAEG;IACH,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,QAAQ;IAWrC;;OAEG;IACH,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC;IAcjE;;OAEG;IACH,OAAO,CAAC,YAAY;IA0CpB;;OAEG;IACH,OAAO,CAAC,aAAa;IA0CrB;;OAEG;IACH,OAAO,CAAC,UAAU;IAkBlB;;OAEG;IACH,OAAO,CAAC,eAAe;IAkBvB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IASzB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM;IAyBxC;;OAEG;IACH,OAAO,CAAC,SAAS;CAalB"}
@@ -0,0 +1,272 @@
1
+ /**
2
+ * FeedReader - RSS/Atomフィードリーダー
3
+ *
4
+ * @requirement REQ-COLLECT-005
5
+ * @design DES-KATASHIRO-001 §2.2 Collector Container
6
+ * @task TSK-013
7
+ */
8
+ import { ok, err, validateUrl, isErr, } from '@nahisaho/katashiro-core';
9
+ /**
10
+ * RSS/Atomフィードリーダー実装
11
+ */
12
+ export class FeedReader {
13
+ userAgent = 'Mozilla/5.0 (compatible; KATASHIRO/0.1.0)';
14
+ /**
15
+ * フィードを取得・パース(IFeedReaderインターフェース実装)
16
+ */
17
+ async fetch(feedUrl) {
18
+ return this.fetchFeed(feedUrl);
19
+ }
20
+ /**
21
+ * フィードを取得・パース
22
+ */
23
+ async fetchFeed(url) {
24
+ const urlValidation = validateUrl(url);
25
+ if (isErr(urlValidation)) {
26
+ return err(new Error(`Invalid URL: ${urlValidation.error}`));
27
+ }
28
+ try {
29
+ const response = await fetch(url, {
30
+ headers: {
31
+ 'User-Agent': this.userAgent,
32
+ Accept: 'application/rss+xml, application/atom+xml, application/xml, text/xml',
33
+ },
34
+ });
35
+ if (!response.ok) {
36
+ return err(new Error(`HTTP error: ${response.status}`));
37
+ }
38
+ const xml = await response.text();
39
+ const feedType = this.detectFeedType(xml);
40
+ return this.parseFeed(xml, feedType);
41
+ }
42
+ catch (error) {
43
+ const message = error instanceof Error ? error.message : 'Unknown error';
44
+ return err(new Error(`Feed fetch error: ${message}`));
45
+ }
46
+ }
47
+ /**
48
+ * フィードタイプを検出
49
+ */
50
+ detectFeedType(xml) {
51
+ if (xml.includes('<feed') && xml.includes('xmlns="http://www.w3.org/2005/Atom"')) {
52
+ return 'atom';
53
+ }
54
+ if (xml.includes('<rss')) {
55
+ return 'rss';
56
+ }
57
+ // Default to RSS for unknown formats
58
+ return 'rss';
59
+ }
60
+ /**
61
+ * フィードをパース
62
+ */
63
+ parseFeed(xml, type) {
64
+ try {
65
+ const feedType = type === 'auto' ? this.detectFeedType(xml) : type;
66
+ if (feedType === 'atom') {
67
+ return this.parseAtomFeed(xml);
68
+ }
69
+ return this.parseRssFeed(xml);
70
+ }
71
+ catch (error) {
72
+ const message = error instanceof Error ? error.message : 'Unknown error';
73
+ return err(new Error(`Parse error: ${message}`));
74
+ }
75
+ }
76
+ /**
77
+ * RSS 2.0フィードをパース
78
+ */
79
+ parseRssFeed(xml) {
80
+ const items = [];
81
+ const itemRegex = /<item[^>]*>([\s\S]*?)<\/item>/gi;
82
+ let match;
83
+ while ((match = itemRegex.exec(xml)) !== null) {
84
+ const itemXml = match[1];
85
+ if (!itemXml)
86
+ continue;
87
+ const title = this.extractTag(itemXml, 'title');
88
+ const link = this.extractTag(itemXml, 'link');
89
+ const description = this.extractTag(itemXml, 'description');
90
+ const content = this.extractTag(itemXml, 'content:encoded') || description;
91
+ const author = this.extractTag(itemXml, 'author') || this.extractTag(itemXml, 'dc:creator');
92
+ const pubDate = this.extractTag(itemXml, 'pubDate');
93
+ const guid = this.extractTag(itemXml, 'guid');
94
+ const categories = this.extractCategories(itemXml);
95
+ if (title && link) {
96
+ items.push({
97
+ id: guid || link,
98
+ title: this.extractTextContent(title),
99
+ link,
100
+ description: description ? this.extractTextContent(description) : undefined,
101
+ content: content ? this.extractTextContent(content) : undefined,
102
+ author: author ? this.extractTextContent(author) : undefined,
103
+ publishedAt: pubDate ? this.parseDate(pubDate) : undefined,
104
+ categories: categories.length > 0 ? categories : undefined,
105
+ });
106
+ }
107
+ }
108
+ if (items.length === 0) {
109
+ // Check if the XML was valid
110
+ if (!xml.includes('<rss') && !xml.includes('<item')) {
111
+ return err(new Error('Invalid RSS feed format'));
112
+ }
113
+ }
114
+ return ok(items);
115
+ }
116
+ /**
117
+ * Atomフィードをパース
118
+ */
119
+ parseAtomFeed(xml) {
120
+ const items = [];
121
+ const entryRegex = /<entry[^>]*>([\s\S]*?)<\/entry>/gi;
122
+ let match;
123
+ while ((match = entryRegex.exec(xml)) !== null) {
124
+ const entryXml = match[1];
125
+ if (!entryXml)
126
+ continue;
127
+ const title = this.extractTag(entryXml, 'title');
128
+ const link = this.extractAtomLink(entryXml);
129
+ const id = this.extractTag(entryXml, 'id');
130
+ const summary = this.extractTag(entryXml, 'summary');
131
+ const content = this.extractTag(entryXml, 'content');
132
+ const author = this.extractAtomAuthor(entryXml);
133
+ const updated = this.extractTag(entryXml, 'updated');
134
+ const published = this.extractTag(entryXml, 'published');
135
+ const categories = this.extractAtomCategories(entryXml);
136
+ if (title && (link || id)) {
137
+ items.push({
138
+ id: id || link || '',
139
+ title: this.extractTextContent(title),
140
+ link: link || '',
141
+ description: summary ? this.extractTextContent(summary) : undefined,
142
+ content: content ? this.extractTextContent(content) : undefined,
143
+ author: author || undefined,
144
+ publishedAt: this.parseDate(published || updated || ''),
145
+ categories: categories.length > 0 ? categories : undefined,
146
+ });
147
+ }
148
+ }
149
+ if (items.length === 0) {
150
+ if (!xml.includes('<feed') && !xml.includes('<entry')) {
151
+ return err(new Error('Invalid Atom feed format'));
152
+ }
153
+ }
154
+ return ok(items);
155
+ }
156
+ /**
157
+ * XMLタグの内容を抽出
158
+ */
159
+ extractTag(xml, tagName) {
160
+ // Handle namespaced tags (e.g., content:encoded)
161
+ const escapedTag = tagName.replace(/:/g, '\\:');
162
+ const patterns = [
163
+ new RegExp(`<${escapedTag}[^>]*><!\\[CDATA\\[([\\s\\S]*?)\\]\\]><\\/${escapedTag}>`, 'i'),
164
+ new RegExp(`<${escapedTag}[^>]*>([\\s\\S]*?)<\\/${escapedTag}>`, 'i'),
165
+ ];
166
+ for (const pattern of patterns) {
167
+ const match = xml.match(pattern);
168
+ if (match?.[1]) {
169
+ return match[1].trim();
170
+ }
171
+ }
172
+ return null;
173
+ }
174
+ /**
175
+ * Atomリンクを抽出
176
+ */
177
+ extractAtomLink(xml) {
178
+ // Look for alternate link or first link
179
+ const patterns = [
180
+ /<link[^>]+rel=["']alternate["'][^>]+href=["']([^"']+)["']/i,
181
+ /<link[^>]+href=["']([^"']+)["'][^>]+rel=["']alternate["']/i,
182
+ /<link[^>]+href=["']([^"']+)["']/i,
183
+ ];
184
+ for (const pattern of patterns) {
185
+ const match = xml.match(pattern);
186
+ if (match?.[1]) {
187
+ return match[1];
188
+ }
189
+ }
190
+ return null;
191
+ }
192
+ /**
193
+ * Atom著者を抽出
194
+ */
195
+ extractAtomAuthor(xml) {
196
+ const authorMatch = xml.match(/<author[^>]*>([\s\S]*?)<\/author>/i);
197
+ if (authorMatch?.[1]) {
198
+ const name = this.extractTag(authorMatch[1], 'name');
199
+ return name || null;
200
+ }
201
+ return null;
202
+ }
203
+ /**
204
+ * RSSカテゴリを抽出
205
+ */
206
+ extractCategories(xml) {
207
+ const categories = [];
208
+ const categoryRegex = /<category[^>]*>([^<]+)<\/category>/gi;
209
+ let match;
210
+ while ((match = categoryRegex.exec(xml)) !== null) {
211
+ if (match[1]) {
212
+ categories.push(this.extractTextContent(match[1]));
213
+ }
214
+ }
215
+ return categories;
216
+ }
217
+ /**
218
+ * Atomカテゴリを抽出
219
+ */
220
+ extractAtomCategories(xml) {
221
+ const categories = [];
222
+ const categoryRegex = /<category[^>]+term=["']([^"']+)["']/gi;
223
+ let match;
224
+ while ((match = categoryRegex.exec(xml)) !== null) {
225
+ if (match[1]) {
226
+ categories.push(match[1]);
227
+ }
228
+ }
229
+ return categories;
230
+ }
231
+ /**
232
+ * HTMLタグを除去してテキストを抽出
233
+ */
234
+ extractTextContent(html) {
235
+ if (!html)
236
+ return '';
237
+ // Remove CDATA wrapper
238
+ let text = html.replace(/<!\[CDATA\[([\s\S]*?)\]\]>/gi, '$1');
239
+ // Remove HTML tags
240
+ text = text.replace(/<[^>]+>/g, ' ');
241
+ // Decode HTML entities
242
+ text = text
243
+ .replace(/&amp;/g, '&')
244
+ .replace(/&lt;/g, '<')
245
+ .replace(/&gt;/g, '>')
246
+ .replace(/&quot;/g, '"')
247
+ .replace(/&#39;/g, "'")
248
+ .replace(/&apos;/g, "'")
249
+ .replace(/&nbsp;/g, ' ');
250
+ // Normalize whitespace
251
+ text = text.replace(/\s+/g, ' ').trim();
252
+ return text;
253
+ }
254
+ /**
255
+ * 日付文字列をISO形式に変換
256
+ */
257
+ parseDate(dateStr) {
258
+ if (!dateStr)
259
+ return undefined;
260
+ try {
261
+ const date = new Date(dateStr);
262
+ if (isNaN(date.getTime())) {
263
+ return undefined;
264
+ }
265
+ return date.toISOString();
266
+ }
267
+ catch {
268
+ return undefined;
269
+ }
270
+ }
271
+ }
272
+ //# sourceMappingURL=feed-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feed-reader.js","sourceRoot":"","sources":["../../src/feed/feed-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Feed module exports
3
+ */
4
+ export { FeedReader } from './feed-reader.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/feed/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Feed module exports
3
+ */
4
+ export { FeedReader } from './feed-reader.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feed/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * @nahisaho/katashiro-collector
3
+ * 情報収集パッケージ
4
+ *
5
+ * @requirement REQ-COLLECT-001 ~ REQ-COLLECT-009
6
+ * @design DES-KATASHIRO-001 §2.2 Collector Container
7
+ * @task TSK-010 ~ TSK-015
8
+ */
9
+ export type { IWebSearchClient, IWebScraper, IFeedReader, IAPIClient, IYouTubeTranscript, IMediaExtractor, } from './interfaces.js';
10
+ export type { WebSearchOptions, ScrapingOptions, ScrapingResult, FeedItem, TranscriptSegment, MediaMetadata, } from './types.js';
11
+ export { WebSearchClient } from './web-search/index.js';
12
+ export { WebScraper } from './scraper/index.js';
13
+ export { YouTubeTranscript } from './youtube/index.js';
14
+ export { FeedReader } from './feed/index.js';
15
+ export { APIClient, type APIClientOptions } from './api/index.js';
16
+ export { MediaExtractor, type ExtractedMedia } from './media/index.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,YAAY,EACV,gBAAgB,EAChB,WAAW,EACX,WAAW,EACX,UAAU,EACV,kBAAkB,EAClB,eAAe,GAChB,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,QAAQ,EACR,iBAAiB,EACjB,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @nahisaho/katashiro-collector
3
+ * 情報収集パッケージ
4
+ *
5
+ * @requirement REQ-COLLECT-001 ~ REQ-COLLECT-009
6
+ * @design DES-KATASHIRO-001 §2.2 Collector Container
7
+ * @task TSK-010 ~ TSK-015
8
+ */
9
+ // 実装
10
+ export { WebSearchClient } from './web-search/index.js';
11
+ export { WebScraper } from './scraper/index.js';
12
+ export { YouTubeTranscript } from './youtube/index.js';
13
+ export { FeedReader } from './feed/index.js';
14
+ export { APIClient } from './api/index.js';
15
+ export { MediaExtractor } from './media/index.js';
16
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAsBH,KAAK;AACL,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAyB,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,cAAc,EAAuB,MAAM,kBAAkB,CAAC"}