Wie ihr ja wisst, schaue ich gelegendlich mal bei diversen Webcams vorbei. Auch jetzt und immer noch speichere ich die Bilder automatisiert zwischen, um sie bei Zeiten nach Interessantem und Lustigem durchzusehen. Keine Bange, dies wird kein Bilderposting, nur um meinen Hitcounter hoch zu treiben, wie sonst immer, sondern ein Technikposting.
Ich möchte ganz gerne das letzte, jeweils aktuelle Bild meines Webcam-Archivs auf dem Desktop anzeigen. Dazu könnte ich natürlich GkrellM inklusive dem Plugin GKrellKam verwenden, aber da hätte ich wieder zwei Dinge mehr, die ich konfigurieren müsste.
Einfacher Etwas anders, und aber vor allem zu 100% anpassbar, da selbstgebaut, ist es da, das Webcambild mittels ImageMagick direkt auf das Wallpaper zu zeichnen, und das Wallpaper dann automatisiert als Hintergrund zu verwenden. Dank der Standard-Datenströme „stdin“ und „stdout“ ist dies sogar ohne temporäre Dateien möglich.
Mein Script besteht für die Anzeige des letzten Webcambildes aus zwei Teilen. Im ersten Teil wird das Bild geholt. Dies geschieht in mehreren Schritten …
WALLPAPER="/home/dirk/.wallpaper.png" BASEPATH="/media/archiv/Downloads/Webcam-Bilder/bremen vier - Webcam" FILEPATH=`ls "${BASEPATH}" -I "dummy" | tail -n1` LASTFILE=`ls "${BASEPATH}/${FILEPATH}" -I "dummy" | tail -n2 | head -n1` LASTFQFN="${BASEPATH}/${FILEPATH}/${LASTFILE}"
Zuerst wird die Wallpaper-Datei definiert. Das Bild, das ich als Wallpaper verwenden will, schreibe ich in die gleichnamige Variable. Ich könnte es auch direkt angeben, aber so ist es einfach leichter zu handhaben. BASEPATH definiert, welchen Grundpfad ich verwende. LASTPATH gibt mir das Letzte Tagesverzeichnis aus, und LASTFILE schließlich die vorletzte Bilddatei in diesem Verzeichnis.
Die vorletzte Datei, weil die letzte Datei eventuell gerade erst geschrieben wird, während dsScript sie holt, was darin resultiert, dass die Datei fehlerhaft ist. Und schließlich wird in LASTFQFN („Fully Qualified File Name“) der komplette Pfad zur letzten vorletzten Bilddatei zusammengesetzt.
Der zweite Teil des Scripts baut aus dieser Datei und der Wallpaper-Datei nun das eigentliche Wallpaper zusammen, und setzt es als eben dieses.
convert -geometry 200x -border 2 -bordercolor black "${LASTFQFN}" png:- \ | composite -geometry +1070+100 - "${WALLPAPER}" png:- \ | display -window root -
In der ersten Zeile wird das Webcam-Bild verkleinert und mit einem Rahmen versehen, mittels „png:-“ teile ich convert mit, das Ergebnis auf stdout auszugeben. Das ganze wird nun an composite weitergereicht, dass das Bild einliest („-“ = „lese von stdin“), und an der angegebenen Position auf das Wallpaper schreibt. Das Ergebnis davon wird nun wiederum an stdout ausgegeben.
Nun habe ich das Webcam-Bild und das Wallpaper-Bild vereint. Die Ausgabe wird per Pipe an display weitergereicht, was wiederum von stdin liest, und das ganze als Wallpaper („-window root“) setzt. Webcam-Bild, sowie Original-Wallpaper-Datei werden nicht angefasst.

Falls jemand fragen sollte: Mein Wallpaper (in Rohform) hier *g*
Natürlich kann auch eine andere Größe angegeben werden, dazu müssen einach nur die Parameter angepasst werden. Auch mehrere Webcam-Bilder sind möglich, und natürlich ist man auch nicht auf Webcam-Bilder festgenagelt, sondern kann jedes beliebige Bild verwenden. Wie wäre es z.B. mit einem zufälligen Bild?
BASEPATH="/home/dirk/Bilder" RANDFILE=`ls *.jpg | sort -R | head -n1` LASTFQFN="${BASEPATH}/${RANDFILE}"
Oder das tatsächliche Livebild einer Webcam? Dazu muss man sich natürlich eines Runterladeprogramms bedienen. wget bietet sich da ja an.
wget "http://example.com/webcambild" -O - \ | convert -geometry 200x -border 2 -bordercolor black - png:- \ | composite -geometry +1070+100 - "${WALLPAPER}" png:- \ | display -window root -
wget gibt den Kram, den es runterlädt nach stdout aus, convert liest von stdin, der Rest ist identisch.
Gut, aber was nützt das Script nun, wenn man es manuell aufrufen muss? Muss man ja zum Glück nicht. Cron hilft da weiter. Alles, was es bedarf, ist ein Eintrag in der crontab des Benutzers. Der Intervall sollte so gewählt sein, dass er etwas langsamer ist, als die Webcam (wenn man denn eine Webcam als Quelle will *g*). Cron kann maximal bis zu einer Minute Mindestintervall auflösen, für den Normalfall reicht das.
* * * * * DISPLAY=:0 /home/dirk/.scripts/wallpaper
Jetzt wird minütlich das Wallpaper nach Angabe im Script neu gesetzt. „DISPLAY=:0“ sorgt dafür, dass der Befehl im Kontext der aktuellen Grafischen Anzeige ausgeführt wird, da cron diesbezüglich ja komplett blind ist, und das Wallpaper sonst nicht gesetzt wird, da das Fenster mit der ID „root“ ja an den X-Server gebunden ist, und nicht an die Shell, in dessen Kontext der Cronjob ausgeführt wird.
Und schon habe ich die interessanteste Webcam auf dem Desktop.

