#!/usr/bin/perl use strict; use CGI qw/:standard/; autoEscape(undef); # main config my $root = "/home/bytex64/pix"; my $webroot = "/pix"; # RSS config my $rssname = "pix.bytex64.net"; my $rssurl = "http://pix.bytex64.net/"; my $rssdescription = "Pictures and video from $rssurl"; my $entries_per_page = 42; my $CRLF = "\015\012"; my $pathinfo = $ENV{'PATH_INFO'}; my $filter = param('filter'); # Oh, what's that? $pathinfo =~ s/\.\.//; my @exiftags = ('File size','File date','Resolution'); my $page = param('page'); my $pages; my @files = (); if ($pathinfo && param('text')) { # Time to write a comment! my $ts = time(); if (!-d "$root/comments$pathinfo") { mkdir "$root/comments$pathinfo"; } open COMMENT, ">$root/comments$pathinfo/$ts"; print COMMENT param('name'),"\n"; print COMMENT param('url'),"\n"; print COMMENT param('text'),"\n"; close COMMENT; open MAIL, '| /usr/bin/sendmail bytex64@gmail.com'; my ($name, $text) = (param('name'), param('text')); print MAIL < $name made a comment on $pathinfo: $text URL: http://pix.bytex64.net/index.pl$pathinfo ~pix EOM close MAIL; print redirect("http://pix.bytex64.net/index.pl$pathinfo"); exit(0); } sub lsfiles { my $dir = shift; opendir FILES, $dir; my @files = grep {/^[^.].*\.(jpg|JPG|png|PNG|gif|GIF|thm|THM)/} readdir(FILES); closedir FILES; return @files; } sub getindex { my $curr = shift; for (0..$#files) { if ($files[$_] eq $curr) { return $_; } } return undef; } sub curpage { my $n = getindex(shift); return $n / $entries_per_page; } sub pager { my $page = param('page'); my $prev = $page - 1; my $next = $page + 1; if ($prev >= 0) { print "<< "; } else { print "<< "; } for (0..$pages) { if ($_ != $page) { print "$_"; } else { print "$_"; } print ' '; } if ($next <= $pages) { print ">>"; } else { print ">>"; } } sub parse_comment { my $comment = shift; my %hash = (); my @lines = split("\n",$comment); my $mode = 0; foreach (@lines) { if ($mode == 0) { if (/^$/) { $mode = 1; $hash{'data'} = ''; next; } if (/^([-A-Za-z]+): (.*)$/) { $hash{lc($1)} = $2; } } else { $hash{'data'} .= $_; } } return \%hash; } if ($filter) { my @fstr = split(/\s+/,$filter); foreach my $f (@fstr) { if ($f eq '*') { # special case. Include everything. push(@files, lsfiles($root)); } elsif ($f =~ /^-/) { $f =~ s/^-//; # subtract from set my @sub = lsfiles("$root/tags/$f"); foreach my $l (@files) { foreach my $s (@sub) { $l=undef if $l eq $s; } } @files = grep {defined $_} @files; } else { push(@files, lsfiles("$root/tags/$f")); } } } else { @files = lsfiles($root); } @files = uniq(sort { (-M "$root/$a") <=> (-M "$root/$b") } @files); $pages = scalar(@files) / $entries_per_page; my $rsslink = $rssurl . "index.pl?rss=1" . ($filter ? '&filter=' . urlescape($filter) : ''); if (param('rss')) { rss(); exit 0; } print header(),start_html(-title=>"PIX",-style=>{'src'=>'/default.css'}, -head=>Link({-rel=>'alternate', -type=>'application/rss+xml', -title=>'PIX' . ($filter ? " $filter" : ''), -href=>$rsslink}) ); print "

PIX

