From: James Edward Gray II Date: 2007-08-27T03:18:42+09:00 Subject: Fwd: Please Forward: Ruby Quiz Submission --Apple-Mail-1--608278529 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=ISO-8859-1; format=flowed Begin forwarded message: > From: Borja Mart=EDn > Date: August 25, 2007 7:31:52 AM CDT > To: submission@rubyquiz.com > Subject: Please Forward: Ruby Quiz Submission > > Here goes my solution for the ruby quiz. Thanks for forwarding it. > > Regards > > --=20 > /** > * dagi3d v4 | http://dagi3d.net > */ > --Apple-Mail-1--608278529 Content-Transfer-Encoding: quoted-printable Content-Type: application/x-ruby; x-unix-mode=0666; name=mp3.rb Content-Disposition: attachment; filename=mp3.rb #!/usr/bin/env=20ruby=0A=0A#=20=3D=20Id3=20tag=20parser=20for=20RubyQuiz=0A= #=0A#=20Author::=20=20=20=20Borja=20Mart=C3=ADn=20(http://dagi3d.net)=0A= #=0A#=20=3D=3D=20Usage:=0A#=20mp3=20=3D=20= Mp3.new("filename.mp3")=0A#=0A#=20Available=20methods:=0A#=0A#=20*=20= mp3.song_name=0A#=20*=20mp3.artist=0A#=20*=20= mp3.album=0A#=20*=20mp3.comment=0A#=20*=20= mp3.genre=0A#=20*=20mp3.track_number=0A=0A=0Aclass=20= Mp3=0A=20=20=0A=20=20GENRES=20=3D=20[=20"Blues",=20"Classic=20Rock",=20= "Country",=20"Dance",=20"Disco",=20"Funk",=20=0A=20=20=20=20"Grunge",=20= "Hip-Hop",=20"Jazz",=20"Metal",=20"New=20Age",=20"Oldies",=20"Other",=20= "Pop",=20=0A=20=20=20=20"R&B",=20"Rap",=20"Reggae",=20"Rock",=20= "Techno",=20"Industrial",=20"Alternative",=20=0A=20=20=20=20"Ska",=20= "Death=20Metal",=20"Pranks",=20"Soundtrack",=20"Euro-Techno",=20= "Ambient",=20=0A=20=20=20=20"Trip-Hop",=20"Vocal",=20"Jazz+Funk",=20= "Fusion",=20"Trance",=20"Classical",=0A=20=20=20=20"Instrumental",=20= "Acid",=20"House",=20"Game",=20"Sound=20Clip",=20"Gospel",=20"Noise",=20=0A= =20=20=20=20"AlternRock",=20"Bass",=20"Soul",=20"Punk",=20"Space",=20= "Meditative",=20"Instrumental=20Pop",=20=0A=20=20=20=20"Instrumental=20= Rock",=20"Ethnic",=20"Gothic",=20"Darkwave",=20"Techno-Industrial",=20=0A= =20=20=20=20"Electronic",=20"Pop-Folk",=20"Eurodance",=20"Dream",=20= "Southern=20Rock",=20"Comedy",=20=0A=20=20=20=20"Cult",=20"Gangsta",=20= "Top=2040",=20"Christian=20Rap",=20"Pop/Funk",=20"Jungle",=20=0A=20=20=20= =20"Native=20American",=20"Cabaret",=20"New=20Wave",=20"Psychadelic",=20= "Rave",=20=0A=20=20=20=20"Showtunes",=20"Trailer",=20"Lo-Fi",=20= "Tribal",=20"Acid=20Punk",=20"Acid=20Jazz",=20"Polka",=0A=20=20=20=20= "Retro",=20"Musical",=20"Rock=20&=20Roll",=20"Hard=20Rock",=20"Folk",=20= "Folk/Rock",=20=0A=20=20=20=20"National=20Folk",=20"Swing",=20= "Fast-Fusion",=20"Bebob",=20"Latin",=20"Revival",=20=0A=20=20=20=20= "Celtic",=20"Bluegrass",=20"Avantgarde",=20"Gothic=20Rock",=20= "Progressive=20Rock",=20=0A=20=20=20=20"Psychedelic=20Rock",=20= "Symphonic=20Rock",=20"Slow=20Rock",=20"Big=20Band",=20"Chorus",=20=0A=20= =20=20=20"Easy=20Listening",=20"Acoustic",=20"Humour",=20"Speech",=20= "Chanson",=20"Opera",=20=0A=20=20=20=20"Chamber=20Music",=20"Sonata",=20= "Symphony",=20"Booty=20Bass",=20"Primus",=20"Porn=20Groove",=0A=20=20=20=20= "Satire",=20"Slow=20Jam",=20"Club",=20"Tango",=20"Samba",=20"Folklore",=20= "Ballad",=20=0A=20=20=20=20"Power=20Ballad",=20"Rhythmic=20Soul",=20= "Freestyle",=20"Duet",=20"Punk=20Rock",=20"Drum=20Solo",=20=0A=20=20=20=20= "A=20capella",=20"Euro-House",=20"Dance=20Hall",=20"Goa",=20"Drum=20&=20= Bass",=20"Club=20House",=20=0A=20=20=20=20"Hardcore",=20"Terror",=20= "Indie",=20"BritPop",=20"NegerPunk",=20"Polsk=20Punk",=20"Beat",=0A=20=20= =20=20"Christian=20Gangsta",=20"Heavy=20Metal",=20"Black=20Metal",=20= "Crossover",=20"Contemporary=20C",=0A=20=20=20=20"Christian=20Rock",=20= "Merengue",=20"Salsa",=20"Thrash=20Metal",=20"Anime",=20"JPop",=20= "SynthPop"=0A=20=20]=0A=20=20=0A=20=20FIELD_NAMES=20=3D=20[=0A=20=20=20=20= [:song_name,=2030],=0A=20=20=20=20[:artist,=2030],=0A=20=20=20=20= [:album,=2030],=0A=20=20=20=20[:year,=204],=0A=20=20=20=20[:comment,=20= 30],=0A=20=20=20=20[:genre,=201]=0A=20=20]=0A=20=20=0A=20=20= FIELD_NAMES.each=20do=20|field,=20size|=0A=20=20=20=20attr_reader=20= field=0A=20=20end=0A=20=20=20=20=0A=20=20attr_reader=20:track_number=0A=20= =20=0A=20=20#=20=0A=20=20#=0A=20=20def=20initialize(file_name)=0A=20=20=0A= =20=20=20=20File.open(file_name,=20"r")=20do=20|file|=0A=20=20=20=20=20=20= file.seek(-128,=20File::SEEK_END)=0A=20=20=20=20=20=20return=20unless=20= file.read(3)=20=3D=3D=20"TAG"=0A=20=20=20=20=20=20=0A=20=20=20=20=20=20= FIELD_NAMES.each=20do=20|field,=20size|=0A=20=20=20=20=20=20=20=20= self.respond_to?(:"parse_#{field}")=20?=20self.send(:"parse_#{field}",=20= field,=20file,=20size)=20:=20parse_field(field,=20file,=20size)=0A=20=20=20= =20=20=20end=0A=20=20=20=20end=0A=20=20end=0A=20=20=0A=20=20protected=0A=20= =20=0A=20=20def=20parse_field(field,=20file,=20size)=0A=20=20=0A=20=20=20= =20field_value=20=3D=20file.read(size)=0A=20=20=20=20= instance_variable_set("@#{field}",=20field_value)=0A=20=20end=0A=20=20=0A= =20=20def=20parse_comment(field,=20file,=20size)=0A=20=20=20=20= field_value=20=3D=20file.read(size)=0A=20=20=20=20=0A=20=20=20=20#=20= track=20number=0A=20=20=20=20track_number=20=3D=20field_value[-1,=20= 1][0]=0A=20=20=20=20instance_variable_set("@track_number",=20= track_number)=20if=20track_number=20!=3D=200=0A=20=20=20=20=0A=20=20=20=20= instance_variable_set("@#{field}",=20sanitize(field_value))=0A=20=20end=0A= =20=20=0A=20=20def=20parse_genre(field,=20file,=20size)=0A=20=20=20=20= field_value=20=3D=20file.read(size)=0A=20=20=20=20genre=20=3D=20= field_value[0]=0A=20=20=20=20instance_variable_set("@#{field}",=20= GENRES[genre])=0A=20=20end=0A=20=20=0A=20=20def=20sanitize(text)=0A=20=20= =20=20text.gsub(/[^[:alnum:]]+/,=20'')=0A=20=20end=0A=20=20=0Aend=0A=0A=0A= mp3=20=3D=20Mp3.new(ARGV[0])=0Aputs=20"Artist:=20#{mp3.artist}"=0Aputs=20= "Song=20name:=20#{mp3.song_name}"=0Aputs=20"Album:=20#{mp3.album}"=0A= puts=20"Comment:=20#{mp3.comment}"=0Aputs=20"Genre:=20#{mp3.genre}"=0A= puts=20"Track:=20#{mp3.track_number}"=0A=0A= --Apple-Mail-1--608278529 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset=US-ASCII; format=flowed --Apple-Mail-1--608278529--