diff options
-rw-r--r-- | README | 2 | ||||
-rw-r--r-- | data/global.pl | 1 | ||||
-rw-r--r-- | lib/Multi/Image.pm | 92 | ||||
-rw-r--r-- | lib/VNDB/DB/VN.pm | 4 | ||||
-rw-r--r-- | lib/VNDB/Handler/VNEdit.pm | 18 | ||||
-rw-r--r-- | util/sql/all.sql | 2 | ||||
-rw-r--r-- | util/sql/func.sql | 7 | ||||
-rw-r--r-- | util/updates/update_2.23.sql | 3 |
8 files changed, 21 insertions, 108 deletions
@@ -45,8 +45,6 @@ Requirements POE::Component::Pg (get it from http://g.blicky.net/poco-pg.git/) IRC: POE::Component::IRC - Image: - Image::Magick Maintenance: PerlIO::gzip RG: diff --git a/data/global.pl b/data/global.pl index 5ac491d0..90f1c448 100644 --- a/data/global.pl +++ b/data/global.pl @@ -119,7 +119,6 @@ our %M = ( #APIDump => {}, Feed => {}, RG => {}, - Image => {}, #Anime => {}, # disabled by default, requires AniDB username/pass Maintenance => {}, #IRC => {}, # disabled by default, no need to run an IRC bot when debugging diff --git a/lib/Multi/Image.pm b/lib/Multi/Image.pm deleted file mode 100644 index 1e56bbe6..00000000 --- a/lib/Multi/Image.pm +++ /dev/null @@ -1,92 +0,0 @@ - -# -# Multi::Image - Image compressing and resizing -# - -package Multi::Image; - -use strict; -use warnings; -use POE; -use Image::Magick; -use Time::HiRes 'time'; -use VNDBUtil 'imgsize'; - - -sub spawn { - my $p = shift; - POE::Session->create( - package_states => [ - $p => [qw| _start - _start shutdown scr_check scr_process - |], - ], - heap => { - sfpath => $VNDB::ROOT.'/static/sf', - stpath => $VNDB::ROOT.'/static/st', - check_delay => 3600, - @_, - }, - ); -} - - -sub _start { - $_[KERNEL]->alias_set('image'); - $_[KERNEL]->sig(shutdown => 'shutdown'); - $_[KERNEL]->post(pg => listen => screenshot => 'scr_check'); - $_[KERNEL]->yield('scr_check'); -} - - -sub shutdown { - $_[KERNEL]->post(pg => unlisten => 'charimage', 'screenshot'); - $_[KERNEL]->delay('scr_check'); - $_[KERNEL]->alias_remove('image'); -} - - -sub scr_check { - $_[KERNEL]->delay('scr_check'); - $_[KERNEL]->post(pg => query => 'SELECT id FROM screenshots WHERE processed = false LIMIT 1', undef, 'scr_process'); -} - - -sub scr_process { # num, res - return $_[KERNEL]->delay(scr_check => $_[HEAP]{check_delay}) if $_[ARG0] == 0; - - my $id = $_[ARG1][0]{id}; - my $start = time; - my $sf = sprintf '%s/%02d/%d.jpg', $_[HEAP]{sfpath}, $id%100, $id; - my $st = sprintf '%s/%02d/%d.jpg', $_[HEAP]{stpath}, $id%100, $id; - my $os = -s $sf; - - # convert/compress full-size image - my $im = Image::Magick->new; - $im->Read($sf); - $im->Set(magick => 'JPEG'); - $im->Set(quality => 90); - $im->Write($sf); - - # create thumbnail - my($ow, $oh) = ($im->Get('width'), $im->Get('height')); - my($nw, $nh) = imgsize($ow, $oh, @{$VNDB::S{scr_size}}); - $im->Thumbnail(width => $nw, height => $nh); - $im->Set(quality => 90); - $im->Write($st); - - $_[KERNEL]->post(pg => do => - 'UPDATE screenshots SET processed = true, width = ?, height = ? WHERE id = ?', - [ $ow, $oh, $id ] - ); - $_[KERNEL]->call(core => log => - 'Processed screenshot #%d in %.2fs: %.1fkB -> %.1fkB (%dx%d), thumb: %.1fkB (%dx%d)', - $id, time-$start, $os/1024, (-s $sf)/1024, $ow, $oh, (-s $st)/1024, $nw, $nh - ); - - $_[KERNEL]->yield('scr_check'); -} - - -1; - diff --git a/lib/VNDB/DB/VN.pm b/lib/VNDB/DB/VN.pm index 0d14b5f4..d0015d27 100644 --- a/lib/VNDB/DB/VN.pm +++ b/lib/VNDB/DB/VN.pm @@ -235,9 +235,9 @@ sub dbVNImageId { # insert a new screenshot and return it's ID -# (no arguments required, as Multi is responsible for filling the entry with information) sub dbScreenshotAdd { - return shift->dbRow(q|INSERT INTO screenshots (processed) VALUES(false) RETURNING id|)->{id}; + my($s, $width, $height) = @_; + return $s->dbRow(q|INSERT INTO screenshots (processed, width, height) VALUES (true, ?, ?) RETURNING id|, $width, $height)->{id}; } diff --git a/lib/VNDB/Handler/VNEdit.pm b/lib/VNDB/Handler/VNEdit.pm index 6be06ef2..537b71f6 100644 --- a/lib/VNDB/Handler/VNEdit.pm +++ b/lib/VNDB/Handler/VNEdit.pm @@ -407,9 +407,23 @@ sub scrxml { # no error? save and let Multi process it if(!$id) { - $id = $self->dbScreenshotAdd; + my $im = Image::Magick->new; + $im->BlobToImage($imgdata); + $im->Set(magick => 'JPEG'); + $im->Set(quality => 90); + my($ow, $oh) = ($im->Get('width'), $im->Get('height')); + + $id = $self->dbScreenshotAdd($ow, $oh); my $fn = imgpath(sf => $id); - $self->reqSaveUpload($param, $fn); + $im->Write($fn); + chmod 0666, $fn; + + # thumbnail + my($nw, $nh) = imgsize($ow, $oh, @{$self->{scr_size}}); + $im->Thumbnail(width => $nw, height => $nh); + $im->Set(quality => 90); + $fn = imgpath(st => $id); + $im->Write($fn); chmod 0666, $fn; } diff --git a/util/sql/all.sql b/util/sql/all.sql index bb5359d6..d012a492 100644 --- a/util/sql/all.sql +++ b/util/sql/all.sql @@ -64,8 +64,6 @@ CREATE TRIGGER vn_anime_aid_edit BEFORE UPDATE ON vn_anime CREATE TRIGGER anime_fetch_notify AFTER INSERT OR UPDATE ON anime FOR EACH ROW WHEN (NEW.lastfetch IS NULL) EXECUTE PROCEDURE anime_fetch_notify(); -CREATE TRIGGER screenshot_process_notify AFTER INSERT OR UPDATE ON screenshots FOR EACH ROW WHEN (NEW.processed = FALSE) EXECUTE PROCEDURE screenshot_process_notify(); - CREATE TRIGGER vn_relgraph_notify AFTER UPDATE ON vn FOR EACH ROW WHEN (OLD.rgraph IS DISTINCT FROM NEW.rgraph OR OLD.latest IS DISTINCT FROM NEW.latest diff --git a/util/sql/func.sql b/util/sql/func.sql index 3f52475e..6f51a6b2 100644 --- a/util/sql/func.sql +++ b/util/sql/func.sql @@ -603,13 +603,6 @@ $$ LANGUAGE plpgsql; --- Send a notify when a screenshot needs to be processed -CREATE OR REPLACE FUNCTION screenshot_process_notify() RETURNS trigger AS $$ - BEGIN NOTIFY screenshot; RETURN NULL; END; -$$ LANGUAGE plpgsql; - - - -- Update vn.rgraph column and send notify when a relation graph needs to be regenerated -- 1. NOTIFY is sent on VN edit or insert or change in vn.rgraph, when rgraph = NULL and entries in vn_relations -- vn.rgraph is set to NULL when: diff --git a/util/updates/update_2.23.sql b/util/updates/update_2.23.sql index 305781b6..46a2dd68 100644 --- a/util/updates/update_2.23.sql +++ b/util/updates/update_2.23.sql @@ -61,3 +61,6 @@ DROP FUNCTION vn_rev_image_notify(); DROP TRIGGER chars_rev_image_notify ON chars_rev; DROP FUNCTION chars_rev_image_notify(); + +DROP TRIGGER screenshot_process_notify ON screenshots; +DROP FUNCTION screenshot_process_notify(); |