             [ dup id3v1+? [ read-v1+-tags merge-id3v1 ] [ drop ] if ]
             [ dup id3v2? [ read-v2-tags ] [ drop ] if ]
         } cleave
-    ] with-mapped-uchar-file ;
-
-PRIVATE>
-
-: mp3>id3 ( path -- id3/f )
-    dup file-info size>> 0 <= [ drop f ] [ (mp3>id3) ] if ;
+    ] with-mapped-uchar-file-reader ;
 
 : find-id3-frame ( id3 name -- obj/f )
     swap frames>> at* [ data>> ] when ;

: find-mp3s ( path -- seq )
    [ >lower ".mp3" tail? ] find-all-files ;

: mp3-paths>id3s ( seq -- seq' )
    [ dup mp3>id3 ] { } map>assoc ;

: parse-mp3-directory ( path -- seq )
    find-mp3s mp3-paths>id3s ;

        drop
    ] if ;

PRIVATE>

: mp3>id3 ( path -- id3v2/f )
    [
        [ <id3> ] dip
        {
