1
- import type { Detail , SearchResult , SearchOptions } from '../types' ;
1
+ import type { Detail , SearchResult , SearchOptions , DetailItem } from '../types' ;
2
2
3
+ import { JSDOM } from 'jsdom' ;
3
4
import { Provider } from '../scraper' ;
4
5
5
6
export class Animate extends Provider {
@@ -8,10 +9,50 @@ export class Animate extends Provider {
8
9
}
9
10
10
11
async search ( text : string , options ?: SearchOptions ) : Promise < SearchResult [ ] > {
11
- return [ ] ;
12
+ const html : string = await $fetch ( 'https://www.melonbooks.co.jp/search/search.php' , {
13
+ query : {
14
+ name : text ,
15
+ 'additional[]' : 'pr'
16
+ }
17
+ } ) ;
18
+
19
+ const dom = new JSDOM ( html ) ;
20
+ const doc = dom . window . document ;
21
+
22
+ const resultItems = doc . querySelectorAll ( '.item-list li[class^=product]' ) ;
23
+ return [ ...resultItems ] . reduce ( ( res : SearchResult [ ] , item ) => {
24
+ const a = item . querySelector ( '.item-image > a' ) as HTMLAnchorElement ;
25
+ res . push ( {
26
+ provider : this . id ,
27
+ title : a . title ,
28
+ url : 'https://www.melonbooks.co.jp' + a . href
29
+ } ) ;
30
+ return res ;
31
+ } , [ ] ) ;
12
32
}
13
33
14
34
async detail ( url : string ) : Promise < Detail | undefined > {
15
- return undefined ;
35
+ const html : string = await $fetch ( url ) ;
36
+ const dom = new JSDOM ( html ) ;
37
+ const doc = dom . window . document ;
38
+
39
+ const title = doc . querySelector ( '.page-header' ) ?. textContent || '' ;
40
+ const privItems = doc . querySelectorAll ( '.priv-item' ) ;
41
+ const items = [ ...privItems ] . reduce ( ( res : DetailItem [ ] , item ) => {
42
+ const img = item . querySelector ( '.priv_img' ) as HTMLImageElement ;
43
+ const info = item . querySelector ( '.priv-item_info' ) ;
44
+ res . push ( {
45
+ image : img . src ,
46
+ description : info ?. textContent ?. trim ?.( ) || ''
47
+ } ) ;
48
+ return res ;
49
+ } , [ ] ) ;
50
+
51
+ return {
52
+ provider : this . id ,
53
+ title,
54
+ url,
55
+ items
56
+ } ;
16
57
}
17
58
}
0 commit comments