This is an excellent thriller, a very fast pacing book. Once started it will be difficult to leave it unfinished. What strange things happen in Antarctic. A classic battle between outnumbered Marines, SAS, French Commandos, Seals, fighters, stealths, nuclear missile, traitors and what else is not there in this book.
Wise and Otherwise by Sudha Murthy
This book is a memoir and it contains 51 different experiences penned by Sudha Murthy. These experiences are from her engagement with the Infosys Foundation and her interaction with various people at various places. Some of the experiences really make you think about how complex we have made our lives and still we are chasing the unknown.
Fermat’s Last Theorem by Simon Singh
Fermat’s Last Theorem by Simon Singh is not a book which details out the proof. The actual proof manuscript by Andrew Wiles is 200 pages long and consists of beautiful blend of mathematical concepts with modern mathematics.
Simon Singh has very beautifully explained the various approaches and attempts made to prove this theorem by mathematicians for over 350 years. She has step by step taken the reader to the times preceding the Fermat’s time, to the time of Pythagoras, wherein lies the roots of this theorem. In this process she has taken us through brief life, time and works of various mathematicians whose work proved valuable in order for Andrew Wiles to proof this theorem.
The book is written in a very interesting and catching style and surprisingly does not include any complex mathematics. And hence a person with basic high school understanding of mathematics can understand and grasp the concepts in this book.
A must read for any mathematics fan.
The Rozabal Line by Ashwin Sanghi
The Rozabel Line is another book which is about the life and death of Jesus Christ combined with fiction. I guess this kind of historical fiction was started by Dan Brown in Da Vinci Code wherein he has traced the bloodline of Jesus Christ.
Ashwin has done a good amount of research and there are about 209 references given at the back of the book. Most of the book quotes various historical timeframes and what happened then based on the latest research. The actual amount of fiction is quite less and is loosely knitted around the research material.
I like this book for the historical information and research references rather than the actual plot. Also the switching of context from history to fiction was quite random.
Overall the research done by author impresses me, but perhaps this book lacks a strong plot and good editing.
Build An MP3 Catalogue System With Perl – Conclusion
In the last post we saw how to read ID3v1 and ID3v2 tags using perl. In this post we will continue our journey towards creating a simple catalog for the MP3 collection.
Quickly Getting the Desired Information out of the MP3 – autoinfo()
Usually in my catalog I am interested in the following information about an MP3 – Title, Artist, Album, Track, Year, Genre, Comment and the Artwork. However, I do not want to loop through all available information in my program to get this data. Fortunately the MP3::Tag module provides a autoinfo() function which gets almost all the information needed for us except the Artwork, which we may need to gather separately. The autoinfo() function returns the information about the title, album, artist, track, tear, genre and comment. This information is obtained from ID3v2 tag, ID3v1 tag, CDDB file, .inf file and the mp3 filename itself, where-ever it is found first. The order of this lookup can be changed with the config() command. I want to restrict my cataloging to only ID3v2 and ID3v1 tags.
Following lines provides us with the needed information.
$mp3->config("autoinfo", "ID3v2", "ID3v1"); my ($title, $track, $artist, $album, $comment, $year, $genre) = $mp3->autoinfo();
Getting Artwork Information
The artwork information is stored in the ID3v2 tag in a frame called APIC (stands for Attached PICture). This frame has _Data and MIME Type which we would need for our purpose. In order to extract this frame and its data we do not need to loop in through all the tags. The MP3::Tag module provides us with the get_frame() method, using which we can extract any frame directly like as shown below for artwork –
my $apic_frame = $mp3->{ID3v2}->get_frame("APIC"); my $img_data = $$apic_frame{'_Data'}; my $mime_type = $$apic_frame{'MIME type'};
This $img_data can be written out in a file and the $mime_type can be used as an extension. Thus we can extract the artwork from the MP3 file. The MIME type is something like “image/jpeg” and I have used the split function to get the string for the extension of the file.
my ($mime1, $mime2) = split(/\//, $mime_type); my $artwork_name = "artwork.$mime2"; open ARTWORK_FILE, ">$artwork_name" or die "Error creating the artwork file"; binmode(ARTWORK_FILE); print ARTWORK_FILE $img_data; close ARTWORK_FILE;
Generating the HTML using HTML
This is a simple project so I have used HTML::Template module to generate HTML code to the standard output, which can then in turn be redirected to a file using shell redirection. For a making the table layout less cumbersome, I have used the purecss.io CSS framework. Here my HTML template code.
my $template = <<HTML; <html> <head> <title>My MP3 Catalog</title> <link rel="stylesheet" href="http://yui.yahooapis.com/pure/0.5.0/pure-min.css"> </head> <body> <h1>My MP3 Collection</h1> <table class="pure-table pure-table-horizontal"> <thead> <tr> <th>Album Artwork</th> <th>Album</th> <th>Track</th> <th>Title</th> <th>Artist</th> <th>Year</th> <th>Genre</th> <th>Comment</th> </tr> </thead> <tbody> <!-- TMPL_LOOP NAME=SONGS --> <tr> <td><a src="<TMPL_VAR NAME=FILEPATH>"><img src="<TMPL_VAR NAME=IMG>" height="150" width="150"/></a></td> <td><!-- TMPL_VAR NAME=ALBUM --></td> <td><!-- TMPL_VAR NAME=TRACK --></td> <td><!-- TMPL_VAR NAME=TITLE --></td> <td><!-- TMPL_VAR NAME=ARTIST --></td> <td><!-- TMPL_VAR NAME=YEAR --></td> <td><!-- TMPL_VAR NAME=GENRE --></td> <td><!-- TMPL_VAR NAME=COMMENT --></td> </tr> <!-- /TMPL_LOOP --> </tbody> </table> </body> </html> HTML my $tmpl = HTML::Template->new(scalarref => \$template);
Complete Script
The complete script is on github, you can have a look at –