summaryrefslogtreecommitdiff
path: root/util/OLD/cleanimg.pl
blob: 45032106b492f738276c7945a445607403cf0b6b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/perl



#
#       O L D   -   D O   N O T   U S E !
#


use strict;
use warnings;
use Time::HiRes 'gettimeofday', 'tv_interval';
BEGIN {
  our $ST = [ gettimeofday ];
}
use DBI;
use Image::Magick;
use Image::MetaData::JPEG;
use File::Copy 'cp', 'mv';
use Digest::MD5;

require '/www/vndb/lib/global.pl';

our $ST;

my $sql = DBI->connect(@VNDB::DBLOGIN,
    { RaiseError => 1, PrintError => 0, AutoCommit => 1, pg_enable_utf8 => 1 });

my $imgpath = '/www/vndb/static/img';
my $tmpimg = '/tmp/vndb-clearimg.jpg';

imgscan();

printf "Finished in %.3f seconds\n", tv_interval($ST);

sub imgscan {
  print "Scanning images...\n";
  my $done = 0;
  for my $c ('0'..'9', 'a'..'f') {
    opendir(my $D, "$imgpath/$c") || die "$imgpath/$c: $!";
    for my $f (readdir($D)) {
      my $cur = "$imgpath/$c/$f";
      next if !-s $cur || $f !~ /^(.+)\.jpg$/;
      my $cmd5 = $1;

     # delete unused images
      if($f =~ /^tmp/ || $f =~ /\.jpg\.jpg$/) {
        printf "Deleting temp image %s/%s\n", $c, $f;
        unlink $cur or die $!;
        next;
      }
      my $q = $sql->prepare('SELECT 1 FROM vn_rev WHERE image = DECODE(?, \'hex\')');
      $q->execute($cmd5);
      my $d = $q->fetchrow_arrayref();
      if(!$d || ref($d) ne 'ARRAY' || $d->[0] <= 0) {
        printf "Deleting %s/%s\n", $c, $f;
        unlink $cur or die $!;
        $done++;
        next;
      }
      $q->finish();

     # remove metadata
      my $i = Image::MetaData::JPEG->new($cur);
      $i->drop_segments('METADATA');
      $i->save($tmpimg);
      if(-s $tmpimg < (-s $cur)-32) {
        printf "Removed metadata from %s/%s: %.2f to %.2f kB\n", $c, $f, (-s $cur)/1024, (-s $tmpimg)/1024;
        cp $tmpimg, $cur;
      }

     # compress large images
      if(-s $cur > 20*1024) { # > 20 KB
        $i = Image::Magick->new;
        $i->Read($cur);
        $i->Set(quality => 80);
        $i->Write($tmpimg);
        undef $i;
        #if(-s $tmpimg > 35*1024) { # extremely large images get a quality of 65
        #  $i = Image::Magick->new;
        #  $i->Read($cur);
        #  $i->Set(quality => 65);
        #  $i->Write($tmpimg);
        #  undef $i;
        #}
        if(-s $tmpimg < (-s $cur)-1024) {
          printf "Compressed %s/%s from %.2f to %.2f kB\n", $c, $f, (-s $cur)/1024, (-s $tmpimg)/1024;
          cp $tmpimg, $cur or die $!;
          $done++;
        }
      }

     # rename file if MD5 is different
      open(my $T, '<:raw:bytes', $cur) || die $!;
      my $md5 = Digest::MD5->new()->addfile($T)->hexdigest;
      close($T);
      if($md5 ne $cmd5) {
        $sql->do('UPDATE vn_rev SET image = DECODE(?, \'hex\') WHERE image = DECODE(?, \'hex\')', undef, $md5, $cmd5);
        mv $cur, sprintf "%s/%s/%s.jpg", $imgpath, substr($md5, 0, 1), $md5 or die $!;
        printf "Renamed %s/%s to %s/%s\n", $c, $cmd5, substr($md5, 0, 1), $md5;
      }
    }
    closedir($D);
  }
  unlink $tmpimg;
  print "Everything seems to be ok\n" if !$done;
}



1;