#!/usr/bin/env perl use strict; use warnings; use Getopt::Long; use Pod::Usage; use Carp; use English qw/-no_match_vars/; use Readonly; use IO::All -utf8; use List::Compare; use IO::Interactive qw/is_interactive/; use FilmAffinity::Movie; use FilmAffinity::Utils qw/data2tsv/; use FilmAffinity::UserRating; =head1 NAME filmaffinity-get-all-info.pl =head1 DESCRIPTION Get information from filmaffinity about a film and all ratings from a user =head1 VERSION Version 1.01 =head1 USAGE filmaffinity-get-all-info.pl --userid=123456 --destination=path/to/my/folder filmaffinity-get-all-info.pl --userid=123456 --destination=path/to/my/folder --delay=2 filmaffinity-get-all-info.pl --userid=123456 --destination=path/to/my/folder --force =head1 REQUIRED ARGUMENTS =over 2 =item --userid=123456 userid from filmaffinity =item --destination=/home/william/filmaffinity destination folder =back =head1 OPTIONS =over 2 =item --delay=3 delay between requests =item --force force to retrieve all movies =back =cut our $VERSION = '1.01'; Readonly my $DELAY => 5; my ( $userID, $delay, $destination, $force, $help ); GetOptions( 'userid=i' => \$userID, 'delay=i' => \$delay, 'destination=s' => \$destination, 'force' => \$force, 'help' => \$help, ) || pod2usage(2); if ( $help || !$userID || !$destination ) { pod2usage(1); exit 0; } setFileSystem(); my $userParser = FilmAffinity::UserRating->new( userID => $userID, delay => $delay || $DELAY, ); my $ref_movies = $userParser->parse(); my $tsv = data2tsv($ref_movies); $tsv > io( $destination . '/ratings.list' ); my @listOfRemoteMovieId = keys %{$ref_movies}; my @listOfLocalMovieId = getListOfLocalMovieId(); my $listCompare = List::Compare->new( \@listOfLocalMovieId, \@listOfRemoteMovieId, ); my @listOfMovieToRetrieve = $force ? @listOfRemoteMovieId : $listCompare->get_Ronly(); my $progress; if ( is_interactive() ) { my $value = eval { require Term::ProgressBar; $progress = Term::ProgressBar->new( { name => 'jsonize movie information', count => scalar @listOfMovieToRetrieve, remove => 1 } ); }; if ($EVAL_ERROR) { carp 'Could not create progress bar. We can continue, but no progress will be reported'; } } my $count = 0; foreach my $id (@listOfMovieToRetrieve) { my $movie = FilmAffinity::Movie->new( id => $id, delay => $delay || $DELAY, ); $movie->parse(); $movie->myrating( $ref_movies->{$id}->{rating} ); my $json = $movie->toJSON(); $json > io( $destination . '/json/' . $id . '.json' ); $count++; $progress->update($count) if $progress; } sub setFileSystem { mkdir $destination; mkdir $destination . '/json'; return; } sub getListOfLocalMovieId { my @listOfLocalMovie = (); my @content = io( $destination . '/json' )->all(); foreach my $file (@content) { my $filename = $file->filename; $filename =~ s/[.]json//xms; push @listOfLocalMovie, $filename; } return @listOfLocalMovie; } =head1 AUTHOR William Belle, C<< <william.belle at gmail.com> >> =head1 BUGS AND LIMITATIONS Please report any bugs or feature requests to C<bug-filmaffinity-userrating at rt.cpan.org>, or through the web interface at L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=FilmAffinity-UserRating>. 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 filmaffinity-get-all-info.pl You can also look for information at: =over 4 =item * RT: CPAN's request tracker (report bugs here) L<http://rt.cpan.org/NoAuth/Bugs.html?Dist=FilmAffinity-UserRating> =item * AnnoCPAN: Annotated CPAN documentation L<http://annocpan.org/dist/FilmAffinity-UserRating> =item * CPAN Ratings L<http://cpanratings.perl.org/d/FilmAffinity-UserRating> =item * Search CPAN L<http://search.cpan.org/dist/FilmAffinity-UserRating/> =back =head1 SEE ALSO L<http://www.filmaffinity.com> =head1 LICENSE AND COPYRIGHT Copyright 2013 William Belle. This program is free software; you can redistribute it and/or modify it under the terms of either: the GNU General Public License as published by the Free Software Foundation; or the Artistic License. See http://dev.perl.org/licenses/ for more information. =cut