Welcome, Guest. Please login or register.
Did you miss your activation email?

Author Topic: [DE] (solved) phyton sript zu live-wallpaper  (Read 6885 times)

Online ayla

  • User
  • Posts: 1.744
[DE] (solved) phyton sript zu live-wallpaper
« on: 2014/09/04, 17:18:23 »
Hallo,

ich hab' bei mir das "live-Wallpaper" laufen, welches normalerweise auch gut funktioniert.

Dies hier ist das script das die eigentliche Arbeit tut, also die Bilder holen und in einem Ordner ablegen wo sie von der "Diaschau" geholt werden:

Code: [Select]
#! /usr/bin/python
#PortalView Live Desktop Wallpaper, Version 1.5
#Created by GoldNugget / contact: michelle@goldnuggetwebs.com
#See readme for instructions
import cStringIO
import urllib
import Image
import time
while True:
    #file = urllib.urlopen('http://www.kaiserslautern.de/live_tools/webcam/cam2_r_640.jpg')
    file = urllib.urlopen('http://schulebza.selfhost.bz/GetImage.cgi?Size=1280x800')
    #file = urllib.urlopen('http://www.djk-landau.de/fileadmin/webcam/cam2-huge.jpg')
     #file = urllib.urlopen('http://www.nabu-nw.de/weinbiet/svga_links.jpg')
     
    im = cStringIO.StringIO(file.read())
    img = Image.open(im)   
    print img.format, img.size, img.mode
    if img.format == ('JPEG'):
        img.save('/home/cal/Bilder/current.jpg')
    elif img.format == ('PNG'):
        img.save('/home/cal/Bilder/current.png')
    elif img.format == ('GIF'):
        img.save('/home/cal/Bilder/current.gif')
    time.sleep(20)
Es geht noch weiter, es werden noch 2 andere Images geholt, aber das ist nur eine Wiederholung ab "file=urllib..."

Es gibt da nur ein Problem: Gelegentlich wird ein Image nicht korrekt übertragen, was dann dazu führt daß das Script abbricht und das letzte korrekte Image im Ordner bleibt, also die Diaschau nur noch ein Image zeigt.

Über Konsole aufgerufen gibts diese Fehlermeldung:

Quote
Traceback (most recent call last):
  File "Downloads/live_wallpaper/getbild.py", line 53, in <module>
    img.save('/home/cal/Bilder/current.jpg')
  File "/usr/lib/python2.7/dist-packages/PIL/Image.py", line 1631, in save
    self.load()
  File "/usr/lib/python2.7/dist-packages/PIL/ImageFile.py", line 218, in load
    raise IOError("image file is truncated (%d bytes not processed)" % len(b))
IOError: image file is truncated (28 bytes not processed)

Nun hab' ich absolut keine Ahnung von phyton...

Wäre es möglich das Script so abzuändern, daß, im Fall eines defekten Images, dieser Fehler abgefangen und das Image -oder das nächste- neu geladen wird oder einfach neu zum Schleifenanfang gesprungen?

Oder kann ich -das Script, sowie ein zweites für den zweiten Monitor, wird per bash-script beim KDE-Start gestartet- irgendwo (wo?) ein Fehlersignal bekommen mit dem ich wiederum das Start-script neu starten kann? hmm - ein script das regelmäßig nachschaut ob kein Fehler aufgetreten ist, bzw auf diesen Fehler wartet... dass recht einfache Start-script (unten) eventuell selbst erweitern?

Code: [Select]
#!/bin/bash

python /home/cal/Downloads/live_wallpaper/getpic.py & python /home/cal/Downloads/live_wallpaper/getbild.py

Für Denkanstöße dankbar
ayla


EDIT:

