word edit: replace altered source images
authorMischa POSLAWSKY <perl@shiar.org>
Sun, 24 May 2020 20:33:20 +0000 (22:33 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Sat, 6 Jun 2020 01:49:20 +0000 (03:49 +0200)
writer.plp

index 73f6b9862a993f2308fdc69248bd0e78b439b44e..11754e8a72d4b1834aa904126ad158cda5fee5f4 100644 (file)
@@ -119,12 +119,19 @@ my @wordcols = (
 my ($find) = map {{id => $_}} $fields{id} || $Request || ();
 
 my $row;
+if ($find) {
+       $row = $db->select(word => '*', $find)->hash
+               or Abort("Word not found", 404);
+}
+
 if (exists $get{copy}) {
-       $row = {%fields{ qw(lang cat) }};
+       $row = {%{$row}{ qw(lang cat) }};
 }
 elsif ($ENV{REQUEST_METHOD} eq 'POST') {
+       my $replace = $row;
        $row = {%post{ pairkeys @wordcols }};
        $_ = length ? $_ : undef for values %{$row};
+
        eval {
                my %res = (returning => '*');
                my $query = $find ? $db->update(word => $row, $find, \%res) :
@@ -133,42 +140,51 @@ elsif ($ENV{REQUEST_METHOD} eq 'POST') {
        } or Alert("Entry could not be saved", $@);
 
        my $imgpath = "data/word/org/$row->{id}.jpg";
-       if (my $download = $row->{source} and !-e $imgpath) {
-               require LWP::UserAgent;
-               my $ua = LWP::UserAgent->new;
-               $ua->agent('/');
-               my $status = $ua->mirror($download, $imgpath);
-               $status->is_success or Alert([
-                       "Source image not found",
-                       "Download from <q>$download</q> failed: ".$status->status_line,
-               ]);
+       if (($row->{source} // '') ne ($replace->{source} // '')) {
+               # copy changed remote url to local file
+               unlink $imgpath if -e $imgpath;
+               if (my $download = $row->{source}) {
+                       require LWP::UserAgent;
+                       my $ua = LWP::UserAgent->new;
+                       $ua->agent('/');
+                       my $status = $ua->mirror($download, $imgpath);
+                       $status->is_success or Alert([
+                               "Source image not found",
+                               "Download from <q>$download</q> failed: ".$status->status_line,
+                       ]);
+               }
+       }
+       elsif ($row->{thumb} ~~ $replace->{thumb}) {
+               # image and conversion unaltered
+               $imgpath = undef;
        }
 
        my $thumbpath = "data/word/eng/$row->{form}.jpg";
-       if (-e $imgpath) {
-               my @cmds = @{ $row->{thumb} // [] };
-               @cmds = (
-                       'convert',
-                       -delete => '1--1', -background => 'white',
-                       -gravity => @cmds ? 'northwest' : 'center',
-                       @cmds,
-                       -resize => '300x200^', -extent => '300x200',
-                       '-strip', -quality => '60%', -interlace => 'plane',
-                       $imgpath => $thumbpath
-               );
-               my $status = system @cmds;
-               $status == 0 or Alert([
-                       "Thumbnail image not generated",
-                       "Failed to convert source image, error code ".($status >> 8),
-               ], "@cmds");
+       if ($imgpath) {
+               if (-e $imgpath) {
+                       my @cmds = @{ $row->{thumb} // [] };
+                       @cmds = (
+                               'convert',
+                               -delete => '1--1', -background => 'white',
+                               -gravity => @cmds ? 'northwest' : 'center',
+                               @cmds,
+                               -resize => '300x200^', -extent => '300x200',
+                               '-strip', -quality => '60%', -interlace => 'plane',
+                               $imgpath => $thumbpath
+                       );
+                       my $status = system @cmds;
+                       $status == 0 or Alert([
+                               "Thumbnail image not generated",
+                               "Failed to convert source image, error code ".($status >> 8),
+                       ], "@cmds");
+               }
+               else {
+                       unlink $thumbpath;
+               }
        }
 }
-elsif ($find) {
-       $row = $db->select(word => '*', $find)->hash
-               or Abort("Word not found", 404);
-}
 else {
-       $row = \%fields;
+       $row->{$_} = $get{$_} for keys %get;
 }
 
 my $title = $row->{id} ? "entry <small>#$row->{id}</small>" : 'new entry';