\n"; print "
\n"; if (-f "$root$pathinfo") { # This is ugly. $_ = $pathinfo; s!/!!; my $pos; for (my $i=0; $i <= $#files; $i++) { if ($files[$i] eq $_) { $pos = $i; last; } } # Ok, it looks like the $files indexes are messed up. But you have to keep # in mind that the array is sorted in *reverse* order. if ($pos > 0) { print "next\n"; } else { print "next\n"; } print "index\n"; if ($pos < $#files) { print "prev\n"; } else { print "prev\n"; } print "
\n"; print "
\n"; my $path = "$webroot$pathinfo"; print "
\n"; if ($pathinfo =~ /\.thm$/) { # Movie my $mpath = $path; $mpath =~ s/\.thm$/.flv/; print <
Get the Flash Player to see this movie.
EOD } else { # Image my $spath = "$webroot/small$pathinfo"; print "
\n"; } my $exif = getjhead("$root$pathinfo"); print "
\n"; my $cdata = parse_comment($exif->{'Comment'}); print "
$cdata->{subject}
\n"; print $cdata->{data}; print "
\n"; if (param('comment')) { print ""; print "
\n"; print "

Name: \n"; print "

URL: \n"; print "

Comment:\n"; print "

\n"; print "

\n"; print "

\n"; } else { print "add comment\n"; } if (-d "$root/comments/$pathinfo") { print "

Comments

\n"; print_comments($pathinfo); print "
\n"; } } else { # Nav stuff print start_form("GET","/index.pl"),textfield('filter','',20),' ?',end_form(),"\n"; print "rss\n"; print "source\n"; print "\n"; print "
\n"; print "
\n"; pager(); my $start = $page * $entries_per_page; my $end = $start + $entries_per_page - 1; foreach (@files[$start .. $end]) { my ($tn, $i); $i = $_; next if (not -f "$root/$i"); my $ti = $i; $ti =~ s/\.thm$/.jpg/; if (-e "$root/thumbnail/$ti") { $tn = "$webroot/thumbnail/$ti"; } else { $tn = "notfound.png"; } my $exif = getjhead("$root/$i"); my $texif = getjhead("$root/thumbnail/$ti"); my ($tw,$th) = split(/ x /,$texif->{'Resolution'}); print "

\n"; print "\"[$i]\"\n"; print "
\n"; my $cdata; if (exists $exif->{'Comment'}) { $cdata = parse_comment($exif->{'Comment'}); print "
",$cdata->{subject},"
\n"; } opendir COMMENTS, "$root/comments/$i"; my $nc = 0; $nc++ foreach grep {/^[^.]/} readdir(COMMENTS); closedir COMMENTS; print "
$nc comments
\n"; foreach (@exiftags) { print "
$_ : ${$exif}{$_}
\n"; } if ($cdata->{tags}) { print "
tags: $cdata->{tags}
"; } print "
"; print "
\n\n"; } print "
\n"; } print end_html(); sub getjhead { my $img = shift; my %ehash; open JHEAD, "/usr/bin/jhead $img|"; while () { next if /^$/; if (/^([^:]*?)\s*: (.*)$/) { my ($k, $v) = ($1, $2); if (exists $ehash{$k}) { $ehash{$k} .= "\n$v"; } else { $ehash{$k} = $v; } } } close JHEAD; return \%ehash; } sub print_comments { my $file = shift; return if not -d "$root/comments/$file"; opendir COMMENTS,"$root/comments/$file"; my @comments = sort grep {/^[^.]/} readdir(COMMENTS); closedir COMMENTS; foreach (@comments) { open C,"$root/comments/$file/$_"; my $name = ; chomp $name; my $url = ; chomp $url; my $nametag; if ($name && $url) { $nametag = "$name"; } elsif ($name) { $nametag = $name; } elsif ($url) { $nametag = "$url"; } else { $nametag = "Some Anonymous Jackass"; } print "
$nametag says:
\n"; print join("
\n",); close C; } } sub uniq { my $last = $_[0]; foreach (@_[1..$#_]) { if ($_ eq $last) { $_=undef; } else { $last = $_; } } return grep {defined $_} @_; } sub rss { print "Content-type: application/rss+xml",$CRLF,$CRLF; print '',"\n"; print '',"\n"; print "\t\n"; print "\t\t$rssname\n"; print "\t\t${rssurl}index.pl?filter=" . urlescape($filter) . "\n"; print "\t\t$rssdescription\n"; my $max = ($#files > 49 ? 49 : $#files); foreach my $i (@files[0..$max]) { my $exif = getjhead("$root/$i"); my $cdata = parse_comment($exif->{'Comment'}); my @comments = map { chomp; $_ } split(/^/,$exif->{'Comment'}); print "\t\t\n"; print "\t\t\t",htmlescape($cdata->{subject}),"\n"; print "\t\t\t${rssurl}index.pl/$i\n"; print "\t\t\t${rssurl}index.pl/$i\n"; $i =~ s/\.thm$/.jpg/; print "\t\t\t",htmlescape("\n

\n"),htmlescape($cdata->{data}),"\n"; print "\t\t\n"; } print "\t\n"; print "\n"; } # this function is crap. sub urlescape { local $_ = shift; s/ /%20/g; return $_; } sub htmlescape { map { s/&/&/g; s//>/g; s/"/"/g; $_; } @_; }