Ich versuche gerade herauszufinden ob ich mit der pid weiterkomme (leider ist meine verfügbare Zeit mal wieder um :( ).
Meine Idee ist ein "& pid$!" an den Aufruf anhängen und mit "ls /proc|grep $pid" nach dem noch Vorhandensein der pid zu schauen und falls negativ das script neu zu starten bzw eine Schleife daraus zu machen... Würde das so funktionieren?
« Last Edit: 2014/09/05, 18:15:21 by ayla »

Offline brummer

  • User
  • Posts: 276
    • http://guitarix.sourceforge.net/
Re: phyton sript zu live-wallpaper
« Reply #1 on: 2014/09/05, 14:26:40 »

Du kannst den Fehler abfangen, und z.b. ignorieren. Das ganze sieht dann so aus:

Code: [Select]
#! /usr/bin/python
#PortalView Live Desktop Wallpaper, Version 1.5
#Created by GoldNugget / contact: michelle@goldnuggetwebs.com
#See readme for instructions
import cStringIO
import urllib
import Image
import time
while True:
    #file = urllib.urlopen('http://www.kaiserslautern.de/live_tools/webcam/cam2_r_640.jpg')
    file = urllib.urlopen('http://schulebza.selfhost.bz/GetImage.cgi?Size=1280x800')
    #file = urllib.urlopen('http://www.djk-landau.de/fileadmin/webcam/cam2-huge.jpg')
     #file = urllib.urlopen('http://www.nabu-nw.de/weinbiet/svga_links.jpg')
    try:
        im = cStringIO.StringIO(file.read())
    except IOError:
        pass
    else:
        img = Image.open(im)   
        print img.format, img.size, img.mode
        if img.format == ('JPEG'):
            img.save('/home/cal/Bilder/current.jpg')
        elif img.format == ('PNG'):
            img.save('/home/cal/Bilder/current.png')
        elif img.format == ('GIF'):
            img.save('/home/cal/Bilder/current.gif')
        time.sleep(20)

Online ayla

  • User
  • Posts: 1.744
Re: phyton sript zu live-wallpaper
« Reply #2 on: 2014/09/05, 18:10:50 »
Danke brummer, das scheint zu funktionieren, zumindest hab' ich bis jetzt keine Hänger mehr

Aber kann das sein daß phyton ein wenig, -hmm- pedantisch ist?

Ich hatte die zusätzlichen Zeilen einfach abgetippt, und bekam nach dem Start zuerst eine Fehlermeldung: "IndentationError: unindent does not match any outer indentation level"
Googlen sagte mir dass es wohl Probleme mit Leerzeichen oder tabs gibt, also: Leerzeichen raus.
Danach hatte ich einen SyntaxError, nach Google sollten es fehlende Leerzeilen sein....

 Für mich sah das im Editor alles ziemlich gleich und wie Dein Text auch aus.

Erst als ich dann einfach den kopletten Text von Dir kopierte hat der Interpreter nicht mehr gemeckert

Jetzt wird mir auch klar warum ich eine Kamera an einer Stelle des scripts aktzeptiert bekomme wenn ich eine gesamte file = ...-Zeile da rein hänge und an einer anderen will es sie partout nicht nehmen...
 :)

Gruß
ayla

Offline brummer

  • User
  • Posts: 276
    • http://guitarix.sourceforge.net/
Re: (solved) phyton sript zu live-wallpaper
« Reply #3 on: 2014/09/05, 19:16:31 »
Quote
Aber kann das sein daß phyton ein wenig, -hmm- pedantisch ist?

Ich hatte die zusätzlichen Zeilen einfach abgetippt, und bekam nach dem Start zuerst eine Fehlermeldung: "IndentationError: unindent does not match any outer indentation level"
Googlen sagte mir dass es wohl Probleme mit Leerzeichen oder tabs gibt, also: Leerzeichen raus.
Danach hatte ich einen SyntaxError, nach Google sollten es fehlende Leerzeilen sein....

 Für mich sah das im Editor alles ziemlich gleich und wie Dein Text auch aus.

Ja, python besteht auf <tabs>, einfache leerzeichen am zeilenanfang werden nicht anerkannt/stören.
tabs definieren den anfang und das ende einer funktion.
also
function:
<tab>mach dies
<tab>mach das
<tab>function in der function:
<tab><tab>und mach das
<tab>und zurück in der ersten function
andere function:
<tab>und so weiter
Wenn man aber die erste hürde genommen hat, kann python schon spaß machen.

Online ayla

  • User
  • Posts: 1.744
Re: (solved) phyton sript zu live-wallpaper
« Reply #4 on: 2014/09/05, 19:28:21 »
Gut zu wissen, ich werd' in dem script wohl nicht zum letzten Mal rumgepfriemelt haben, dieses Wallpaper ist ausbaufähig :)

Danke und Gruß
ayla

EDIT:

Ha,das ist ja klasse:

