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;
|