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