fry namespaces combinators.smart splitting io.encodings.ascii
arrays io.files.info unicode.case io.directories.search literals
math.functions continuations ;
+FROM: alien.c-types => uchar ;
IN: id3
<PRIVATE
: synchsafe>seq ( n -- seq )
dup 1 + log2 1 + 7 / ceiling
- [ [ -7 shift ] keep HEX: 7f bitand ] replicate nip reverse ;
+ [ [ -7 shift ] keep 0x7f bitand ] replicate nip reverse ;
: filter-text-data ( data -- filtered )
[ printable? ] filter ;
: decode-text ( string -- string' )
dup 2 short head
- { { HEX: ff HEX: fe } { HEX: fe HEX: ff } } member?
+ { { 0xff 0xfe } { 0xfe 0xff } } member?
utf16 ascii ? decode ;
: (read-frame) ( seq -- frame )
} cleave ;
: merge-frames ( id3 assoc -- id3 )
- [ dup frames>> ] dip update ;
+ [ dup frames>> ] dip assoc-union! drop ;
: merge-id3v1 ( id3 -- id3 )
dup id3v1>frames frames>assoc merge-frames ;
: mp3>id3 ( path -- id3/f )
[
- [ <id3> ] dip "uchar" <mapped-array>
+ [ <id3> ] dip uchar <mapped-array>
[ dup id3v1? [ read-v1-tags merge-id3v1 ] [ drop ] if ]
[ dup id3v1+? [ read-v1+-tags merge-id3v1 ] [ drop ] if ]
[ dup id3v2? [ read-v2-tags ] [ drop ] if ]