def got_result(elisa_item): didl = DIDLElement() children = elisa_item.get('children', []) if BrowseFlag == 'BrowseDirectChildren': if RequestedCount == 0: childs = children[StartingIndex:] else: childs = \ children[StartingIndex: StartingIndex + RequestedCount] for child in childs: if child is not None: item = build_upnp_item(child) if item: didl.addItem(item) total = len(children) elif elisa_item: item = build_upnp_item(elisa_item) if item: didl.addItem(item) total = 1 r = {'Result': didl.toString(), 'TotalMatches': total, 'NumberReturned': didl.numItems()} if hasattr(elisa_item, 'update_id'): r['UpdateID'] = item.update_id # pylint: disable=no-member else: r['UpdateID'] = self.update_id return r
def got_result(elisa_item): didl = DIDLElement() children = elisa_item.get('children', []) if BrowseFlag == 'BrowseDirectChildren': if RequestedCount == 0: childs = children[StartingIndex:] else: childs = children[StartingIndex:StartingIndex + RequestedCount] for child in childs: if child is not None: item = build_upnp_item(child) if item: didl.addItem(item) total = len(children) elif elisa_item: item = build_upnp_item(elisa_item) if item: didl.addItem(item) total = 1 r = {'Result': didl.toString(), 'TotalMatches': total, 'NumberReturned': didl.numItems()} if hasattr(elisa_item, 'update_id'): r['UpdateID'] = item.update_id else: r['UpdateID'] = self.update_id return r
def upnp_CreateObject(self, *args, **kwargs): print "upnp_CreateObject", args, kwargs ContainerID = kwargs['ContainerID'] Elements = kwargs['Elements'] parent_item = self.get_by_id(ContainerID) if parent_item == None: return failure.Failure(errorCode(710)) if parent_item.item.restricted: return failure.Failure(errorCode(713)) if len(Elements) == 0: return failure.Failure(errorCode(712)) elt = DIDLElement.fromString(Elements) if elt.numItems() != 1: return failure.Failure(errorCode(712)) item = elt.getItems()[0] if(item.id != '' or item.parentID != ContainerID or item.restricted == True or item.title == ''): return failure.Failure(errorCode(712)) if item.upnp_class.startswith('object.container'): if len(item.res) != 0: return failure.Failure(errorCode(712)) return failure.Failure(errorCode(712)) ### FIXME new_item = self.get_by_id(new_id) didl = DIDLElement() didl.addItem(new_item.item) return {'ObjectID': id, 'Result': didl.toString()} if item.upnp_class.startswith('object.item.imageItem'): new_id = self.getnextID() new_id = 'upload.' + str(new_id) title = item.title or 'unknown' mimetype = 'image/jpeg' self.uploads[new_id] = FlickrItem(new_id, title, self.store[UNSORTED_CONTAINER_ID], mimetype, self.urlbase, ImageItem, store=self, update=False, proxy=self.proxy) new_item = self.uploads[new_id] for res in new_item.item.res: res.importUri = new_item.url + '?import' res.data = None didl = DIDLElement() didl.addItem(new_item.item) r = {'ObjectID': new_id, 'Result': didl.toString()} print r return r return failure.Failure(errorCode(712))
def upnp_CreateObject(self, *args, **kwargs): # print(f'CreateObject {kwargs}') if kwargs['ContainerID'] == 'DLNA.ORG_AnyContainer': if self.import_folder is not None: ContainerID = self.import_folder_id else: return failure.Failure(errorCode(712)) else: ContainerID = kwargs['ContainerID'] Elements = kwargs['Elements'] parent_item = self.get_by_id(ContainerID) if parent_item is None: return failure.Failure(errorCode(710)) if parent_item.item.restricted: return failure.Failure(errorCode(713)) if len(Elements) == 0: return failure.Failure(errorCode(712)) elt = DIDLElement.fromString(Elements) if elt.numItems() != 1: return failure.Failure(errorCode(712)) item = elt.getItems()[0] if item.parentID == 'DLNA.ORG_AnyContainer': item.parentID = ContainerID if (item.id != '' or item.parentID != ContainerID or item.restricted is True or item.title == ''): return failure.Failure(errorCode(712)) if '..' in item.title or '~' in item.title or os.sep in item.title: return failure.Failure(errorCode(712)) if item.upnp_class == 'object.container.storageFolder': if len(item.res) != 0: return failure.Failure(errorCode(712)) path = os.path.join(parent_item.get_path(), item.title) id = self.create('directory', path, parent_item) try: os.mkdir(path) except Exception: self.remove(id) return failure.Failure(errorCode(712)) if self.inotify is not None: mask = (IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO | IN_CHANGED) self.inotify.watch( path, mask=mask, autoAdd=False, callbacks=[partial(self.notify, parameter=id)], ) new_item = self.get_by_id(id) didl = DIDLElement() didl.addItem(new_item.item) return {'ObjectID': id, 'Result': didl.toString()} if item.upnp_class.startswith('object.item'): _, _, content_format, _ = item.res[0].protocolInfo.split(':') extension = mimetypes.guess_extension(content_format, strict=False) path = os.path.join(parent_item.get_realpath(), item.title + extension) id = self.create('item', path, parent_item) new_item = self.get_by_id(id) for res in new_item.item.res: res.importUri = new_item.url + '?import' res.data = None didl = DIDLElement() didl.addItem(new_item.item) return {'ObjectID': id, 'Result': didl.toString()} return failure.Failure(errorCode(712))
def upnp_CreateObject(self, *args, **kwargs): if kwargs['ContainerID'] == 'DLNA.ORG_AnyContainer': """ for the moment """ return failure.Failure(errorCode(712)) else: ContainerID = kwargs['ContainerID'] Elements = kwargs['Elements'] parent_item = self.get_by_id(ContainerID) if parent_item == None: return failure.Failure(errorCode(710)) if parent_item.item.restricted: return failure.Failure(errorCode(713)) if len(Elements) == 0: return failure.Failure(errorCode(712)) elt = DIDLElement.fromString(Elements) if elt.numItems() != 1: return failure.Failure(errorCode(712)) item = elt.getItems()[0] if(item.id != '' or int(item.parentID) != ContainerID or item.restricted == True or item.title == ''): return failure.Failure(errorCode(712)) if('..' in item.title or '~' in item.title or os.sep in item.title): return failure.Failure(errorCode(712)) if item.upnp_class == 'object.container.storageFolder': if len(item.res) != 0: return failure.Failure(errorCode(712)) path = os.path.join(parent_item.get_path(),item.title) id = self.create('directory',path,parent_item) try: os.mkdir(path) except: self.remove(id) return failure.Failure(errorCode(712)) if self.inotify is not None: mask = IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO | IN_CHANGED self.inotify.watch(path, mask=mask, auto_add=False, callbacks=(self.notify,id)) new_item = self.get_by_id(id) didl = DIDLElement() didl.addItem(new_item.item) return {'ObjectID': id, 'Result': didl.toString()} if item.upnp_class.startswith('object.item.'): #path = os.path.join(parent_item.get_path(),item.title) id = self.create('item',None,parent_item) new_item = self.get_by_id(id) for res in new_item.item.res: res.importUri = new_item.url+'?import' res.data = None didl = DIDLElement() didl.addItem(new_item.item) return {'ObjectID': id, 'Result': didl.toString()} return failure.Failure(errorCode(712))
def upnp_Search(self, *args, **kwargs): ContainerID = kwargs['ContainerID'] Filter = kwargs['Filter'] StartingIndex = int(kwargs['StartingIndex']) RequestedCount = int(kwargs['RequestedCount']) SortCriteria = kwargs['SortCriteria'] SearchCriteria = kwargs['SearchCriteria'] total = 0 root_id = 0 item = None items = [] parent_container = str(ContainerID) didl = DIDLElement(upnp_client=kwargs.get('X_UPnPClient', ''), parent_container=parent_container, transcoding=self.transcoding) def build_response(tm): r = { 'Result': didl.toString(), 'TotalMatches': tm, 'NumberReturned': didl.numItems() } if hasattr(item, 'update_id'): r['UpdateID'] = item.update_id elif hasattr(self.backend, 'update_id'): r['UpdateID'] = self.backend.update_id # FIXME else: r['UpdateID'] = 0 return r def got_error(r): return r def process_result(result, total=None, found_item=None): if result == None: result = [] l = [] def process_items(result, tm): if result == None: result = [] for i in result: if i[0] == True: didl.addItem(i[1]) return build_response(tm) for i in result: d = defer.maybeDeferred(i.get_item) l.append(d) if found_item != None: def got_child_count(count): dl = defer.DeferredList(l) dl.addCallback(process_items, count) return dl d = defer.maybeDeferred(found_item.get_child_count) d.addCallback(got_child_count) return d elif total == None: total = item.get_child_count() dl = defer.DeferredList(l) dl.addCallback(process_items, total) return dl def proceed(result): if (kwargs.get('X_UPnPClient', '') == 'XBox' and hasattr(result, 'get_artist_all_tracks')): d = defer.maybeDeferred(result.get_artist_all_tracks, StartingIndex, StartingIndex + RequestedCount) else: d = defer.maybeDeferred(result.get_children, StartingIndex, StartingIndex + RequestedCount) d.addCallback(process_result, found_item=result) d.addErrback(got_error) return d try: root_id = ContainerID except: pass wmc_mapping = getattr(self.backend, "wmc_mapping", None) if kwargs.get('X_UPnPClient', '') == 'XBox': if (wmc_mapping != None and wmc_mapping.has_key(ContainerID)): """ fake a Windows Media Connect Server """ root_id = wmc_mapping[ContainerID] if callable(root_id): item = root_id() if item is not None: if isinstance(item, list): total = len(item) if int(RequestedCount) == 0: items = item[StartingIndex:] else: items = item[StartingIndex:StartingIndex + RequestedCount] return process_result(items, total=total) else: if isinstance(item, defer.Deferred): item.addCallback(proceed) return item else: return proceed(item) item = self.backend.get_by_id(root_id) if item == None: return process_result([], total=0) if isinstance(item, defer.Deferred): item.addCallback(proceed) return item else: return proceed(item) item = self.backend.get_by_id(root_id) if item == None: return failure.Failure(errorCode(701)) if isinstance(item, defer.Deferred): item.addCallback(proceed) return item else: return proceed(item)
def upnp_Browse(self, *args, **kwargs): try: ObjectID = kwargs['ObjectID'] except: self.debug( "hmm, a Browse action and no ObjectID argument? An XBox maybe?" ) try: ObjectID = kwargs['ContainerID'] except: ObjectID = 0 BrowseFlag = kwargs['BrowseFlag'] Filter = kwargs['Filter'] StartingIndex = int(kwargs['StartingIndex']) RequestedCount = int(kwargs['RequestedCount']) SortCriteria = kwargs['SortCriteria'] parent_container = None requested_id = None item = None total = 0 items = [] if BrowseFlag == 'BrowseDirectChildren': parent_container = str(ObjectID) else: requested_id = str(ObjectID) self.info("upnp_Browse request %r %r %r %r", ObjectID, BrowseFlag, StartingIndex, RequestedCount) didl = DIDLElement(upnp_client=kwargs.get('X_UPnPClient', ''), requested_id=requested_id, parent_container=parent_container, transcoding=self.transcoding) def got_error(r): return r def process_result(result, total=None, found_item=None): if result == None: result = [] if BrowseFlag == 'BrowseDirectChildren': l = [] def process_items(result, tm): if result == None: result = [] for i in result: if i[0] == True: didl.addItem(i[1]) return build_response(tm) for i in result: d = defer.maybeDeferred(i.get_item) l.append(d) if found_item != None: def got_child_count(count): dl = defer.DeferredList(l) dl.addCallback(process_items, count) return dl d = defer.maybeDeferred(found_item.get_child_count) d.addCallback(got_child_count) return d elif total == None: total = item.get_child_count() dl = defer.DeferredList(l) dl.addCallback(process_items, total) return dl else: didl.addItem(result) total = 1 return build_response(total) def build_response(tm): r = { 'Result': didl.toString(), 'TotalMatches': tm, 'NumberReturned': didl.numItems() } if hasattr(item, 'update_id'): r['UpdateID'] = item.update_id elif hasattr(self.backend, 'update_id'): r['UpdateID'] = self.backend.update_id # FIXME else: r['UpdateID'] = 0 return r def proceed(result): if BrowseFlag == 'BrowseDirectChildren': d = defer.maybeDeferred(result.get_children, StartingIndex, StartingIndex + RequestedCount) else: d = defer.maybeDeferred(result.get_item) d.addCallback(process_result, found_item=result) d.addErrback(got_error) return d root_id = ObjectID wmc_mapping = getattr(self.backend, "wmc_mapping", None) if (kwargs.get('X_UPnPClient', '') == 'XBox' and wmc_mapping != None and wmc_mapping.has_key(ObjectID)): """ fake a Windows Media Connect Server """ root_id = wmc_mapping[ObjectID] if callable(root_id): item = root_id() if item is not None: if isinstance(item, list): total = len(item) if int(RequestedCount) == 0: items = item[StartingIndex:] else: items = item[StartingIndex:StartingIndex + RequestedCount] return process_result(items, total=total) else: if isinstance(item, defer.Deferred): item.addCallback(proceed) return item else: return proceed(item) item = self.backend.get_by_id(root_id) if item == None: return process_result([], total=0) if isinstance(item, defer.Deferred): item.addCallback(proceed) return item else: return proceed(item) item = self.backend.get_by_id(root_id) if item == None: return failure.Failure(errorCode(701)) if isinstance(item, defer.Deferred): item.addCallback(proceed) return item else: return proceed(item)