#!/usr/bin/perl $fidpath="./fids"; $mp3path="./mp3"; sub parse_playlist { $prefix="$prefix "; my $playlist_fid = shift; my $path = shift; print "$prefix [$path] ($playlist_fid)\n"; mkdir $path; open(my $playlist, "<".$fidpath.'/'.$playlist_fid) or die "$playlist_fid: $!"; binmode($playlist); while(my $status = read($playlist, $fid, 4)) { #print "$prefix [debug] offset=".sprintf("%04x", tell($playlist))."\n"; ($decimal_fid) = unpack("l<*", $fid); $unpack_fid = sprintf("%x", $decimal_fid); #print "$prefix [debug] fid = $unpack_fid ($decimal_fid)\n"; if ( ! $unpack_fid ) { print "status: $status\n"; print "raw data: ".sprintf("%02x %02x %02x %02x", $fid[0], $fid[1], $fid[2], $fid[3])."\n"; print "offset: ".tell($playlist)." (0x".sprintf("%04x", tell($playlist)).")\n"; die "unable to parse fid $unpack_fid from $playlist_fid"; } if ( $decimal_fid % 16 != 0 ) { die "invalid fid: $unpack_fid"; # sanity check } $meta = substr($unpack_fid,0,-1)."1"; #print "$prefix [debug] \$meta = $meta \$path='$path'\n"; parse_meta($meta, $path); } close($playlist); $prefix=substr($prefix,0,-2); } sub parse_meta { my $meta = shift; my $path = shift; open(META, "<".$fidpath.'/'.$meta) or do { warn "'$meta': $!"; sleep(10); return; }; while($line = ) { chomp($line); if ( $line =~ m/(.*)=(.*)/ ) { $info{$meta}{$1} = $2; } } close(META); $fid = substr($meta,0,-1)."0"; if ( $info{$meta}{'type'} eq "playlist" ) { parse_playlist($fid, $path . '/' . $info{$meta}{'title'}); } elsif ( $info{$meta}{'type'} eq "tune" ) { print "$prefix - ".$info{$meta}{'title'}." ($fid)\n"; link $fidpath.'/'.$fid, $path.'/'.$info{$meta}{'title'}.'.mp3'; } } parse_playlist('100', $mp3path);