Xscreensaver mit Internet-Fotogalerie
Es gibt für diverse Betriebssysteme Bildschirmschoner, die Bilder aus Ordnern anzeigen und zufällig durchschalten. Der einfache von Windows tut seine Arbeit mal gerade so, es gibt dort noch einen schöneren von Google, der ein wenig herumzoomt und weiche Übergänge hat. Auch auf MacOS X gibt es solche Bildschirmschoner und - wie soll es anders sein - natürlich auch für Linux.
Es ist das glslideshow Modul des Xscreensavers, das mit ins Auge gefallen ist. Allerdings war mir die Darstellung von Bildern, die ich auf meinem eigenen Rechner habe, zu doof, denn: Die kenne ich doch bereits, wie langweilig.
Was ich wollte, war der gleiche Bildschirmschoner, aber mit Bildern aus Internet-Bildergalerien wie Fotocommunity.de oder anderen.
Nach ein wenig Basteln habe ich auch gefunden, wo ich überhaupt ansetzen muss. Genialerweise ist der Script, der die Bilder heraussucht und zurückgibt, welches Bild als nächstes genommen werden soll, kein C-Code, sondern einfacher Perl-Script.
Nach kurzer Einarbeitung in Perl und einem Script, der das, was ich will, schon mit Flickr-Bildern macht, hatte ich dann die Lade-Funktion umgeschrieben.
Ich brauchte jetzt noch einen Script, der mir ein Bild gibt, denn ich wollte das Webseiten analysieren und Bild auswählen nicht mit dem Perl-Script machen, dafür hab ich zuwenig Erfahrung in Perl (bin für Umsetzungen offen! Bitte als Kommentar anhängen).
Jedenfalls habe ich dann noch einen PHP-Script geschrieben, der mir aus einer Galerie aus der Fotocommunity ein Bild zufällig heraussucht und den Location-Header setzt, dass er auf das Bild zeigt.
Nach abschließendem gebastel an der Verwaltung der heruntergeladenen Dateien war es dann fertig und funktionierte zufriedenstellend.
Wenn ihr andere Webseiten-analyse-Scripts baut, schickt sie mir zu und ich veröffentliche sie hier, so kann man viel mehr Quellgalerien auswählen als nur die Fotocommunity!
/usr/bin/xscreensaver-getimage-file
$phpscripturl muss auf eine Adresse zeigen, an der ein Script zu finden ist, der einen Locationheader oder das Bild selber zurückgibt. Natürlich kann das auch auf ein Bild zeigen, aber das wäre ja langweilig (es sei denn es ist ein Webcam-Bild oder so... die Möglichkeiten sind gigantisch! 
#!/usr/bin/perl -w
# Copyright © 2001-2006 Jamie Zawinski <jwz@jwz.org>.
#
# Permission to use, copy, modify, distribute, and sell this software and its
# documentation for any purpose is hereby granted without fee, provided that
# the above copyright notice appear in all copies and that both that
# copyright notice and this permission notice appear in supporting
# documentation. No representations are made about the suitability of this
# software for any purpose. It is provided "as is" without express or
# implied warranty.
#
# This program chooses a random file from under the given directory, and
# prints its name. The file will be an image file whose dimensions are
# larger than a certain minimum size.
#
# The various xscreensaver hacks that manipulate images ("jigsaw", etc.) get
# the image to manipulate by running the "xscreensaver-getimage" program.
#
# Under X11, the "xscreensaver-getimage" program invokes this script,
# depending on the value of the "chooseRandomImages" and "imageDirectory"
# settings in the ~/.xscreensaver file (or .../app-defaults/XScreenSaver).
#
# Under Cocoa, this script lives inside the .saver bundle, and is invoked
# directly from utils/grabclient.c.
#
# Created: 12-Apr-01.
require 5;
use diagnostics;
use strict;
use LWP::UserAgent;
use File::Temp ();
my $progname = $0; $progname =~ s@.*/@@g;
my $version = q{ $Revision: 1.25 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
my $verbose = 0;
# Whether to use MacOS X's Spotlight to generate the list of files.
# When set to -1, uses Spotlight if "mdfind" exists.
#
# (In my experience, this isn't actually any faster, and might not find
# everything if your Spotlight index is out of date, which happens often.)
#
my $use_spotlight_p = 0;
# Whether to cache the results of the last run.
#
my $cache_p = 1;
### ZWISCHEN DIESEN BEIDEN KOMMENTAREN WIRD GEBASTELT :-]
# URL des php-scripts. Ausgabe muss ein Bild sein
my $phpscripturl = "http://www.MEINESEITE.de/galeriegrabber.php";
sub find_random_file($) {
# Temporäres Verzeichnis anlegen, falls es noch nicht existiert
if(! -d File::Spec->tmpdir() . '/xscreentemp') {
mkdir File::Spec->tmpdir() . '/xscreentemp';
}
# Verzeichnis leeren
unlink glob(File::Spec->tmpdir() . '/xscreentemp/xscreen*.jpg');
my $ua = LWP::UserAgent->new;
# Hole mir das Bild (in Wirklichkein wird ein Location Header gesendet, Perl ist aber so intelligent und setzt den um)
my $res = $ua->get($phpscripturl);
if ($res->is_success) {
# Bild laden
my $fh = new File::Temp(DIR=>File::Spec->tmpdir() . '/xscreentemp',TEMPLATE=>'xscreenXXXXX',UNLINK=>0, SUFFIX=>'.jpg');
print $fh $res->content;
return $fh->filename;
} else {
print STDERR "could not GET $phpscripturl\n";
exit 1;
}
}
### ZWEITER KOMMENTAR
sub error($) {
my ($err) = @_;
print STDERR "$progname: $err\n";
exit 1;
}
sub usage {
print STDERR "usage: $progname [--verbose] directory\n" .
" Prints the name of a randomly-selected image file. The directory\n" .
" is searched recursively.\n";
exit 1;
}
sub main {
my $dir = undef;
while ($_ = $ARGV[0]) {
shift @ARGV;
if ($_ eq "--verbose") { $verbose++; }
elsif (m/^-v+$/) { $verbose += length($_)-1; }
elsif ($_ eq "--name") { } # ignored, for compatibility
elsif ($_ eq "--spotlight") { $use_spotlight_p = 1; }
elsif ($_ eq "--no-spotlight") { $use_spotlight_p = 0; }
elsif ($_ eq "--cache") { $cache_p = 1; }
elsif ($_ eq "--no-cache") { $cache_p = 0; }
elsif (m/^-./) { usage; }
elsif (!defined($dir)) { $dir = $_; }
else { usage; }
}
usage unless (defined($dir));
$dir =~ s@^~/@$ENV{HOME}/@s; # allow literal "~/"
if (! -d $dir) {
print STDERR "$progname: $dir: not a directory\n";
usage;
}
my $file = find_random_file ($dir);
print STDOUT "$file\n";
}
main;
exit 0;
galeriegrabber.php
Für andere Galerien eben passende Konstanten eintragen.
<?
// Script zum heraussuchen eines Bildes von der Fotocommunity
// ----------------------------------------------------------
// Konstanten
$einstieg = "http://www.fotocommunity.de/pc/pc/channel/2/extra/new/startpic/1";
$baseurl = "http://www.fotocommunity.de/pc/pc/channel/2/extra/new/startpic/";
// Erstmal Übersichts-Seite suchen
$seite1 = getpage($einstieg);
// Feststellen, wieviele Bilder es dort überhaupt gibt (lässt das erste und die letzten (bis zu 12) aus.
//href="http://www.fotocommunity.de/pc/pc/channel/2/extra/new/startpic/349"><font color=#AAAAAA>31</font>
preg_match_all("/href=\"([^\"]*?)\"><font color=#AAAAAA>(\d*?)</", $seite1, $treffer);
$maxpics = substr(strrchr($treffer[1][count($treffer[1])-1],'/'),1);
// Ein Bild aussuchen
$bildnr = rand(1,$maxpics);
// Bilddaten holen
$seite2 = getpage($baseurl . $bildnr);
// Alle Bilder rausgrabben + Infos
preg_match_all("/href=\"([^\"]*?)\"><img src=\"([^\"]*?)\" border=0 vspace=3 align=right/", $seite2, $treffer);
// Thumb-URL bereinigen
$bildurl = str_replace(array('.thumbs/','thumb_'),'',$treffer[2][0]);
header("Location: $bildurl");
exit();
// Einige Funktionen
function getpage($file_source) {
// Preparations
$file_source = str_replace(' ', '%20', html_entity_decode($file_source)); // fix url format
$content = ""; // Da gehts hin!
// Begin transfer
if (($rh = fopen($file_source, 'rb')) === FALSE) { return false; } // fopen() handles
while (!feof($rh)) {
$content .= fread($rh, 1024);
}
// Finished without errors
fclose($rh);
return $content;
}
?>
