From 389e91af275abc46126350a3034881eda5a8dd91 Mon Sep 17 00:00:00 2001 From: Rico Schulte Date: Sun, 9 Sep 2007 10:41:05 +0000 Subject: [PATCH] add Webcam/Pictureviewer initial version --- webcamviewer/CONTROL/control | 10 + webcamviewer/Makefile.am | 1 + webcamviewer/src/Makefile.am | 5 + webcamviewer/src/PictureScreen.py | 95 +++++++ webcamviewer/src/WebcamViewConfig.py | 43 +++ webcamviewer/src/__init__.py | 0 webcamviewer/src/plugin.py | 519 +++++++++++++++++++++++++++++++++++ webcamviewer/src/webcam.xml | 295 ++++++++++++++++++++ 8 files changed, 968 insertions(+) create mode 100755 webcamviewer/CONTROL/control create mode 100755 webcamviewer/Makefile.am create mode 100755 webcamviewer/src/Makefile.am create mode 100755 webcamviewer/src/PictureScreen.py create mode 100755 webcamviewer/src/WebcamViewConfig.py create mode 100755 webcamviewer/src/__init__.py create mode 100755 webcamviewer/src/plugin.py create mode 100755 webcamviewer/src/webcam.xml diff --git a/webcamviewer/CONTROL/control b/webcamviewer/CONTROL/control new file mode 100755 index 0000000..4fcf9b8 --- /dev/null +++ b/webcamviewer/CONTROL/control @@ -0,0 +1,10 @@ +Package: enigma2-plugin-extensions-webcamviewer +Version: 1.1 +Description: view Pictures and Webcams on your TV Screen +Architecture: mipsel +Section: extra +Priority: optional +Maintainer: 3c5x9 <3c5x9@gmx.net> +Homepage: n/a +Depends: enigma2(>1.0cvs20070908), twisted-web +Source: http://enigma2-plugins.schwerkraft.elitedvb.net/ diff --git a/webcamviewer/Makefile.am b/webcamviewer/Makefile.am new file mode 100755 index 0000000..af437a6 --- /dev/null +++ b/webcamviewer/Makefile.am @@ -0,0 +1 @@ +SUBDIRS = src diff --git a/webcamviewer/src/Makefile.am b/webcamviewer/src/Makefile.am new file mode 100755 index 0000000..e3aeae9 --- /dev/null +++ b/webcamviewer/src/Makefile.am @@ -0,0 +1,5 @@ +installdir = /usr/lib/enigma2/python/Plugins/Extensions/WebcamViewer + +install_PYTHON = __init__.py plugin.py PictureScreen.py WebcamViewConfig.py + +install_DATA = webcam.xml diff --git a/webcamviewer/src/PictureScreen.py b/webcamviewer/src/PictureScreen.py new file mode 100755 index 0000000..caaa484 --- /dev/null +++ b/webcamviewer/src/PictureScreen.py @@ -0,0 +1,95 @@ +from enigma import loadPic +from enigma import eTimer + +from Screens.Screen import Screen +from Components.AVSwitch import AVSwitch +from Components.config import config +from Components.Pixmap import Pixmap +from Components.ActionMap import ActionMap +from twisted.web.client import downloadPage + +class PictureScreen(Screen): + skin = "" + prozessing =False # if fetching or converting is active + autoreload =False + def __init__(self, session,title,filename, slideshowcallback = None,args=0): + self.session=session + self.slideshowcallback=slideshowcallback + self.screentitle = title + self.skin = """ + + + """ % (filename) + Screen.__init__(self, session) + self.filename = filename + self["pixmap"] = Pixmap() + + self["actions"] = ActionMap(["WizardActions", "DirectionActions","ChannelSelectBaseActions","ShortcutActions"], + { + "ok": self.do, + "back": self.exit, + "green":self.AutoReloaderSwitch, + }, -1) + + self.onLayoutFinish.append(self.do) + + def AutoReloaderSwitch(self): + if self.filename.startswith("http") or self.filename.startswith("ftp"): + if self.autoreload is False: + self.autoreload = True + self.do() + else: + self.autoreload = False + + def do(self): + if self.prozessing: + pass + elif self.filename.startswith("http") or self.filename.startswith("ftp"): + self.fetchFile(self.filename) + else: + self.sourcefile = self.filename + self.setPicture(self.filename) + + def exit(self): + self.cleanUP() + self.close() + + def cleanUP(self): + try: + if os.path.exists("/tmp/loadedfile"): + os.remove("/tmp/loadedfile") + except:## OSerror?? + pass + + def fetchFile(self,url): + self.prozessing =True + self.setTitle("loading File") + print "fetching URL ",url + self.sourcefile = "/tmp/loadedfile" + downloadPage(url,self.sourcefile).addCallback(self.fetchFinished).addErrback(self.fetchFailed) + + + def fetchFailed(self,string): + print "fetch failed",string + self.setTitle( "fetch failed: "+string) + + def fetchFinished(self,string): + print "fetching finished " + self.setPicture(self.sourcefile) + + def setPicture(self,string): + self.setTitle(self.filename.split("/")[-1]) + pixmap = loadPic(string,720,576, AVSwitch().getAspectRatioSetting()/2,1, 0,1) + if pixmap is not None: + self["pixmap"].instance.setPixmap(pixmap) + self.prozessing =False + + if self.autoreload is True: + self.cleanUP() + self.do() + elif self.slideshowcallback is not None: + self.closetimer = eTimer() + self.closetimer.timeout.get().append(self.slideshowcallback) + print "waiting ",config.plugins.pictureviewer.slideshowtime.value," seconds for next picture" + self.closetimer.start(int(config.plugins.pictureviewer.slideshowtime.value)) + diff --git a/webcamviewer/src/WebcamViewConfig.py b/webcamviewer/src/WebcamViewConfig.py new file mode 100755 index 0000000..48b7c31 --- /dev/null +++ b/webcamviewer/src/WebcamViewConfig.py @@ -0,0 +1,43 @@ +from Screens.Screen import Screen +from Components.ConfigList import ConfigListScreen +from Components.Label import Label +from Components.config import config, getConfigListEntry +from Components.ActionMap import ActionMap + + +class WebcamViewerMenu(ConfigListScreen,Screen): + skin = """ + + + + + """ + def __init__(self, session, args = 0): + self.session = session + Screen.__init__(self, session) + self.list = [] + self.list.append(getConfigListEntry(_("Slideshow Time"), config.plugins.pictureviewer.slideshowtime)) + self.list.append(getConfigListEntry(_("Slideshow Mode"), config.plugins.pictureviewer.slideshowmode)) + ConfigListScreen.__init__(self, self.list) + self["buttonred"] = Label(_("cancel")) + self["buttongreen"] = Label(_("ok")) + self["setupActions"] = ActionMap(["SetupActions"], + { + "green": self.save, + "red": self.cancel, + "save": self.save, + "cancel": self.cancel, + "ok": self.save, + }, -2) + + def save(self): + print "saving" + for x in self["config"].list: + x[1].save() + self.close(True,self.session) + + def cancel(self): + print "cancel" + for x in self["config"].list: + x[1].cancel() + self.close(False,self.session) diff --git a/webcamviewer/src/__init__.py b/webcamviewer/src/__init__.py new file mode 100755 index 0000000..e69de29 diff --git a/webcamviewer/src/plugin.py b/webcamviewer/src/plugin.py new file mode 100755 index 0000000..609739c --- /dev/null +++ b/webcamviewer/src/plugin.py @@ -0,0 +1,519 @@ +from enigma import eListbox +from enigma import eListboxPythonMultiContent +from enigma import loadPic +from enigma import loadPNG +from enigma import gFont +### Picturelist +from Components.HTMLComponent import HTMLComponent +from Components.GUIComponent import GUIComponent +from Screens.Screen import Screen +from Screens.MessageBox import MessageBox +from Screens.InputBox import InputBox +from Screens.ChoiceBox import ChoiceBox +from Components.ActionMap import ActionMap, NumberActionMap +from Components.ScrollLabel import ScrollLabel +from Components.Label import Label +from Components.MenuList import MenuList +from Components.FileList import EXTENSIONS +## configmenu +from Components.config import config, ConfigSubsection,ConfigSelection,ConfigText,getConfigListEntry +from Components.ConfigList import ConfigListScreen +#### +from Components.Input import Input +from Components.Pixmap import Pixmap +from Plugins.Plugin import PluginDescriptor +### System +import os +import re +## XML +from pyexpat import ExpatError +import xml.dom.minidom +from Tools.XMLTools import mergeText, elementsWithTag + +### my +from WebcamViewConfig import WebcamViewerMenu +from PictureScreen import PictureScreen +### +myname = "Webcam/Picture Viewer" +myversion = "1.1" + + + +config.plugins.pictureviewer = ConfigSubsection() +config.plugins.pictureviewer.slideshowtime = ConfigSelection(default="5000", choices = [("5000", _("5 Sekunden")), ("10000", _("10 Sekunden")), ("20000", _("20 Sekunden")), ("60000", _("1 Minute"))]) +config.plugins.pictureviewer.slideshowmode = ConfigSelection(default="0", choices = [("0", _("normal")), ("1", _("endlos"))]) +#not editable configs +config.plugins.pictureviewer.slideshowext = ConfigText(default=".3ssl") +config.plugins.pictureviewer.matchingPattern = ConfigText(default="(?i)^.*\.(jpeg|jpg|jpe|png|bmp|gif)") +config.plugins.pictureviewer.slideshowdir = ConfigText(default="/media/hdd/slideshows/") +config.plugins.pictureviewer.rootdir = ConfigText(default="/media/") +SLIDESHOWMODE_NORMAL = 0 +SLIDESHOWMODE_REPEAT = 1 + + +def main1(session,**kwargs): + session.open(PictureViewer) + +def main2(session,**kwargs): + xmlfile = "/usr/lib/enigma2/python/Plugins/Extensions/WebcamViewer/webcam.xml" + if os.path.isfile(xmlfile): + try: + xmlnode = xml.dom.minidom.parse( open(xmlfile) ) + session.open(WebcamViewer,xmlnode.childNodes[1]) + except ExpatError,e: + session.open(MessageBox,_("Loading config file failed!\n\n%s"%e), MessageBox.TYPE_WARNING) + else: + session.open(MessageBox,_("Loading config file failed!\n\nconfigfile not found!"), MessageBox.TYPE_WARNING) + + +def Plugins(path,**kwargs): + p = [ + PluginDescriptor( + name="PictureViewer", + description="browse your local pictures", + where = PluginDescriptor.WHERE_PLUGINMENU, + fnc = main1 + ) + , + PluginDescriptor( + name="WebcamViewer", + description="view webcams around the world", + where = PluginDescriptor.WHERE_PLUGINMENU, + fnc = main2 + ) + ] + return p + + + + +################### +class Slideshow: + filelist=[] + currentslideshowitem =0 + wbviewer = False + def __init__(self,session,callback): + self.session = session + self.callback = callback + def setfiles(self,filelist): + self.filelist = filelist + + def start(self): + if len(self.filelist)>0: + self.currentslideshowitem = -1 + self.nextSlideshowItem() + + def nextSlideshowItem(self): + if self.currentslideshowitem is not (len(self.filelist)-1): + self.currentslideshowitem = self.currentslideshowitem+1 + filetoshow = self.filelist[self.currentslideshowitem][1] + if self.wbviewer is False: + self.wbviewer = self.session.openWithCallback(self.cb,PictureScreen,filetoshow.split("/")[-1],filetoshow,slideshowcallback=self.nextSlideshowItem) + else: + self.wbviewer.filename = filetoshow + self.wbviewer.do() + elif self.currentslideshowitem is (len(self.filelist)-1) and int(config.plugins.pictureviewer.slideshowmode.value) is SLIDESHOWMODE_REPEAT: + print "["+myname+"] restarting slideshow" + self.start() + else: + print "["+myname+"] slideshow finished" + self.wbviewer.exit() + self.cb() + def cb(self): + self.callback() +################### +class PictureViewer(Screen): + skin = "" + filelist = [] + currList = "slideshowlist" + wbviewer = False + loadedslideshowlistlistname = False + def __init__(self, session, args = 0): + self.session = session + s = "\n" %config.plugins.pictureviewer.rootdir.value + s = s+"\n" + s = s+"\n" + s = s+"\n" + s = s+"\n" + s = s+"\n" + s = s+"\n" + s = s+"\n" + self.skin = s+"" + Screen.__init__(self, session) + self.filelist = PictureList(config.plugins.pictureviewer.rootdir.value, matchingPattern = config.plugins.pictureviewer.matchingPattern.value) + self["menu"] = self.filelist + self.preview = Pixmap() + self["pixmap"] = self.preview + self.slideshowfiles = [] + self.slideshowlist =MenuList(self.slideshowfiles) + self["slist"] = self.slideshowlist + self["buttonred"] = Label("") + self["buttongreen"] = Label("") + self["buttonyellow"] = Label("") + self["buttonblue"] = Label("") + self["actions"] = ActionMap(["WizardActions","MenuActions", "DirectionActions","ShortcutActions"], + { + "ok": self.go, + "back": self.close, + "menu": self.openMenu, + "up": self.up, + "down": self.down, + "left": self.leftUp, + "right": self.rightUp, + "red": self.KeyRed, + "green": self.KeyGreen, + "yellow": self.KeyYellow, + "blue": self.switchList, + }, -1) + self.onLayoutFinish.append(self.switchList) + self.onLayoutFinish.append(self.updateInfoPanel) + def KeyGreen(self): + if self.currList is "filelist" : + ## adding all files in current dir to slideshowlist + dirname = self["menu"].getCurrentDir() + if os.path.isdir(dirname): + s = os.listdir(dirname) + s.sort() + for file in s: + if re.compile(config.plugins.pictureviewer.matchingPattern.value).search(dirname+file): + self.slideshowfiles.append((_(file),dirname+file)) + self["slist"].l.setList(self.slideshowfiles) + + else: + #loading list + list = [] + try: + for file in os.listdir(config.plugins.pictureviewer.slideshowdir.value): + if file.endswith(config.plugins.pictureviewer.slideshowext.value): + list.append((_(file.split("/")[-1]),file)) + self.session.openWithCallback(self.fileToLoadFilelistEntered,ChoiceBox,_("select List to load"),list) + except IOError,e: + print "["+myname+"] IOError:",e + except OSError,e: + print "["+myname+"] OSError:",e + + def KeyRed(self): + if self.currList is "filelist" : + #do slideshow + self.hide() + x = Slideshow(self.session,self.show) + x.setfiles(self.slideshowfiles) + x.start() + else: + # save filelist + if self.loadedslideshowlistlistname is False: + newname = "slideshowlist" + else: + newname = self.loadedslideshowlistlistname + self.session.openWithCallback(self.fileToSaveFilelistEntered,InputBox, title=_("Enter filename to save the List:"), text=newname, maxSize=False, type=Input.TEXT) + + def fileToLoadFilelistEntered(self,fileselection): + if fileselection is not None: + try: + filename = fileselection[1] + fp = open(config.plugins.pictureviewer.slideshowdir.value+filename) + list = [] + for x in fp.readlines(): + file = x.replace("\n","") + if x.startswith("#"): + pass + elif os.path.exists(file) is not True: + print "["+myname+"] loaded file from filelist isnt avaible! ignoreing ->",file + else: + list.append((_(file.split("/")[-1]),file)) + self.slideshowfiles =list + self["slist"].l.setList(self.slideshowfiles) + self.loadedslideshowlistlistname = filename.replace(config.plugins.pictureviewer.slideshowext.value,"") + except IOError,e: + print "["+myname+"] error:",e + + def fileToSaveFilelistEntered(self,filename): + if filename is not None: + print "["+myname+"] saving list to ",config.plugins.pictureviewer.slideshowdir.value+filename+config.plugins.pictureviewer.slideshowext.value + try: + if os.path.exists(config.plugins.pictureviewer.slideshowdir.value) is not True: + print "+"*10,os.path.basename(filename) + os.mkdir(config.plugins.pictureviewer.slideshowdir.value) + fp = open(config.plugins.pictureviewer.slideshowdir.value+filename+config.plugins.pictureviewer.slideshowext.value,"w") + fp.write("# this is a slideshow file for "+myname+" made by V"+myversion+"\n") + fp.write("# you can make your own... each line with full path of the imagefile\n") + fp.write("# by importing this file,we will ignoring a file if is doesnt exist\n") + for x in self.slideshowfiles: + fp.write(x[1]+"\n") + fp.close() + except IOError,e: + print "["+myname+"] error:",e + def KeyYellow(self): + if self.currList is "filelist" : + # add picture to list + fullfile = self["menu"].getSelection()[0] + if os.path.isfile(fullfile): + self.slideshowfiles.append((_(fullfile.split("/")[-1]),fullfile)) + self["slist"].l.setList(self.slideshowfiles) + else: + # deleting an Picture + if len(self.slideshowfiles) >=1: + indexinlist = self["slist"].l.getCurrentSelectionIndex() + self.slideshowfiles.pop(indexinlist) + self["slist"].l.setList(self.slideshowfiles) + + def switchList(self): + if self.currList is "filelist" : + # Slideshow activieren + self.filelist.selectionEnabled(0) + self.slideshowlist.selectionEnabled(1) + self["buttonred"].setText("speichern") + self["buttongreen"].setText("laden") + self["buttonyellow"].setText("loeschen") + self["buttonblue"].setText("Dateien") + self.currList = "slideshowlist" + else: + # filelist activieren + self.filelist.selectionEnabled(1) + self.slideshowlist.selectionEnabled(0) + self["buttonred"].setText("starte Slideshow") + self["buttongreen"].setText("alle hinzufuegen") + self["buttonyellow"].setText("hinzufuegen") + self["buttonblue"].setText("Slideshow bearbeiten") + self.currList = "filelist" + + def go(self): + if self.currList is "filelist" : + selection = self["menu"].getSelection() + if self.filelist.canDescent(): + self.setTitle(selection[0]) + self.filelist.descent() + else: + if selection[1] == True: # isDir + pass + else: + print "["+myname+"] file selected ",selection[0] + if os.path.isfile(selection[0]): + self.session.open(PictureScreen,selection[0].split("/")[-1],selection[0]) + else: + print "["+myname+"] file not found " + selection[0]+"" + else: + self.updateInfoPanel() + def up(self): + if self.currList is "filelist" : + self.filelist.up() + self.updateInfoPanel() + else: + self.slideshowlist.up() + def leftUp(self): + if self.currList is "filelist" : + self.filelist.pageUp() + self.updateInfoPanel() + else: + self.slideshowlist.pageUp() + def rightUp(self): + if self.currList is "filelist" : + self.filelist.pageDown() + self.updateInfoPanel() + else: + self.slideshowlist.pageDown() + def down(self): + if self.currList is "filelist" : + self.filelist.down() + self.updateInfoPanel() + else: + self.slideshowlist.down() + + def updateInfoPanel(self): + if self.currList is "filelist" : + selectedfile = self["menu"].getSelection()[0] + else: + selectedfile = self["slist"].l.getCurrentSelection()[1] + pixmap = loadPic(selectedfile, 275,200, 1,1, 0,1) + if pixmap is not None: + self["pixmap"].instance.setPixmap(pixmap.__deref__()) + self["pixmap"].move(275,0) + else: + pass + + def output(self,str): + print "+"*10,str + def openMenu(self): + self.session.open(WebcamViewerMenu) +################### +class WebcamViewer(Screen): + skin = "" + filelist = [] + def __init__(self, session,xmlnode, args = 0): + self.xmlnode = xmlnode + screen_x = 736 + screen_y = 576 + size_x = 350 + size_y = 250 + pos_x = (screen_x/2)-(size_x/2) + pos_y = (screen_y/2)-(size_y/2) + self.session = session + self.skin = """ + + + """ % (pos_x,pos_y,size_x,size_y,myname,size_x,size_y) + Screen.__init__(self, session) + self.filelist = MenuList(self.getMenuData()) + self["menu"] = self.filelist + self["actions"] = ActionMap(["WizardActions", "DirectionActions"], + { + "ok": self.go, + "back": self.close, + }, -1) + self.onLayoutFinish.append(self.settingTitle) + + def settingTitle(self): + self.setTitle(myname+": "+self.menutitle) + + def go(self): + selected = self["menu"].l.getCurrentSelection()[1] + menuitemtitle = self["menu"].l.getCurrentSelection()[0] + type = selected[0] + data = selected[1] + if type.startswith("cam"): + self.session.open(PictureScreen,menuitemtitle,data) + else: + self.hide() + self.session.openWithCallback(self.cb,WebcamViewer,data) + + def cb(self): + self.show() + + def getMenuData(self): + xloader = XMLloader() + self.menutitle = xloader.getScreenXMLTitle(self.xmlnode) + data =[] + for node in elementsWithTag(self.xmlnode._get_childNodes(), 'menu'): + nodex={} + nodex['name'] = xloader.get_txt( node, "name", "no name" ) + data.append((_("*"+nodex['name']),["node",node])) + + for node2 in elementsWithTag(self.xmlnode._get_childNodes(), 'cam'): + nodex={} + nodex['name'] = xloader.get_txt( node2, "name", "no name" ) + nodex['url'] = xloader.get_txt( node2, "url", "no url" ) + data.append((_(nodex['name']),["cam",nodex['url']])) + return data +################### + +################## +class PictureList(MenuList, HTMLComponent, GUIComponent): + def __init__(self, directory, matchingPattern = None): + GUIComponent.__init__(self) + self.l = eListboxPythonMultiContent() + self.showDirectories = True + self.showFiles = True + self.isTop = False + self.matchingPattern = matchingPattern + self.changeDir(directory) + self.l.setFont(0, gFont("Regular", 18)) + self.currentDir = directory + + def getCurrentDir(self): + return self.currentDir + + def getSelection(self): + return self.l.getCurrentSelection()[0] + + def getFileList(self): + return self.list + + def changeDir(self, directory): + self.currentDir = directory + self.list = [] + + directories = [] + files = [] + files = os.listdir(directory) + files.sort() + tmpfiles = files[:] + for x in tmpfiles: + if os.path.isdir(directory +"/"+ x): + directories.append(x) + files.remove(x) + directories.sort() + files.sort() + if directory != "/" and self.showDirectories and not self.isTop: + self.list.append(self.getPictureEntryComponent("..",'/'.join(directory.split('/')[:-2]) + '/',True)) + + if self.showDirectories: + for x in directories: + name = (directory+x).split('/')[-1] + self.list.append(self.getPictureEntryComponent(name,'/'.join(directory.split('/')[:-1]) + '/'+x+'/',True)) + + if self.showFiles: + for x in files: + path = directory + x + name = x + if self.matchingPattern is not None: + if re.compile(self.matchingPattern).search(path): + self.list.append(self.getPictureEntryComponent(name,path ,False)) + else: + pass + + self.l.setList(self.list) + + def canDescent(self): + return self.getSelection()[1] + + def descent(self): + self.changeDir(self.getSelection()[0]) + + def getFilename(self): + return self.getSelection()[0].getPath() + + def getServiceRef(self): + return self.getSelection()[0] + + GUI_WIDGET = eListbox + + def postWidgetCreate(self, instance): + instance.setContent(self.l) + instance.setItemHeight(23) + + def getPictureEntryComponent(self,name, absolute, isDir): + """ name={angezeigter Name}, absolute={vollstaendiger Pfad}, isDir={True,False} """ + res = [ (absolute, isDir) ] + res.append((eListboxPythonMultiContent.TYPE_TEXT, 35, 1, 200, 20, 0, 0, name)) + if isDir: + png = loadPNG("/usr/share/enigma2/extensions/directory.png") + else: + extension = name.split('.') + extension = extension[-1].lower() + if EXTENSIONS.has_key(extension): + png = loadPNG("/usr/share/enigma2/extensions/" + EXTENSIONS[extension] + ".png") + else: + png = None + if png is not None: + res.append((eListboxPythonMultiContent.TYPE_PIXMAP_ALPHATEST, 10, 2, 20, 20, png)) + return res + + +################## +class XMLloader: + DEFAULT_NAMESPACES = ( + None, # RSS 0.91, 0.92, 0.93, 0.94, 2.0 + 'http://purl.org/rss/1.0/', # RSS 1.0 + 'http://my.netscape.com/rdf/simple/0.9/' # RSS 0.90 + ) + DUBLIN_CORE = ('http://purl.org/dc/elements/1.1/',) + def getElementsByTagName( self, node, tagName, possibleNamespaces=DEFAULT_NAMESPACES ): + for namespace in possibleNamespaces: + children = node.getElementsByTagNameNS(namespace, tagName) + if len(children): return children + return [] + + def node_data( self, node, tagName, possibleNamespaces=DEFAULT_NAMESPACES): + children = self.getElementsByTagName(node, tagName, possibleNamespaces) + node = len(children) and children[0] or None + return node and "".join([child.data.encode("utf-8") for child in node.childNodes]) or None + + def get_txt( self, node, tagName, default_txt="" ): + """ + Liefert den Inhalt >tagName< des >node< zurueck, ist dieser nicht + vorhanden, wird >default_txt< zurueck gegeben. + """ + return self.node_data( node, tagName ) or self.node_data( node, tagName, self.DUBLIN_CORE ) or default_txt + + def getScreenXMLTitle( self,node ): + return self.get_txt( node, "name", "no title" ) diff --git a/webcamviewer/src/webcam.xml b/webcamviewer/src/webcam.xml new file mode 100755 index 0000000..ea12595 --- /dev/null +++ b/webcamviewer/src/webcam.xml @@ -0,0 +1,295 @@ + + + + Mainmenu + + Webcam + + Amerika + + USA Westkueste + + Santa Monica Pier + http://www.westland.net/photo/file02.jpg + + + Venice Beach + http://www.westland.net/photo/file01.jpg + + + Pacific Palisades Bay + http://www.westland.net/photo/file01.jpg + + + Pacific Coast HWY + http://www.livinginthepalisades.com/photo/coastcam1.jpg + + + Auto Webcam - Live von unterwegs in L.A. + http://www.laavenue.com/la/la.jpg + + + sf Lawrence Hall of Science + http://sv.berkeley.edu/view/images/current_view.jpg + + + Mount St. Helens - VolcanoCam + http://www.fs.fed.us/gpnf/volcanocams/msh/images/mshvolcanocam.jpg + + + Seattle King 5 TV - From Queen Anne + http://www.king5.com/live/weather_images/external/queenanne_lg.jpg + + + Grand Canyon + http://www2.nature.nps.gov/air/WebCams/parks/grcacam/grca.jpg + + + Point Reyes National Seashore + http://www2.nature.nps.gov/air/webcams/parks/porecam/pore.jpg + + + + New York + + Broadway + http://images.earthcam.com/ec_metros/ourcams/charleyo.jpg + + + Ground zero + http://images.earthcam.com/ec_metros/ourcams/millenium.jpg + + + 46th Street and Broadway + http://209.178.198.74/ec_metros/ourcams/fridays.jpg + + + Emipre State Building + http://www.nyvibe.net/nyvibescam/view.jpg + + + + Las Vegas + + MGM + http://images.earthcam.com/ec_metros/ourcams/mgm.jpg + + + Wedding Chapel + http://images.earthcam.com/ec_metros/ourcams/wedding.jpg + + + Paris Hotel + http://images.earthcam.com/ec_metros/ourcams/paris.jpg + + + Hard Rock Hotel + http://images.earthcam.com/ec_metros/ourcams/cafe.jpg + + + + Rio de Janeiro + + Lapa + http://transito.rio.rj.gov.br/imagens1/41.jpg + + + Av. Rio Branco / Av. Presidente Vargas + http://transito.rio.rj.gov.br/imagens1/2.jpg + + + Aterro do Flamengo + http://transito.rio.rj.gov.br/imagens1/5.jpg + + + Flamengo / Botafogo + http://transito.rio.rj.gov.br/imagens1/20.jpg + + + Copacabana - Avenida Atlantica + http://transito.rio.rj.gov.br/imagens1/26.jpg + + + Av. Nossa Senhora de Copacabana + http://transito.rio.rj.gov.br/imagens1/24.jpg + + + + Vancouver, English Bay + http://www.katkam.ca/p.asp?what=currentjpg + + + Torronto + http://www.traveloffice.ca/webcam/capture1.jpg + + + Argentinien, Mar del Plata + http://www.mardelplatawebcam.com.ar/img/webcam_colon_y_costa.jpg + + + + + Europa + + London, Trafalgar Square + http://images.earthcam.com/ec_metros/ourcams/trafalgarsq.jpg + + + London, Big Ben + http://images.earthcam.com/ec_metros/ourcams/big_ben.jpg + + + London, Covent Garden + http://images.earthcam.com/ec_metros/ourcams/ltm.jpg + + + Spanien, Costa Brava + http://www.costabrava.cc/calella_live_webcam.jpg + + + Paris + http://www.abcparislive.com/eiffel2.jpg + + + Madrid + http://www.multimadrid.com/plaza.jpg + + + Dublin + http://www.ireland.com/includes/webcam/liveview.jpg + + + Griechenland, Naxos + http://www.flisvos-sportclub.com/images/webcam.jpg + + + Griechenland, Mykonos + http://www.travel-to-mykonos.com/webcam/1/mykonos.jpg + + + + Deutschland + + Hamburg + + Hamburg A7 Elbtunnel + http://www.ikk-hamburg.de/seiten/webcam/bild.php?bild=gross + + + Hamburg Landungsbruecken + http://www.dwd.de/scripts/getimg.php?src=/wundk/wkam1-10148.jpg + + + Hamburg Hafen + http://www.hafen-hamburg.de/webcam/camstill.jpg + + + + Dresden + + Frauenkirche + http://www3.mdr.de/webcams/frauen.jpg?t=12679 + + + Blick auf Altstadtpanorama, Synagoge und Frauenkirche + http://www3.mdr.de/webcams/altstadt.jpg + + + Zwinger + http://www.softed.de/Webcam/webcam/hugesize.jpg + + + Fernsehturm + http://www.eb-world.de/FernsehturmCam/pics/Fernsehturm.jpg + + + Seidnitz + http://www.webcam.maxg.ath.cx/capture1.jpg + + + Blick zur Frauenkirche + http://dataware.de/~combase/fkdrv/images/campics/image.jpg + + + + Eutin + http://www.stadtwerke-eutin.de/webcam/images/wasserturm.jpg + + + Offenbach/Frankfurt + http://www.dwd.de/scripts/getimg.php?src=/wundk/wkam1-10640.jpg + + + St. Peter Ording + http://www.dwd.de/scripts/getimg.php?src=/wundk/wkam1-10028.jpg + + + Rostock-Warnemuende Seestrasse + http://www.dwd.de/scripts/getimg.php?src=/wundk/wkam1-10170.jpg + + + Kahler Asten - Wetterstation + http://www.dwd.de/scripts/getimg.php?src=/wundk/wkam1-10427.jpg + + + Braunlage + http://www.dwd.de/scripts/getimg.php?src=/wundk/wkam1-10452.jpg + + + Hannover + http://www.langelaube2.de/webcam/webcam.jpg + + + Koeln + http://www.wdr.de/themen/global/webcams/domcam/domcam_live.jpg + + + Frankfurt + http://www.frankfurt.de/sis/frankfurtbilder/cams/pia/images/webcam_pia.jpg + + + Berlin + http://www.dhm.de/webcams/pics/cam1_large.jpg + + + Berlin2 + http://www.dwd.de/scripts/getimg.php?src=/wundk/wkam1-10384.jpg + + + Berlin, Museumsinsel + http://www.ipb.de/webcam/cam/cam.jpg + + + Leipzig + http://www.na-klarmann.de/cam.JPG + + + + Antarkits,South Georgia + http://www.sgisland.org/webcam/webcam.jpg + + + Neuseeland, Hammer Springs + http://www.hanmer.co.nz/hanmer.jpg + + + + Wetter + + Deutschlandwetter + http://www.dwd.de/scripts/getimg.php?src=/wundk/Wetter.jpg + + + Satellitenbild Wolken Deutschland + http://www.dwd.de/scripts/getimg.php?src=/hobbymet/mvvs1200.jpg + + + Satellitenbild Wolken Welt + http://www.dwd.de/scripts/getimg.php?src=/hobbymet/wvds1200.jpg + + + Wasser Temperaturen + http://www.dwd.de/scripts/getimg.php?src=/wundk/00-awg_sst.png + + + \ No newline at end of file -- 2.7.4