#!/usr/bin/perl
#
#
gfx.pl
#
#
# pip at dds dot nl
#
package lsplaatjes;
# libs
BEGIN{
use Time::HiRes qw( usleep ualarm gettimeofday tv_interval );
use Date::Manip;
use strict;
use jip;
use Lok;
use Person;
use Word;
use Vote;
use Location;
use Data::Dumper;
use CGI;
use Server;
}
my $timestart=[gettimeofday];
# cgi
my $q=new CGI;
# server
my $server=Server->instance();
#
# cgi params
#
my $action = $q->param('action');
#my $cgitmpl = $q->param('tmpl') || 'image-lsgfx2';
my $cgitmpl = $q->param('tmpl') || 'lsgfx';
my $type = $q->param('type');
my $update = $q->param('update');
my $mimetype= 'text/html';
if ($type eq 'rss'){
$cgitmpl = 'image-lsgfx-rss';
}
if ( $cgitmpl eq 'image-lsgfx-rss' ){
$type='rss';
}
my $num = int( $q->param('num') ) || 99;
my $vier = $q->param('400') || '';
my $maxnum = '100';
$maxnum = '10000' if $type eq 'rss';
$num = $maxnum if ($num > $maxnum);
my $offset = $q->param('off') || $q->param('start') || 0;
$offset = int($offset);
my $woc = $q->param('woc') || '';
my $que = $q->param('q') || $q->param('que') || '';
my $qque = $server->quote( $que );
my $random = $q->param('random') || '';
#
# /cgi params
#
# header
my $mimetype = 'text/html';
if ($type eq 'rss'){
$mimetype = 'text/xml';
}
print $q->header(-type => $mimetype,
-expires => '+34hours',
-charset => 'UTF-8');
# vars
my $qself = $q->self_url;
my $qselfs = $q->url;
my $debug=0;
my $msg='';
if ($update){
$qself =~ s!\?update=$update$!!;
warn "update $qself";
}
#20060206
my $cache = new Cache::FileCache({namespace => 'ylsgfx'} );
my $r = $cache->get( $qself );
if ( (not defined $r) || $update){
warn "do $qself";
#
# alle rest
#
# template
my $tmpl=$server->gettemplate($cgitmpl);
my $hoofd=hoofd('lsgfx');
my $voet =voet2('lsgfx');
$tmpl->param( 'actionis_' . $action => $action,
'action' => $action,
hoofd => $hoofd,
voet => $voet,
random => $random,
);
#
# qwhere
#
my $qwhere="
LEFT JOIN location AS l on l.about = images.id
WHERE filename IS NOT NULL
";
$qwhere .="
AND images.comment IS NOT NULL
" unless $woc;
$qwhere .= "
AND (
images.comment ~* $qque OR
images.filename ~* $qque OR
images.dirname ~* $qque
OR locationname ~* $qque
)
" if $que;
$qwhere .= "
AND images.dirname NOT LIKE \'/gfx/Patrick%\'
";
#
# /qwhere
#
#
# total found images
#
my $tquery="
SELECT count(images.id) as count FROM images
$qwhere
";
my ($tsth,$terr)=$server->doq($tquery);
print $terr if $terr;
my $trow =$tsth->fetchrow_hashref;
my $total = $trow->{'count'};
$tmpl->param(
total => $total,
tquery => $tquery
);
#
# /total images
#
#
# check
#
my $geenouderemeer;
if ($offset + $num > $total){
$geenouderemeer = 1;
}
my $maxoffset = $total - $num;
# print " off:$offset tot:$total num:$num maxoffset:$maxoffset";
if ($offset > $maxoffset || $offset < 0){
$offset = $maxoffset;
$geenouderemeer = 1;
}
#???
if ($offset < 0){
$offset = 0;
$geenouderemeer = 1;
}
#
# /check
#
#
# query
#
my $query="
SELECT *,images.id as id FROM images
$qwhere
ORDER BY images.filedate desc
LIMIT $num
OFFSET $offset
";
# print $query;
$tmpl->param(query => $query);
my ($sth,$err)=$server->doq($query);
print $err if $err;
#
# /query
#
#
# random
#
my $rquery="
SELECT *
FROM images
WHERE filename IS NOT NULL
AND width > 48
AND height > 48
AND dirname NOT LIKE \'/gfx/Patrick%\'
ORDER BY random()
LIMIT 1
";
my ($rsth,$rerr)=$server->doq($rquery);
print $rerr if $rerr;
my $rrow=$rsth->fetchrow_hashref;
#print Dumper($rrow);
my $randoml=Lok->new( $rrow->{'id'} );
my @randomimages;
push @randomimages , $randoml->{'row'} ;
$tmpl->param( randomimages => \@randomimages );
#
# /random
#
#
# loop images found
#
my @images;
my $lastweek = '';
my $lastday = '';
my $persons; # hash voor personen
my $words; # hash voor words
while (my $row=$sth->fetchrow_hashref){
# print Dumper($row);
my $l = Lok->new($row->{'id'} );
my $lr= $l->{'row'};
# $lr->{'dump'} = Dumper($lr);
#print $lr->{'dump'} = Dumper($lr);
#print Dumper($lr);
my $dm= ParseDate( $lr->{'filedate'} );
my $weeky=&UnixDate($dm,"%Y-%U ");
my $year=&UnixDate($dm,"%Y");
my $week=&UnixDate($dm,"%U");
my $newweek='';
$newweek=$weeky unless($weeky eq $lastweek);
$lastweek=$weeky;
# my $datum=&UnixDate($dm,"%e %b %Y");
my $datum=&UnixDate($dm,"%e %B");
my $day=&UnixDate($dm,"%A");
my $newday='';
$newday=$day unless($day eq $lastday);
if ($newday){
my @dlet;
foreach my $let ( split '' , $day ){
# print "let:$let";
my $h;
$h->{'let'} = $let;
push @dlet,$h;
}
while ( @dlet < 9){
push @dlet , { 'let' => ' ', } ;
}
$lr->{'dlet'} = \@dlet;
}
$lastday=$day;
$lr->{'datum'} = $datum;
$lr->{'day'} = $day;
$lr->{'year'} = $year;
$lr->{'week'} = $week;
$lr->{'newweek'} = $newweek;
$lr->{'newday'} = $newday;
$lr->{'400'} = $vier;
# person
my $depicts = new Person( { lok => $lr } );
foreach my $person ( @{$depicts} ){
my $nick=$person->{'nick'};
$persons->{$nick} = $person;
}
$lr->{'depicts'} = $depicts;
# /person
#vote
my $vote = Vote->new( {about => $lr->{'id'} ,} );
my @votes = $vote->{'votes'};
#warn Dumper(@votes);
#my $t=[];
#$t = @votes;
#$lr->{'votes'} = [ {la=>'la'}, {la=>'la'}];
$lr->{'votetotal'} = $vote->{'votetotal'};
#/vote
# location
my $loc=Location->new( $lr );
unless ( $loc->{'lat'} && $loc->{'lon'} ){
$lr->{'nolocation'} = 1;
}else{
$lr->{'haslocation'} = 1;
$lr->{'lat'} = $loc->{'lat'};
$lr->{'lon'} = $loc->{'lon'};
$lr->{'locationname'} = $loc->{'locationname'};
}
# /location
# word 200312
my $word = Word->new( $lr->{'id'} );
if ( $word->{'words'} ){
my @awords;
foreach my $w (@{$word->{'words'} }){
my $row={};
my ($sw) = $w =~ m!1\.6/(.*?)$!;
$row->{'word'} = $w;
$row->{'sword'} = lc($sw);
$words->{$sw} = $row;
push @awords, $row;
" word:$w \n";
}
$lr->{'words'} = \@awords;
}
# 2006
# TODO cleanup, remove word1
my ($word2,$wlastupdated) = Word->getwords({imageid => $l->{'serial'},
about => $l->{'id'},
}
);
my @arr;
$lr->{'words2'} = \@arr;
if ($word2){
$lr->{'words2'} = $word2;
$lr->{'words'} = $word2;
}
# /word
# 400
my $maxvier=1000;
$vier = $maxvier if ($vier > $maxvier);
if ( $vier > 1 ){
$lr->{'displaywidth'} = $vier / 400 * $lr->{'displaywidth'};
$lr->{'displayheight'} = $vier;
}
# /400
push @images,$lr;
}
#
# /loop images found
#
$tmpl->param( images => \@images );
# persons
my @coperson;
foreach my $var(sort keys %{$persons} ){
push @coperson,$persons->{$var};
}
$tmpl->param( coperson => \@coperson );
# /persons
# words
if ($words){
my @coword;
#print Dumper($words);
foreach my $var(sort keys %{$words} ){
push @coword, $words->{$var} ;
}
$tmpl->param( coword => \@coword );
}
# /words
# totalimages
my $l = Lok->new( '/gfx/jip.png' );
my $totalimages = 1;
if ($l){
$totalimages = $l->totalimages;
}
# access
my $la = Lok->new( '/gfx/Icons/jip.kijkt.jpg' );
my @hits = @{$la->updateaccess( {onlywithrefer => 1,} ) };
my $totalhits = $la->totalhits;
#print Dumper(@hits);
my $refer=$ENV{'HTTP_REFERER'};
if ($refer){
my $refersearch = $server->url2search($refer);
#my ($refersearch) = $refer =~ m!q=(.*?)&!;
#$refersearch =~ s!\+! !g;
my $msg .= " referersearch:$refersearch ";
$tmpl->param( refer => $refer,
msg => $msg,
refersearch => $refersearch,
);
}
#
# end
#
my $end=[gettimeofday];
my $elapsed = tv_interval ( $timestart , $end );
$elapsed = sprintf("%01.3f", $elapsed);
#
# /end
#
#
# spui
#
$tmpl->param( elapsed => $elapsed,
num => $num,
off => int( $offset ),
offset => int( $offset ),
offsetminlimit => int($offset) - int($num),
offsetpluslimit => int($offset) + int($num),
woc => $woc,
q => $que,
totalimages => $totalimages,
totalminoff => $total - $offset,
totalminoffminnum => $total - $offset - $num + 1,
geenouderemeer => $geenouderemeer,
totalminoffplus1 => $total - $offset + 1,
totalminoffplus1pluslimit => $total - $offset + 1 + $num,
totalhits => $totalhits,
400 => $vier,
qself => $qself,
qselfs => $qselfs,
hits => \@hits,
rbcolor => $server->rbcolor,
rdcolor => $server->rdcolor,
rcolor => $server->rcolor,
);
my $output = $tmpl->output;
$r = $server->compact($output);
$cache->set($qself, $r, 7 * 24 * 60 * 60);
warn 'caching lsgfx ' . $qself;
#
# Kla.
#
} # kla with alles
print $r;