From: Justin Ethier Date: 2007-08-27T04:02:41+09:00 Subject: Re: [QUIZ] ID3 Tags (#136) ------=_Part_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 = ARGV[0] if File.exists?(filename) f = File.new(filename, "rb") # Read ID3 tag from file f.seek(-128, IO::SEEK_END) data = f.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 != nil # If 29th byte of comment is 0, parse the field to obtain ID3 v1.1 track number if match_data[6][28] == 0 comment = match_data[6].slice(0, 28) track_num = match_data[6][29].to_i.to_s else comment = match_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 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 > > ------=_Part_54699_22801596.1188154957808--