------art_54699_22801596.1188154957808
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
Content-Disposition: inline

Hello,

My solution is straightforward. It seeks backwards from the end of file to
read the ID3 tag, and then uses a regular expression to parse the tag. I
then manually extract the track number if found:

genres  "Blues",
... (snip) ...
"Dance Hall"]

filename  RGV[0]

if File.exists?(filename)
  f  ile.new(filename, "rb")

  # Read ID3 tag from file
  f.seek(-128, IO::SEEK_END)
  data  .read
  f.close

  # Parse the ID3 tag, order is [TAG song artist album year comment genre]
  match_data  (TAG)(.{30})(.{30})(.{30})(.{4})(.{30})(.{1})/.match(data)

  if match_data ! il

    # If 29th byte of comment is 0, parse the field to obtain ID3 v1.1 track
number
    if match_data[6][28] 0
      comment  atch_data[6].slice(0, 28)
      track_num  atch_data[6][29].to_i.to_s
    else
      comment  atch_data[6]
      track_num  "
    end

    puts "   Song: #{match_data[2].strip}"
    puts " Artist: #{match_data[3].strip}"
    puts "  Album: #{match_data[4].strip}"
    puts "   Year: #{match_data[5]}"
    puts "Comment: #{comment.strip}"
    puts "  Track: #{track_num}"
    puts "  Genre: #{genres[match_data[7].to_i]}"
  end
end

Here is a pastie of the complete program - http://pastie.caboo.se/91121
Thanks,

Justin

On 8/24/07, Ruby Quiz <james / grayproductions.net> wrote:
>
> The three rules of Ruby Quiz:
>
> 1.  Please do not post any solutions or spoiler discussion for this quiz
> until
> 48 hours have passed from the time on this message.
>
> 2.  Support Ruby Quiz by submitting ideas as often as you can:
>
> http://www.rubyquiz.com/
>
> 3.  Enjoy!
>
> Suggestion:  A [QUIZ] in the subject of emails about the problem helps
> everyone
> on Ruby Talk follow the discussion.  Please reply to the original quiz
> message,
> if you can.
>
>
> --------------------
>
> The MP3 file format, didn't provide any means for including metadata about
> the
> song.  ID3 tags were invented to solve this problem.
>
> You can tell if an MP3 file includes ID3 tags by examining the last 128
> bytes of
> the file.  If they begin with the characters TAG, you have found an ID3
> tag.
> The format of the tag is as follows:
>
>         TAG song album artist comment year genre
>
> The spaces above are just for us humans.  The actual tags are fixed-width
> fields
> with no spacing between them.  Song, album, artist, and comment are 30
> bytes
> each.  The year is four bytes and the genre just gets one, which is an
> index
> into a list of predefined genres I'll include at the end of this quiz.
>
> A minor change was later made to ID3 tags to allow them to include track
> numbers, creating ID3v1.1.  In that format, if the 29th byte of a comment
> is
> null and the 30th is not, the 30th byte is an integer representing the
> track
> number.
>
> Later changes evolved ID3v2 which is a scary beast we won't worry about.
>
> This week's Ruby Quiz is to write an ID3 tag parser.  Using a library is
> cheating.  Roll up your sleeves and parse it yourself.  It's not hard at
> all.
>
> If you don't have MP3 files to test your solution on, you can find some
> free
> files at:
>
>         http://www.mfiles.co.uk/mp3-files.htm
>
> Here's the official genre list with some extensions added by Winamp:
>
>         Blues
>         Classic Rock
>         Country
>         Dance
>         Disco
>         Funk
>         Grunge
>         Hip-Hop
>         Jazz
>         Metal
>         New Age
>         Oldies
>         Other
>         Pop
>         R&B
>         Rap
>         Reggae
>         Rock
>         Techno
>         Industrial
>         Alternative
>         Ska
>         Death Metal
>         Pranks
>         Soundtrack
>         Euro-Techno
>         Ambient
>         Trip-Hop
>         Vocal
>         Jazz+Funk
>         Fusion
>         Trance
>         Classical
>         Instrumental
>         Acid
>         House
>         Game
>         Sound Clip
>         Gospel
>         Noise
>         AlternRock
>         Bass
>         Soul
>         Punk
>         Space
>         Meditative
>         Instrumental Pop
>         Instrumental Rock
>         Ethnic
>         Gothic
>         Darkwave
>         Techno-Industrial
>         Electronic
>         Pop-Folk
>         Eurodance
>         Dream
>         Southern Rock
>         Comedy
>         Cult
>         Gangsta
>         Top 40
>         Christian Rap
>         Pop/Funk
>         Jungle
>         Native American
>         Cabaret
>         New Wave
>         Psychadelic
>         Rave
>         Showtunes
>         Trailer
>         Lo-Fi
>         Tribal
>         Acid Punk
>         Acid Jazz
>         Polka
>         Retro
>         Musical
>         Rock & Roll
>         Hard Rock
>         Folk
>         Folk-Rock
>         National Folk
>         Swing
>         Fast Fusion
>         Bebob
>         Latin
>         Revival
>         Celtic
>         Bluegrass
>         Avantgarde
>         Gothic Rock
>         Progressive Rock
>         Psychedelic Rock
>         Symphonic Rock
>         Slow Rock
>         Big Band
>         Chorus
>         Easy Listening
>         Acoustic
>         Humour
>         Speech
>         Chanson
>         Opera
>         Chamber Music
>         Sonata
>         Symphony
>         Booty Bass
>         Primus
>         Porn Groove
>         Satire
>         Slow Jam
>         Club
>         Tango
>         Samba
>         Folklore
>         Ballad
>         Power Ballad
>         Rhythmic Soul
>         Freestyle
>         Duet
>         Punk Rock
>         Drum Solo
>         A capella
>         Euro-House
>         Dance Hall
>
>

------art_54699_22801596.1188154957808--