Code: [Select]
cal@neskaya:~cal: python
Python 2.7.8 (default, Aug 18 2014, 10:01:58)
[GCC 4.9.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> help
Type help() for interactive help, or help(object) for help about object.
>>> help()

Welcome to Python 2.7!  This is the online help utility.

If this is your first time using Python, you should definitely check out
the tutorial on the Internet at http://docs.python.org/2.7/tutorial/.

Enter the name of any module, keyword, or topic to get help on writing
Python programs and using Python modules.  To quit this help utility and
return to the interpreter, just type "quit".

To get a list of available modules, keywords, or topics, type "modules",
"keywords", or "topics".  Each module also comes with a one-line summary
of what it does; to list the modules whose summaries contain a given word
such as "spam", type "modules spam".

help>
« Last Edit: 2014/09/05, 19:58:48 by ayla »

Online ayla

  • User
  • Posts: 1.744
Re: (solved) phyton sript zu live-wallpaper
« Reply #5 on: 2014/09/07, 11:08:30 »
Ich glaub ich nehm das "pedantisch" besser zurück.

Nachdem ich bei einem kompletten Ausfall der Internetverbindung feststellte daß dies das script weiterhin beendet, hab ich mir aus den im script vorhandenen Anweisungen, Deiner Abfangroutine und den von Dir genannten Regeln eine weitere Instanz eingebaut und damit -falls ich richtig vermute- gleichzeitig eine simple Überwachung meiner Internetverbindung gebastelt.

Testen der Änderung an der "img =" Zeile im interaktiven Modus, Einfügen der Konstruktion in's script, klappt. Das macht wirklich Spaß und schreit nach mehr :)

Code: [Select]
#! /usr/bin/python
#PortalView Live Desktop Wallpaper, Version 1.5
#Created by GoldNugget / contact: michelle@goldnuggetwebs.com
#See readme for instructions
import cStringIO
import urllib
import Image
import time
while True:
  try:
    #file = urllib.urlopen('http://www.kaiserslautern.de/live_tools/webcam/cam2_r_640.jpg')
    #file = urllib.urlopen('http://www.nature.nps.gov/air/webcams/parks/nacccam/washlarge.jpg')
    file = urllib.urlopen('http://www.opentopia.com/images/cams/world_sunlight_map_rectangular.jpg')
  except IOError:
    img = Image.open('/home/cal/screen1.jpg') #dies gibt ein Image das "Netz iss wech!" auf dem Schirm zeigt
    print img.format, img.size, img.mode
    img.save('/home/cal/Pictures/current.jpg')
  else: 
    try:
        im = cStringIO.StringIO(file.read())
    except IOError:
        pass
    else:
        img = Image.open(im)   
        print img.format, img.size, img.mode
        if img.format == ('JPEG'):
            img.save('/home/cal/Pictures/current.jpg')
        elif img.format == ('PNG'):
            img.save('/home/cal/Pictures/current.png')
        elif img.format == ('GIF'):
            img.save('/home/cal/Pictures/current.gif')
       
  time.sleep(20)   

Wobei ich -ahnungslos wie meistens- bis zum Eintritt des Gegenteils mal davon ausgehe daß ein verkrüppeltes, aber übertragenes Image beim ersten "try" noch keine Exception auslöst, sondern diese in dem Fall erst kommt wenn (file.read()) beim zweiten "try" einen Fehler feststellt?

Gruß
ayla

EDIT:

Für den, den's interessiert hier noch ein Abschnitt mit der Abfrage meiner eigenen Webcam im Heimnetz unter Benutzung von Username/password Authentizierung, adaptiert -hoffentlich einigermaßen richtig- von dieser Webseite:
http://www.voidspace.org.uk/python/articles/authentication.shtml

Man sollte ggf. die Warnung auf der Webseite beachten, sinngemäß etwa: Dies ist nur eine sehr simple Authentizierung, jeder der Deinen Traffic abhört und den Request Header sieht kann Deinen Usernamen und das Passwort daraus extrahieren.

Code: [Select]
import urllib2
import cStringIO
import urllib
import Image
import time
import sys
import re
import base64
from urlparse import urlparse
while True:
  try:
    theurl = 'http://192.168.178.31/jpg/image.jpg'
 
 
    username = 'admin'
    password = '123456'            # a very bad password

    req = urllib2.Request(theurl)

    base64string = base64.encodestring(
                '%s:%s' % (username, password))[:-1]
    authheader =  "Basic %s" % base64string
    req.add_header("Authorization", authheader)
    try:
      file = urllib2.urlopen(req)
      im = cStringIO.StringIO(file.read())
      img = Image.open(im)   
      print img.format, img.size, img.mode
      img.save('/home/cal/Bilder/current.jpg')
      time.sleep(20)
    except IOError, e:
      # here we shouldn't fail if the username/password is right
      print "Ist die Kamera an?"
  except IOError:
    pass


« Last Edit: 2014/09/07, 15:18:32 by ayla »