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