package WebService::HtmlKitCom::FavIconFromImage; use warnings; use strict; our $VERSION = '0.001'; use Carp; use WWW::Mechanize; use Devel::TakeHashArgs; use base 'Class::Data::Accessor'; __PACKAGE__->mk_classaccessors qw( error mech response ); sub new { my $self = bless {}, shift; get_args_as_hash( \@_, \ my %args, { timeout => 180 } ) or croak $@; $args{mech} ||= WWW::Mechanize->new( timeout => $args{timeout}, agent => 'Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.8.1.12)' .' Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12', ); $self->mech( $args{mech} ); return $self; } sub favicon { my $self = shift; $self->$_(undef) for qw(error response); my $image = shift; get_args_as_hash( \@_, \ my %args, { # also used: `file` text => '', image => $image, animate => 0, }, ) or croak $@; -e $args{image} or return $self->_set_error("File `$args{image}` does not exist"); my $mech = $self->mech; $mech->get('http://www.html-kit.com/favicon/')->is_success or return $self->_set_error( $mech, 'net' ); $mech->form_number(2) or return $self->_set_error('Failed to find favicon form'); $mech->set_visible( $args{image}, $args{text}, ( $args{animate} ? 1 : () ), ); $mech->click->is_success or return $self->_set_error( $mech, 'net' ); my $response = $mech->follow_link( url_regex => qr|^\Qhttp://www.html-kit.com/favicon/download/| ) or return $self->_set_error( 'Failed to create favicon. Check your args' ); $response->is_success or return $self->_set_error( $mech, 'net' ); if ( $args{file} ) { open my $fh, '>', $args{file} or return $self->_set_error( "Failed to open `$args{file}` for writing ($!)" ); binmode $fh; print $fh $response->content; close $fh; } return $self->response($response); } sub _set_error { my ( $self, $mech_or_message, $type ) = @_; if ( $type ) { $self->error( 'Network error: ' . $mech_or_message->res->status_line ); } else { $self->error( $mech_or_message ); } return; } 1; __END__ =head1 NAME WebService::HtmlKitCom::FavIconFromImage - generate favicons from images on http://www.html-kit.com/favicon/ =head1 SYNOPSIS use strict; use warnings; use WebService::HtmlKitCom::FavIconFromImage; my $fav = WebService::HtmlKitCom::FavIconFromImage->new; $fav->favicon( 'some_pics.jpg', file => 'out.zip', animate => 1 ) or die $fav->error; =head1 DESCRIPTION The module provides interface to web service on L which allows one to create favicons from regular images. What's a "favicon"? See L =head1 CONSTRUCTOR =head2 C my $fav = WebService::HtmlKitCom::FavIconFromImage->new; my $fav = WebService::HtmlKitCom::FavIconFromImage->new( timeout => 10 ); my $fav = WebService::HtmlKitCom::FavIconFromImage->new( mech => WWW::Mechanize->new( agent => '007', timeout => 10 ), ); Bakes and returns a fresh WebService::HtmlKitCom::FavIconFromImage object. Takes two I arguments which are as follows: =head3 C my $fav = WebService::HtmlKitCom::FavIconFromImage->new( timeout => 10 ); Takes a scalar as a value which is the value that will be passed to the L object to indicate connection timeout in seconds. B C<180> seconds =head3 C my $fav = WebService::HtmlKitCom::FavIconFromImage->new( mech => WWW::Mechanize->new( agent => '007', timeout => 10 ), ); If a simple timeout is not enough for your needs feel free to specify the C argument which takes a L object as a value. B plain L object with C argument set to whatever WebService::HtmlKitCom::FavIconFromImage's C argument is set to as well as C argument is set to mimic FireFox. =head1 METHODS =head2 C my $response = $fav->favicon('some_pic.jpg') or die $fav->error; $fav->favicon('some_pic.jpg', file => 'out.zip', text => 'Zoffix ROXORZ!', animate => 1, ) or die $fav->error; Instructs the object to create a favicon. First argument is mandatory and must be a file name of the image you want to use for making a favicon. B the site is being unclear about what it likes and what it doesn't. What I know so far is that it doesn't like 1.5MB pics but I'll leave you at it :). Return value is described below. Optional arguments are passed in a key/value form. Possible optional arguments are as follows: =head3 C ->favicon( 'some_pic.jpg', file => 'out.zip' ); B. If C argument is specified the archive containing the favicon will be saved into the file name of which is the value of C argument. B not specified and you'll have to fish out the archive from the return value (see below) =head3 C ->favicon( 'some_pic.jpg', animate => 1 ); B. Takes either true or false values. When set to a true value will ask the site to make an "animated" icon. B C<0> =head3 C ->favicon( 'some_pic.jpg', text => 'Zoffix ROXORZ!' ); B. If animation did not make your favicon icon ugly enough then specify the C argument which ask the site to add it as "Scrolling text" into your favicon. B C<''> (no text) =head3 C ->favicon( '', image => 'some_pic.jpg' ); B. You can call the method in an alternative way by specifying anything as the first argument and then setting C argument. This functionality is handy if your arguments are coming from a hash, etc. B first argument of this method. =head3 RETURN VALUE On failure C method returns either C or an empty list depending on the context and the reason for failure will be available via C method. On success it returns an L object obtained while fetching your precious favicon. If you didn't specify C argument to C method you'd obtain the favicon via C method of the returned L object (note that it would be a zip archive) =head2 C my $response = $fav->favicon('some_pic.jpg') or die $fav->error; Takes no arguments, returns a human parsable error message explaining why the call to C failed. =head2 C my $old_mech = $fav->mech; $fav->mech( WWW::Mechanize->new( agent => 'blah' ) ); Returns a L object used by this class. When called with an optional argument (which must be a L object) will use it in any subsequent C calls. =head2 C my $response = $fav->response; Must be called after a successful call to C. Takes no arguments, returns the exact same return value as last call to C did. =head1 AUTHOR Zoffix Znet, C<< >> (L, L) =head1 BUGS Please report any bugs or feature requests to C, or through the web interface at L. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes. =head1 SUPPORT You can find documentation for this module with the perldoc command. perldoc WebService::HtmlKitCom::FavIconFromImage You can also look for information at: =over 4 =item * RT: CPAN's request tracker L =item * AnnoCPAN: Annotated CPAN documentation L =item * CPAN Ratings L =item * Search CPAN L =back =head1 COPYRIGHT & LICENSE Copyright 2008 Zoffix Znet, all rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut