------ 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--