1
+ import csv from 'csv-parser' ;
2
+ import fs from 'fs' ;
3
+ import { Credit , MediaItem } from '../models/index.js' ;
4
+ import { Loader } from './loader.js' ;
5
+
6
+ export class MeikoStephensLoader implements Loader {
7
+ getLoaderName ( ) : string {
8
+ return 'meikostephens' ;
9
+ }
10
+
11
+ async loadData ( ) : Promise < MediaItem [ ] > {
12
+ const credits = await this . loadCredits ( ) ;
13
+ const mediaItems = await this . loadMediaItems ( ) ;
14
+ const mediaMap = new Map < string , MediaItem > ( ) ;
15
+ mediaItems . forEach ( ( mediaItem ) => {
16
+ mediaMap . set ( mediaItem . getId ( ) , mediaItem ) ;
17
+ } ) ;
18
+
19
+
20
+ console . log ( `Loaded ${ credits . length } credits and ${ mediaItems . length } media items` , ) ;
21
+
22
+ return [ ...mediaItems . values ( ) ] ;
23
+ }
24
+
25
+ async loadMediaItems ( ) : Promise < MediaItem [ ] > {
26
+ const mediaItems = [ ] ;
27
+ const readable = fs
28
+ . createReadStream ( 'data/media_items.csv' , 'utf-8' )
29
+ . pipe ( csv ( ) ) ;
30
+ for await ( const row of readable ) {
31
+ const { id, title, type, year} = row ;
32
+ mediaItems . push ( new MediaItem ( id , title , type , year , [ ] ) ) ;
33
+ }
34
+ return mediaItems ;
35
+ }
36
+
37
+
38
+ async loadCredits ( ) : Promise < Credit [ ] > {
39
+ const credits = [ ] ;
40
+ const readable = fs
41
+ . createReadStream ( 'data/credits.csv' , 'utf-8' )
42
+ . pipe ( csv ( ) ) ;
43
+ for await ( const row of readable ) {
44
+ const { media_item_id, role, name } = row ;
45
+ credits . push ( new Credit ( media_item_id , name , role ) ) ;
46
+ }
47
+ return credits ;
48
+ }
49
+ }
0 commit comments