diff --git a/DIDLLite.py b/DIDLLite.py index 0bb42f3..ddc6de9 100644 --- a/DIDLLite.py +++ b/DIDLLite.py @@ -131,7 +131,7 @@ class Item(Object): def doUpdate(self): # Update parent container - self.cd[self.parentID].doUpdate() + Container.doUpdate(self.cd[self.parentID]) def toElement(self): @@ -275,7 +275,8 @@ class Container(Object, list): def doUpdate(self): self.updateID = (self.updateID + 1) % (1l << 32) - self.cd['0'].doUpdate() + if self.id != '0': + self.cd['0'].doUpdate() def toElement(self): diff --git a/FSStorage.py b/FSStorage.py index eb13ba8..a797122 100644 --- a/FSStorage.py +++ b/FSStorage.py @@ -13,7 +13,7 @@ import os import sets import stat -from DIDLLite import StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource +from DIDLLite import Container, StorageFolder, Item, VideoItem, AudioItem, TextItem, ImageItem, Resource from twisted.web import resource, server, static from twisted.python import log from twisted.internet import abstract, interfaces, process, protocol, reactor @@ -200,8 +200,10 @@ class FSItem(FSObject, Item): Item.__init__(self, *args, **kwargs) self.url = '%s/%s' % (self.cd.urlbase, self.id) self.mimetype = mimetype + self.checkUpdate() def doUpdate(self): + #print 'FSItem doUpdate:', `self` self.res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) self.res.size = os.path.getsize(self.FSpath) self.res = [ self.res ] @@ -268,10 +270,16 @@ class FSDirectory(FSObject, StorageFolder): # mapping from path to objectID self.pathObjmap = {} + self.indoUpdate = False def doUpdate(self): # We need to rescan this dir, and see if our children has # changed any. + if self.indoUpdate: + return + #import traceback + #traceback.print_stack() + self.indoUpdate = True doupdate = False children = sets.Set(os.listdir(self.FSpath)) for i in self.pathObjmap.keys(): @@ -297,7 +305,11 @@ class FSDirectory(FSObject, StorageFolder): # Pass up to handle UpdateID if doupdate: - StorageFolder.doUpdate(self) + # Calling StorageFolder.doUpdate results in calling + # ourselves. + Container.doUpdate(self) + + self.indoUpdate = False def __repr__(self): return ('<%s.%s: path: %s, id: %s, parent: %s, title: %s, ' + \