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 RasheedMillerLoader implements Loader {
7+ getLoaderName ( ) : string {
8+ return 'rasheedmiller' ;
9+ }
10+
11+ async loadData ( ) : Promise < MediaItem [ ] > {
12+ const credits = await this . loadCredits ( ) ;
13+ const mediaItems = await this . loadMediaItems ( ) ;
14+
15+ const mediaMap = new Map < string , MediaItem > ( ) ;
16+
17+ for ( const media of mediaItems ) {
18+ mediaMap . set ( media . getId ( ) , media ) ;
19+ }
20+
21+
22+ for ( const credit of credits ) {
23+ const mediaItem = mediaMap . get ( credit . getMediaItemId ( ) ) ;
24+ if ( mediaItem ) {
25+ mediaItem . addCredit ( credit ) ;
26+ }
27+ }
28+
29+ console . log (
30+ 'Loaded ${credits.length} credits and ${mediaItems.length} media items' ,
31+ ) ;
32+ return Array . from ( mediaMap . values ( ) ) ;
33+ }
34+
35+ async loadMediaItems ( ) : Promise < MediaItem [ ] > {
36+ const mediaItems = [ ] ;
37+ const readable = fs
38+ . createReadStream ( 'data/media_items.csv' , 'utf-8' )
39+ . pipe ( csv ( ) ) ;
40+ for await ( const row of readable ) {
41+ const { id, title, type, year } = row ;
42+ mediaItems . push ( new MediaItem ( id , title , type , year , [ ] ) ) ;
43+ }
44+ return mediaItems ;
45+ }
46+
47+ async loadCredits ( ) : Promise < Credit [ ] > {
48+ const credits = [ ] ;
49+ const readable = fs
50+ . createReadStream ( 'data/credits.csv' , 'utf-8' )
51+ . pipe ( csv ( ) ) ;
52+ for await ( const row of readable ) {
53+ const { media_item_id, role, name } = row ;
54+ credits . push ( new Credit ( media_item_id , name , role ) ) ;
55+ }
56+ return credits ;
57+ }
58+ }
0 commit comments