@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,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 @@
|
|
|
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 @@
|
|
|
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(/&/g, '&')
|
|
244
|
+
.replace(/</g, '<')
|
|
245
|
+
.replace(/>/g, '>')
|
|
246
|
+
.replace(/"/g, '"')
|
|
247
|
+
.replace(/'/g, "'")
|
|
248
|
+
.replace(/'/g, "'")
|
|
249
|
+
.replace(/ /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":"AAAA;;;;;;GAMG;AAEH,OAAO,EAEL,EAAE,EACF,GAAG,EACH,WAAW,EACX,KAAK,GACN,MAAM,0BAA0B,CAAC;AAKlC;;GAEG;AACH,MAAM,OAAO,UAAU;IACJ,SAAS,GAAG,2CAA2C,CAAC;IAEzE;;OAEG;IACH,KAAK,CAAC,KAAK,CAAC,OAAe;QACzB,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,MAAM,aAAa,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,KAAK,CAAC,aAAa,CAAC,EAAE,CAAC;YACzB,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,gBAAgB,aAAa,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC/D,CAAC;QAED,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;gBAChC,OAAO,EAAE;oBACP,YAAY,EAAE,IAAI,CAAC,SAAS;oBAC5B,MAAM,EAAE,sEAAsE;iBAC/E;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;gBACjB,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,eAAe,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YAC1D,CAAC;YAED,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YAC1C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,qBAAqB,OAAO,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc,CAAC,GAAW;QACxB,IAAI,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,qCAAqC,CAAC,EAAE,CAAC;YACjF,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,qCAAqC;QACrC,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,SAAS,CAAC,GAAW,EAAE,IAAc;QACnC,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAEnE,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;YACjC,CAAC;YACD,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YACzE,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,gBAAgB,OAAO,EAAE,CAAC,CAAC,CAAC;QACnD,CAAC;IACH,CAAC;IAED;;OAEG;IACK,YAAY,CAAC,GAAW;QAC9B,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,iCAAiC,CAAC;QACpD,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,OAAO;gBAAE,SAAS;YAEvB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAChD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,iBAAiB,CAAC,IAAI,WAAW,CAAC;YAC3E,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAC5F,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YAEnD,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;gBAClB,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,IAAI,IAAI,IAAI;oBAChB,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;oBACrC,IAAI;oBACJ,WAAW,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC3E,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC/D,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC5D,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC1D,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;iBAC3D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,6BAA6B;YAC7B,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACpD,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,aAAa,CAAC,GAAW;QAC/B,MAAM,KAAK,GAAe,EAAE,CAAC;QAC7B,MAAM,UAAU,GAAG,mCAAmC,CAAC;QACvD,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/C,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,IAAI,CAAC,QAAQ;gBAAE,SAAS;YAExB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;YACjD,MAAM,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;YAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACrD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACrD,MAAM,MAAM,GAAG,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YACrD,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;YACzD,MAAM,UAAU,GAAG,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,CAAC;YAExD,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC1B,KAAK,CAAC,IAAI,CAAC;oBACT,EAAE,EAAE,EAAE,IAAI,IAAI,IAAI,EAAE;oBACpB,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC;oBACrC,IAAI,EAAE,IAAI,IAAI,EAAE;oBAChB,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;oBACnE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC/D,MAAM,EAAE,MAAM,IAAI,SAAS;oBAC3B,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI,OAAO,IAAI,EAAE,CAAC;oBACvD,UAAU,EAAE,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;iBAC3D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACtD,OAAO,GAAG,CAAC,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpD,CAAC;QACH,CAAC;QAED,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IACnB,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,GAAW,EAAE,OAAe;QAC7C,iDAAiD;QACjD,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,QAAQ,GAAG;YACf,IAAI,MAAM,CAAC,IAAI,UAAU,6CAA6C,UAAU,GAAG,EAAE,GAAG,CAAC;YACzF,IAAI,MAAM,CAAC,IAAI,UAAU,yBAAyB,UAAU,GAAG,EAAE,GAAG,CAAC;SACtE,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACzB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,eAAe,CAAC,GAAW;QACjC,wCAAwC;QACxC,MAAM,QAAQ,GAAG;YACf,4DAA4D;YAC5D,4DAA4D;YAC5D,kCAAkC;SACnC,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACjC,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACf,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,GAAW;QACnC,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;QACpE,IAAI,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YACrD,OAAO,IAAI,IAAI,IAAI,CAAC;QACtB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,GAAW;QACnC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,sCAAsC,CAAC;QAC7D,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAClD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACb,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACK,qBAAqB,CAAC,GAAW;QACvC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,uCAAuC,CAAC;QAC9D,IAAI,KAAK,CAAC;QAEV,OAAO,CAAC,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAClD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACb,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED;;OAEG;IACH,kBAAkB,CAAC,IAAY;QAC7B,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QAErB,uBAAuB;QACvB,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,8BAA8B,EAAE,IAAI,CAAC,CAAC;QAE9D,mBAAmB;QACnB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;QAErC,uBAAuB;QACvB,IAAI,GAAG,IAAI;aACR,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACtB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAE3B,uBAAuB;QACvB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QAExC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACK,SAAS,CAAC,OAAe;QAC/B,IAAI,CAAC,OAAO;YAAE,OAAO,SAAS,CAAC;QAE/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC;YAC/B,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;gBAC1B,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,OAAO,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF"}
|
|
@@ -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 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/feed/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -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"}
|