photo-stats

statistics processor for the terminal
git clone https://git.clttr.info/photo-stats.git
Log (Feed) | Files | Refs (Tags) | README | LICENSE

commit e5647f3ea8f00e94e14136b81e6bc22e5e81adf4
parent c29e2d13cbbcaba588d607d926c6240b82e03ac7
Author: René Wagner <rwagner@rw-net.de>
Date:   Sat, 15 Aug 2020 15:06:03 +0200

allow to specify media file extensions using -E

add -v switch to enable debug output

Diffstat:
Mphosta.pl | 37+++++++++++++++++++++++++------------
1 file changed, 25 insertions(+), 12 deletions(-)

diff --git a/phosta.pl b/phosta.pl @@ -7,10 +7,10 @@ use v5.32; use warnings; no warnings 'experimental'; use strict; -use feature qw(say); -use POSIX qw(lround); +use feature 'say'; +use POSIX 'lround'; use Text::SimpleTable::AutoWidth; -use Scalar::Util qw(looks_like_number); +use Scalar::Util 'looks_like_number'; use Cwd; use DBI; use Getopt::Std; @@ -25,16 +25,18 @@ my $PROGRAM = 'Photo Stats'; my $configfile = catfile(File::HomeDir->my_home, '.phosta.conf'); # read commandline switches +our $opt_E='jpg,jpeg'; our $opt_D=getcwd . "/photo_stats.db"; our $opt_p=''; our $opt_t=''; our $opt_c=0; our $opt_s=''; our $opt_g=''; +our $opt_v=0; getconfig($configfile); -getopts('cp:g:s:t:D:') or die "Invalid parameters provided! See 'phosta --help' for more details."; +getopts('vcp:g:s:t:D:E:') or die "Invalid parameters provided! See 'phosta --help' for more details."; validate() or die "Invalid parameters provided! See 'phosta --help' for more details."; my $dsn = "DBI:SQLite:dbname=$opt_D"; @@ -65,6 +67,8 @@ sub validate if ($opt_t ne '' && $opt_t !~ /^([0-9]{8}){0,1}\-([0-9]{8}){0,1}$/) { return 0; } + if ($opt_E !~ /^([a-z]{2,4}){1,}(\,[a-z]{2,4}){0,}$/) { return 0; } + return 1; } @@ -79,6 +83,7 @@ sub writeconfig my ( $config_filename ) = @_; open(my $filehandle, '>', $config_filename) or die "Could not open file '$config_filename': $!"; say $filehandle '$opt_D="'. $opt_D .'";'; + say $filehandle '$opt_E="'. $opt_E .'";'; close $filehandle; } @@ -88,6 +93,7 @@ sub create_db my $dbh = DBI->connect($dsn, '', '', { RaiseError => 1 }) or die $DBI::errstr; my $stmt = 'CREATE TABLE photos (file TEXT PRIMARY KEY, maker TEXT, model TEXT, lensmake TEXT, lens TEXT, focallength INTEGER, focallength35mm INTEGER, aperture DECIMAL, exposuretime TEXT, iso INTEGER, flash TEXT, datetimeoriginal DATETIME);'; + if ($opt_v) { say "### DB Statement: $stmt"; } my $rv = $dbh->do($stmt); } @@ -96,9 +102,12 @@ sub populate_db my ($destination_dir) = @_; say "Scanning $destination_dir for images..."; - - my $cmd = "exiftool -fast2 -r -m -f -p '\$filepath##\$make##\$model##\$lensmake##\$lens##\$lensmodel##\$focallength##\$focallengthin35mmformat##\$aperture##\$exposuretime##\$shutterspeed##\$iso##\$flash##\$datetimeoriginal' -d \"%Y-%m-%d %H:%M:%S\" -ext jpg " . $destination_dir; - my @lines = qx($cmd); + + my $extensions = ' -ext ' . join(' -ext ', split(/\,/, $opt_E)) .' '; + + my $cmd = "exiftool -fast2 -r -m -f -p '\$filepath##\$make##\$model##\$lensmake##\$lens##\$lensmodel##\$focallength##\$focallengthin35mmformat##\$aperture##\$exposuretime##\$shutterspeed##\$iso##\$flash##\$datetimeoriginal' -d \"%Y-%m-%d %H:%M:%S\" " . $extensions . $destination_dir; + if ( $opt_v ) { say "### Exiftool command: $cmd"; } + my @lines = `$cmd`; my $dbh = DBI->connect($dsn, '', '', { RaiseError => 1 }) or die $DBI::errstr; my $errorcount = 0; @@ -126,7 +135,7 @@ sub populate_db $dbh->disconnect(); say sprintf('%5d', $emptycount). ' image files skipped due to missing EXIF data'; say sprintf('%5d', $errorcount). ' image files skipped due to errors'; - say "Updated local database $opt_D."; + say "Updated database $opt_D."; } sub get_sql @@ -210,12 +219,12 @@ sub query_db my $dbh = DBI->connect($dsn, '', '', { RaiseError => 1 }) or die $DBI::errstr; my $total_count = $dbh->selectrow_array("SELECT count(file) from photos"); - say "Querying local database with $total_count entries..."; + say "Querying database $opt_D with $total_count entries..."; say ''; my $tb = Text::SimpleTable::AutoWidth->new(); - #say get_sql($selected, $grouping); + if ($opt_v) { say '### SQL Statement: '. get_sql($selected, $grouping); } my $stmt = $dbh->prepare(get_sql($selected, $grouping)); $stmt->execute(); while (my @row = $stmt->fetchrow_array) @@ -247,13 +256,17 @@ sub main::HELP_MESSAGE say 'generic options:'; say ' -D <file> : path and name of the db file to use, defaults to <workingdir>/photo_stats.db'; say ' This option is automatically saved in the user conf, you can omit this option if you always use the same db'; - say ' -c : clear the database before populating with data from the folder'; + say ' -c : clear the database'; + say ' -v : be verbose - print some debug output'; say ' --help : show this help'; say ''; say 'data gathering:'; say ' -p <folder> : populate database from the files in the specified folder'; say ' Media files in the given folder and every subfolder are scanned, EXIF data extracted and pulled into the database'; - say ''; + say ' -E <ext> : list of comma separated extensions used for scanning image files, defaults to jpg,jpeg'; + say ' only media files which match (case-insensitive!) the given extensions are added to the database'; + say ' This option is saved to the user conf'; + say ''; say 'stats querying:'; say ' -g : group by time range, defaults to total (which means no grouping by time range)'; say ' allowed values: year, month, week, hour';