X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=hacks%2Fwebcollage;h=880dfb933f6125a3d9494783765932e19616a830;hb=0316d74da7982288abddd34e7a62698eb7f79965;hp=2a727006d90446729e39e1df73dfb05972e322b4;hpb=5832fe184606766fef23369159306c0a5799aeb0;p=xscreensaver diff --git a/hacks/webcollage b/hacks/webcollage index 2a727006..880dfb93 100755 --- a/hacks/webcollage +++ b/hacks/webcollage @@ -27,7 +27,7 @@ require POSIX; use Fcntl ':flock'; # import LOCK_* constants -my $version = q{ $Revision: 1.36 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; +my $version = q{ $Revision: 1.44 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/; my $copyright = "WebCollage $version, Copyright (c) 1999" . " Jamie Zawinski \n" . " http://www.jwz.org/xscreensaver/\n"; @@ -36,15 +36,15 @@ my $argv0 = $0; my $progname = $argv0; $progname =~ s@.*/@@g; my $random_redirector = "http://random.yahoo.com/bin/ryl"; -my $image_randomizer_1 = "http://image.altavista.com/cgi-bin/avncgi" . - "?do=3" . - "&verb=n" . - "&oshape=n" . - "&oorder=" . - "&ophoto=1&oart=1&ocolor=1&obw=1" . +my $image_randomizer_1 = "http://www.altavista.com/query" . + "?mmdo=3" . + "&nbq=12" . "&stype=simage" . - "&oprem=0" . - "&query="; + "&iclr=1" . + "&ibw=1" . + "&iexc=1" . + "&what=web" . + "&q="; my $image_randomizer_2 = "http://www.hotbot.com/?clickSrc=search" . "&submit=SEARCH&SM=SC&LG=any" . "&AM0=MC&AT0=words&AW0=" . @@ -56,9 +56,13 @@ my $image_randomizer_2 = "http://www.hotbot.com/?clickSrc=search" . "&MT="; my $image_randomizer_3 = "http://www.altavista.com/cgi-bin/query?pg=q" . "&text=yes&kl=XX&stype=stext&q="; -my $photo_randomizer = "http://albums.photopoint.com/j/View?u=1&a=1&p="; -my $photo_randomizer_lo = 10000001; -my $photo_randomizer_hi = 12400000; + +# I guess Photopoint got wise to me, because now they are doing error +# checking on the user ("u=") and album ("a=") parameters. Oh well. +# +#my $photo_randomizer = "http://albums.photopoint.com/j/View?u=1&a=1&p="; +#my $photo_randomizer_lo = 10000001; +#my $photo_randomizer_hi = 12400000; my $image_ppm = ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp") . "/webcollage." . $$; my $image_tmp1 = $image_ppm . "-1"; @@ -71,10 +75,11 @@ my $http_proxy = undef; my $http_timeout = 30; my $cvt_timeout = 10; -# if we have xli, use it to write to the root window. else use xv. -my $ppm_to_root_window_cmd_1 = "xli -quiet -onroot -center" . +# programs we can use to write to the root window (tried in ascending order.) +my $ppm_to_root_window_cmd_1 = "xloadimage -onroot -quiet %%PPM%%"; +my $ppm_to_root_window_cmd_2 = "xli -quiet -onroot -center" . " -border black %%PPM%%"; -my $ppm_to_root_window_cmd_2 = "xv -root -rmode 5 -viewonly" . +my $ppm_to_root_window_cmd_3 = "xv -root -rmode 5 -viewonly" . " +noresetroot %%PPM%% -quit"; my $ppm_to_root_window_cmd = undef; # initialized by x_output() @@ -158,6 +163,9 @@ sub get_document_1 { $paddr = sockaddr_in($port2, $iaddr); + my $head = ""; + my $body = ""; + @_ = eval { local $SIG{ALRM} = sub { @@ -187,16 +195,14 @@ sub get_document_1 { $cookie = "AV_ALL=1"; } - print S ("GET " . ($http_proxy ? $url : "/$path") . " HTTP/1.0\n" . - "Host: $them\n" . - "User-Agent: $progname/$version\n" . - ($referer ? "Referer: $referer\n" : "") . - ($cookie ? "Cookie: $cookie\n" : "") . - "\n"); + print S ("GET " . ($http_proxy ? $url : "/$path") . " HTTP/1.0\r\n" . + "Host: $them\r\n" . + "User-Agent: $progname/$version\r\n" . + ($referer ? "Referer: $referer\r\n" : "") . + ($cookie ? "Cookie: $cookie\r\n" : "") . + "\r\n"); my $http = ; - my $head = ""; - my $body = ""; while () { $head .= $_; last if m@^[\r\n]@; @@ -216,6 +222,8 @@ sub get_document_1 { die if ($@ && $@ ne "alarm\n"); # propagate errors if ($@) { # timed out + $head = undef; + $body = undef; return (); } else { # didn't @@ -282,11 +290,13 @@ sub get_document { print STDERR "$progname: too many redirects " . "($max_loop_count) from $orig_url\n"; } + $body = undef; return (); } } elsif ( $http =~ m@HTTP/[0-9.]+ [4-9][0-9][0-9]@ ) { # http errors -- return nothing. + $body = undef; return (); } else { @@ -369,6 +379,8 @@ sub pick_image_from_body { " \"$url\": rejecting.\n"; } $rejected_urls{$url} = -1; + $body = undef; + $_ = undef; return (); } @@ -391,6 +403,8 @@ sub pick_image_from_body { " length $L in $url: rejecting.\n"; } $rejected_urls{$url} = $L; + $body = undef; + $_ = undef; return (); } elsif ( $verbose > 2 ) { print STDERR "$progname: keywords of length $L" . @@ -489,6 +503,9 @@ sub pick_image_from_body { } } + $_ = undef; + $body = undef; + if ( $#urls == 0 ) { if ( $verbose > 2 ) { print STDERR "$progname: no images on $base\n"; @@ -523,8 +540,12 @@ sub pick_from_url_randomizer { my ( $base, $body ) = get_document ($random_redirector, undef, $timeout); - return if (!$base || !$body); + if (!$base || !$body) { + $body = undef; + return; + } my $img = pick_image_from_body ($base, $body); + $body = undef; if ($img) { return ($base, $img, "yahoo"); @@ -544,6 +565,10 @@ sub random_word { $word = ; # toss partial line $word = ; # keep next line } + if (!$word) { + seek( IN, 0, 0 ); + $word = ; + } close (IN); } @@ -559,6 +584,10 @@ sub random_word { $word =~ s/izes$/ize/; $word =~ tr/A-Z/a-z/; + if ( $word =~ s/[ \t\n\r]/\+/g ) { # convert intra-word spaces to "+". + $word = "\%22$word\%22"; # And put quotes (%22) around it. + } + return $word; } @@ -602,7 +631,10 @@ sub pick_from_image_randomizer { my ( $base, $body ) = get_document ($search_url, undef, $timeout); if (defined ($timeout)) { $timeout -= (time - $start); - return () if ($timeout <= 0); + if ($timeout <= 0) { + $body = undef; + return (); + } } return () if (! $body); @@ -626,9 +658,11 @@ sub pick_from_image_randomizer { my $href_count = 0; $_ = $body; - s/[\r\n\t ]+/ /g; - s/Result Pages:.*$//; # trim off page footer + s/Result [Pp]ages:.*$//s; # trim off page footer + s/^.*?IMAGE RESULTS//s; # trim off page header + + s/[\r\n\t ]+/ /g; s/( $output"))) { $timed_out = 0; alarm $cvt_timeout; print PIPE $body; + $body = undef; close PIPE; if ($verbose > 3) { print STDERR "$progname: awaiting $pid\n"; } @@ -1026,10 +1078,12 @@ sub image_to_pnm { die if ($@ && $@ ne "alarm\n"); # propagate errors if ($@) { # timed out + $body = undef; return (); } else { # didn't alarm 0; + $body = undef; return @_; } } @@ -1038,8 +1092,10 @@ sub x_output { my $win_cmd_1 = $ppm_to_root_window_cmd_1; my $win_cmd_2 = $ppm_to_root_window_cmd_2; + my $win_cmd_3 = $ppm_to_root_window_cmd_3; $win_cmd_1 =~ s/^([^ \t\r\n]+).*$/$1/; $win_cmd_2 =~ s/^([^ \t\r\n]+).*$/$1/; + $win_cmd_3 =~ s/^([^ \t\r\n]+).*$/$1/; # make sure the various programs we execute exist, right up front. foreach ("ppmmake", "giftopnm", "djpeg", "pnmpaste", "pnmscale", @@ -1051,8 +1107,10 @@ sub x_output { $ppm_to_root_window_cmd = $ppm_to_root_window_cmd_1; } elsif (which($win_cmd_2)) { $ppm_to_root_window_cmd = $ppm_to_root_window_cmd_2; - } else { - die "$progname: neither $win_cmd_1 nor $win_cmd_2 found on \$PATH.\n"; + } elsif (which($win_cmd_3)) { + $ppm_to_root_window_cmd = $ppm_to_root_window_cmd_3; + } else { + die "$progname: didn't find $win_cmd_1, $win_cmd_2, or $win_cmd_3 on \$PATH.\n"; } $SIG{HUP} = \&x_cleanup; @@ -1070,6 +1128,9 @@ sub x_output { which ($_) || die "$progname: $_ not found on \$PATH.\n"; $_ = `$_`; ($img_width, $img_height) = m/dimensions: *(\d+)x(\d+) /; + if (!defined($img_height)) { + die "$progname: xdpyinfo failed.\n"; + } } my $bgcolor = "#000000"; @@ -1134,6 +1195,7 @@ sub x_output { $cmd .= "pnmpaste - $x $y $image_ppm > $image_tmp1"; open (IMG, "| $cmd") || die ("running $cmd: $!\n"); print IMG $body; + $body = undef; close (IMG); if ($verbose > 1) { print STDERR "$progname: subproc exited normally.\n"; @@ -1148,6 +1210,7 @@ sub x_output { my ($headers, $body) = get_document ($img, $base); if ($body) { handle_image ($base, $img, $body, $source); + $body = undef; } } unlink $image_tmp1, $image_tmp2; @@ -1163,6 +1226,7 @@ sub handle_image { } my ($iw, $ih) = image_to_pnm ($img, $body, $image_tmp1); + $body = undef; return 0 unless ($iw && $ih); my $ow = $iw; # used only for error messages @@ -1471,7 +1535,7 @@ sub main { if (!$root_p && !$no_output_p) { die "$copyright" . - "$progname: the -root argument is manditory (for now.)\n"; + "$progname: the -root argument is mandatory (for now.)\n"; } if (!$no_output_p && !$ENV{DISPLAY}) {