def append(self, obj, parent): if isinstance(obj, basestring): mimetype = "directory" else: protocol, network, content_type, info = obj["protocol"].split(":") mimetype = content_type UPnPClass = classChooser(mimetype) id = self.getnextID() update = False if hasattr(self, "update_id"): update = True self.store[id] = AxisCamItem(id, obj, parent, mimetype, self.urlbase, UPnPClass, update=update) if hasattr(self, "update_id"): self.update_id += 1 if self.server: self.server.content_directory_server.set_variable(0, "SystemUpdateID", self.update_id) if parent: # value = '%d,%d' % (parent.get_id(),parent_get_update_id()) value = (parent.get_id(), parent.get_update_id()) if self.server: self.server.content_directory_server.set_variable(0, "ContainerUpdateIDs", value) if mimetype == "directory": return self.store[id] return None
def __init__(self, server, name="ShortlistStore", trackcount=50, updateFrequency=300, **kwargs): BackendStore.__init__(self, server, **kwargs) self.name = name self.next_id = 1000 self.store = {} self.trackcount = trackcount self.updateFrequency = updateFrequency UPnPClass = classChooser('root') id = str(self.getnextID()) self.root = ShortListItem(id, None, 'media', 'root', self.urlbase, UPnPClass, update=True, store=self) self.add_store_item(id, self.root) self.source_backend = MediaStore(server, **kwargs) self.wmc_mapping.update({'14': '0', '15': '0', '16': '0', '17': '0'}) louie.send('Coherence.UPnP.Backend.init_completed', None, backend=self)
def appendPhoto(self, obj, parent): mimetype = 'image/' UPnPClass = classChooser(mimetype) id = self.getnextID() update = False if hasattr(self, 'update_id'): update = True self.store[id] = FlickrItem(id, obj, parent, mimetype, self.urlbase, UPnPClass, store=self, update=update, proxy=self.proxy) if hasattr(self, 'update_id'): self.update_id += 1 if self.server: self.server.content_directory_server.set_variable(0, 'SystemUpdateID', self.update_id) if parent: #value = '%d,%d' % (parent.get_id(),parent_get_update_id()) value = (parent.get_id(), parent.get_update_id()) if self.server: self.server.content_directory_server.set_variable(0, 'ContainerUpdateIDs', value) def update_photo_details(result, photo): dates = result.find('dates') self.debug("update_photo_details %s %s", dates.get('posted'), dates.get('taken')) photo.item.date = datetime(*time.strptime(dates.get('taken'), "%Y-%m-%d %H:%M:%S")[0:6]) #d = self.flickr_photos_getInfo(obj.get('id'),obj.get('secret')) #d.addCallback(update_photo_details, self.store[id]) return None
def __init__(self, id, name, parent, mimetype, urlbase, host, update=False): log.LogAble.__init__(self) self.id = id self.name = name self.mimetype = mimetype self.parent = parent if parent: parent.add_child(self, update=update) if parent is None: parent_id = -1 else: parent_id = parent.get_id() UPnPClass = classChooser( mimetype, sub='music') # FIXME: this is stupid self.item = UPnPClass(id, parent_id, self.name) self.child_count = 0 self.children = [] if len(urlbase) and urlbase[-1] != '/': urlbase += '/' # self.url = urlbase + str(self.id) self.url = self.name if self.mimetype == 'directory': self.update_id = 0 else: res = Resource(self.url, f'internal:{host}:{self.mimetype}:*') res.size = None self.item.res.append(res) self.item.artist = self.parent.name
def append(self, obj, parent): if isinstance(obj, str): mimetype = 'directory' else: mimetype = obj['mimetype'] UPnPClass = classChooser(mimetype) id = self.getnextID() update = False # if hasattr(self, 'update_id'): # update = True item = Gallery2Item( id, obj, parent, mimetype, self.urlbase, UPnPClass, update=update ) self.store[id] = item self.store[id].store = self if hasattr(self, 'update_id'): self.update_id += 1 if self.server: self.server.content_directory_server.set_variable( 0, 'SystemUpdateID', self.update_id ) # if parent: # value = (parent.get_id(),parent.get_update_id()) # if self.server: # self.server.content_directory_server.set_variable( # 0, 'ContainerUpdateIDs', value) if mimetype == 'directory': return self.store[id] return None
def add_new_entry(self, item): self.debug("theirs: %s %s", item.__dict__, item.get_id()) _, ext = os.path.splitext(item.location) id = self.getnextID() id = str(id) try: mimetype = KNOWN_AUDIO_TYPES[ext] except KeyError: mimetype = 'audio/mpeg' entry = self.add_store_item( id, ShortListItem(id, self.root, item.location, mimetype, self.urlbase, classChooser(mimetype), update=True, store=self)) entry.item = item.get_item() entry.item.title = "%s - %s" % (item.album.artist.name, item.title) self.debug("mine %s %s %s", entry, entry.item.__dict__, entry.item.res[0].__dict__) entry.item_key = str(item.get_id()) + ext self.add_store_item(entry.item_key, entry) self.root.add_child(entry, update=True)
def append(self, obj, parent): if isinstance(obj, str): mimetype = 'directory' else: protocol, network, content_type, info = obj['protocol'].split(':') mimetype = content_type UPnPClass = classChooser(mimetype) id = self.getnextID() update = False if hasattr(self, 'update_id'): update = True self.store[id] = AxisCamItem(id, obj, parent, mimetype, self.urlbase, UPnPClass, update=update) if hasattr(self, 'update_id'): self.update_id += 1 if self.server: self.server.content_directory_server.set_variable( 0, 'SystemUpdateID', self.update_id) if parent: # value = '%d,%d' % (parent.get_id(),parent_get_update_id()) value = (parent.get_id(), parent.get_update_id()) if self.server: self.server.content_directory_server.set_variable( 0, 'ContainerUpdateIDs', value) if mimetype == 'directory': return self.store[id] return None
def __init__(self, id, name, parent, mimetype, urlbase, host, update=False): self.id = id self.name = name self.mimetype = mimetype self.parent = parent if parent: parent.add_child(self,update=update) if parent == None: parent_id = -1 else: parent_id = parent.get_id() UPnPClass = classChooser(mimetype, sub='music') # FIXME: this is stupid self.item = UPnPClass(id, parent_id, self.name) self.child_count = 0 self.children = [] if( len(urlbase) and urlbase[-1] != '/'): urlbase += '/' #self.url = urlbase + str(self.id) self.url = self.name if self.mimetype == 'directory': self.update_id = 0 else: res = Resource(self.url, 'internal:%s:%s:*' % (host,self.mimetype)) res.size = None self.item.res.append(res) self.item.artist = self.parent.name
def append(self, obj, parent): if isinstance(obj, basestring): mimetype = "directory" else: mimetype = obj["mimetype"] UPnPClass = classChooser(mimetype) id = self.getnextID() update = False # if hasattr(self, 'update_id'): # update = True item = Gallery2Item(id, obj, parent, mimetype, self.urlbase, UPnPClass, update=update) self.store[id] = item self.store[id].store = self if hasattr(self, "update_id"): self.update_id += 1 if self.server: self.server.content_directory_server.set_variable(0, "SystemUpdateID", self.update_id) # if parent: # value = (parent.get_id(),parent.get_update_id()) # if self.server: # self.server.content_directory_server.set_variable(0, 'ContainerUpdateIDs', value) if mimetype == "directory": return self.store[id] return None
def create(self, mimetype, path, parent): #print "create", mimetype, path, type(path), parent UPnPClass = classChooser(mimetype) if UPnPClass == None: return None id = self.getnextID() update = False if hasattr(self, 'update_id'): update = True self.store[id] = FSItem( id, parent, path, mimetype, self.urlbase, UPnPClass, update=True) if hasattr(self, 'update_id'): self.update_id += 1 #print self.update_id if self.server: if hasattr(self.server,'content_directory_server'): self.server.content_directory_server.set_variable(0, 'SystemUpdateID', self.update_id) if parent is not None: value = (parent.get_id(),parent.get_update_id()) if self.server: if hasattr(self.server,'content_directory_server'): self.server.content_directory_server.set_variable(0, 'ContainerUpdateIDs', value) return id
def append( self, obj, parent): if isinstance(obj, basestring): mimetype = 'directory' else: mimetype = obj['mimetype'] UPnPClass = classChooser(mimetype) id = self.getnextID() update = False if hasattr(self, 'update_id'): update = True self.store[id] = LastFMItem( id, obj, parent, mimetype, self.urlbase, UPnPClass, update=update) self.store[id].store = self if hasattr(self, 'update_id'): self.update_id += 1 if self.server: self.server.content_directory_server.set_variable(0, 'SystemUpdateID', self.update_id) if parent: #value = '%d,%d' % (parent.get_id(),parent_get_update_id()) value = (parent.get_id(),parent.get_update_id()) if self.server: self.server.content_directory_server.set_variable(0, 'ContainerUpdateIDs', value) return self.store[id]
def append(self, obj, parent): if isinstance(obj, basestring): mimetype = 'directory' else: mimetype = obj['mimetype'] UPnPClass = classChooser(mimetype) id = self.getnextID() update = False if hasattr(self, 'update_id'): update = True self.store[id] = LastFMItem(id, obj, parent, mimetype, self.urlbase, UPnPClass, update=update) self.store[id].store = self if hasattr(self, 'update_id'): self.update_id += 1 if self.server: self.server.content_directory_server.set_variable(0, 'SystemUpdateID', self.update_id) if parent: #value = '%d,%d' % (parent.get_id(),parent_get_update_id()) value = (parent.get_id(), parent.get_update_id()) if self.server: self.server.content_directory_server.set_variable(0, 'ContainerUpdateIDs', value) return self.store[id]
def build_upnp_item(elisa_item): UPnPClass = classChooser(elisa_item['mimetype']) upnp_item = None if UPnPClass: upnp_item = UPnPClass(elisa_item['id'], elisa_item['parent_id'], elisa_item['name']) if isinstance(upnp_item, Container): upnp_item.childCount = len(elisa_item.get('children', [])) if len(Filter) > 0: upnp_item.searchable = True upnp_item.searchClass = ('object', ) else: internal_url = elisa_item['location'].get('internal') external_url = elisa_item['location'].get('external') try: size = elisa_item['size'] except: size = None try: cover = elisa_item['cover'] if cover != '': upnp_item.albumArtURI = cover except: pass res = Resource(internal_url, 'internal:%s:*:*' % self.host) res.size = size upnp_item.res.append(res) res = Resource(external_url, 'http-get:*:%s:*' % elisa_item['mimetype']) res.size = size upnp_item.res.append(res) return upnp_item
def __init__(self, server, **kwargs): BackendStore.__init__(self,server) self.next_id = 1000 self.name = kwargs.get('name','my media') self.content = kwargs.get('content',None) if self.content != None: if isinstance(self.content,basestring): self.content = [self.content] l = [] for a in self.content: l += a.split(',') self.content = l else: self.content = xdg_content() if self.content == None: self.content = 'tests/content' if not isinstance( self.content, list): self.content = [self.content] self.urlbase = kwargs.get('urlbase','') ignore_patterns = kwargs.get('ignore_patterns',[]) if self.urlbase[len(self.urlbase)-1] != '/': self.urlbase += '/' self.server = server self.store = {} try: self.inotify = INotify() except: self.inotify = None if kwargs.get('enable_destroy','no') == 'yes': self.upnp_DestroyObject = self.hidden_upnp_DestroyObject self.ignore_file_pattern = re.compile('|'.join(['^\..*'] + list(ignore_patterns))) parent = None self.update_id = 0 if len(self.content)>1: UPnPClass = classChooser('root') id = self.getnextID() parent = self.store[id] = FSItem( id, parent, 'media', 'root', self.urlbase, UPnPClass, update=True) for path in self.content: if isinstance(path,(list,tuple)): path = path[0] if self.ignore_file_pattern.match(path): continue self.walk(path, parent, self.ignore_file_pattern) self.wmc_mapping.update({'14': 0, '15': 0, '16': 0, '17': 0 }) louie.send('Coherence.UPnP.Backend.init_completed', None, backend=self)
def rebuild(self, urlbase): # print('rebuild', self.mimetype) if self.mimetype != 'item': return # print('rebuild for', self.get_path()) mimetype, _ = mimetypes.guess_type(self.get_path(), strict=False) if mimetype is None: return self.mimetype = mimetype # print('rebuild', self.mimetype) UPnPClass = classChooser(self.mimetype) self.item = UPnPClass(self.id, self.parent.id, self.get_name()) if getattr(self.parent, 'cover', None): _, ext = os.path.splitext(self.parent.cover) # add the cover image extension to help # clients not reacting on the mimetype self.item.albumArtURI = ''.join( (urlbase, str(self.id), '?cover', ext)) _, host_port, _, _, _ = urlsplit(urlbase) if host_port.find(':') != -1: host, port = tuple(host_port.split(':')) else: host = host_port res = Resource( 'file://' + quote(self.get_path()), f'internal:{host}:{self.mimetype}:*', ) try: res.size = self.location.getsize() except Exception: res.size = 0 self.item.res.append(res) res = Resource(self.url, f'http-get:*:{self.mimetype}:*') try: res.size = self.location.getsize() except Exception: res.size = 0 self.item.res.append(res) try: # FIXME: getmtime is deprecated in Twisted 2.6 self.item.date = datetime.fromtimestamp(self.location.getmtime()) except Exception: self.item.date = None self.parent.update_id += 1
def rebuild(self, urlbase): #print "rebuild", self.mimetype if self.mimetype != 'item': return #print "rebuild for", self.get_path() mimetype,_ = mimetypes.guess_type(self.get_path(),strict=False) if mimetype == None: return self.mimetype = mimetype #print "rebuild", self.mimetype UPnPClass = classChooser(self.mimetype) self.item = UPnPClass(self.id, self.parent.id, self.get_name()) if hasattr(self.parent, 'cover'): _,ext = os.path.splitext(self.parent.cover) """ add the cover image extension to help clients not reacting on the mimetype """ self.item.albumArtURI = ''.join((urlbase,str(self.id),'?cover',ext)) _,host_port,_,_,_ = urlsplit(urlbase) if host_port.find(':') != -1: host,port = tuple(host_port.split(':')) else: host = host_port res = Resource('file://'+urllib.quote(self.get_path()), 'internal:%s:%s:*' % (host,self.mimetype)) try: res.size = self.location.getsize() except: res.size = 0 self.item.res.append(res) res = Resource(self.url, 'http-get:*:%s:*' % self.mimetype) try: res.size = self.location.getsize() except: res.size = 0 self.item.res.append(res) try: # FIXME: getmtime is deprecated in Twisted 2.6 self.item.date = datetime.fromtimestamp(self.location.getmtime()) except: self.item.date = None self.parent.update_id += 1
def create(self, mimetype, path, parent): self.debug(f'create {mimetype} {path} {type(path)} {parent}') UPnPClass = classChooser(mimetype) if UPnPClass is None: return None id = self.getnextID() if mimetype in ('root', 'directory'): id = str(id) else: _, ext = os.path.splitext(path) id = str(id) + ext.lower() update = False if hasattr(self, 'update_id'): update = True self.store[id] = FSItem( id, parent, path, mimetype, self.urlbase, UPnPClass, update=True, store=self, ) if hasattr(self, 'update_id'): self.update_id += 1 # print(self.update_id) if self.server: if hasattr(self.server, 'content_directory_server'): self.server.content_directory_server.set_variable( 0, 'SystemUpdateID', self.update_id) if parent is not None: value = (parent.get_id(), parent.get_update_id()) if self.server: if hasattr(self.server, 'content_directory_server'): self.server.content_directory_server.set_variable( 0, 'ContainerUpdateIDs', value) return id
def append(self, obj, parent): if isinstance(obj, str): mimetype = 'directory' else: mimetype = obj['mimetype'] UPnPClass = classChooser(mimetype) id = self.getnextID() update = False if hasattr(self, 'update_id'): update = True item = PlaylistItem( id, obj, mimetype, parent=parent, storageid=parent, upnpclass=UPnPClass, update=update, ) self.store[id] = item self.store[id].store = self if hasattr(self, 'update_id'): self.update_id += 1 if self.server: self.server.content_directory_server.set_variable( 0, 'SystemUpdateID', self.update_id) if parent: value = (parent.get_id(), parent.get_update_id()) if self.server: self.server.content_directory_server.set_variable( 0, 'ContainerUpdateIDs', value) if mimetype == 'directory': return self.store[id] return None
def appendContact(self, obj, parent): mimetype = 'directory' UPnPClass = classChooser(mimetype) id = self.getnextID() update = False if hasattr(self, 'update_id'): update = True self.store[id] = FlickrItem(id, obj, parent, 'contact', self.urlbase, UPnPClass, store=self, update=update, proxy=self.proxy) if hasattr(self, 'update_id'): self.update_id += 1 if self.server: self.server.content_directory_server.set_variable(0, 'SystemUpdateID', self.update_id) if parent: #value = '%d,%d' % (parent.get_id(),parent_get_update_id()) value = (parent.get_id(), parent.get_update_id()) if self.server: self.server.content_directory_server.set_variable(0, 'ContainerUpdateIDs', value) return self.store[id]
def __init__(self, server, **kwargs): BackendStore.__init__(self, server, **kwargs) self.next_id = 1000 self.name = kwargs.get('name', 'my media') self.content = kwargs.get('content', None) if self.content is not None: if isinstance(self.content, str): self.content = [self.content] cl = [] for a in self.content: cl += a.split(',') self.content = cl else: self.content = xdg_content() self.content = [x[0] for x in self.content] if self.content is None: self.content = 'tests/content' if not isinstance(self.content, list): self.content = [self.content] self.content = set([os.path.abspath(x) for x in self.content]) ignore_patterns = kwargs.get('ignore_patterns', []) self.store = {} self.inotify = None if kwargs.get('enable_inotify', 'yes') == 'yes': if INotify: try: self.inotify = INotify() self.inotify.startReading() except Exception as msg: self.error(f'inotify disabled: {msg}') self.inotify = None else: self.info(f'{no_inotify_reason}') else: self.info('FSStore content auto-update disabled upon user request') if kwargs.get('enable_destroy', 'no') == 'yes': self.upnp_DestroyObject = self.hidden_upnp_DestroyObject self.import_folder = kwargs.get('import_folder', None) if self.import_folder is not None: self.import_folder = os.path.abspath(self.import_folder) if not os.path.isdir(self.import_folder): self.import_folder = None self.ignore_file_pattern = re.compile(r'|'.join([r'^\..*'] + list(ignore_patterns))) parent = None self.update_id = 0 if (len(self.content) > 1 or utils.means_true(kwargs.get('create_root', False)) or self.import_folder is not None): UPnPClass = classChooser('root') id = str(self.getnextID()) try: parent = self.store[id] = FSItem( id, parent, 'media', 'root', self.urlbase, UPnPClass, update=True, store=self, ) except Exception as e: self.error( f'Error on setting self.store[id], Error on FSItem: {e}') exit(1) if self.import_folder is not None: id = str(self.getnextID()) self.store[id] = FSItem( id, parent, self.import_folder, 'directory', self.urlbase, UPnPClass, update=True, store=self, ) self.import_folder_id = id for bytesPath in self.content: if isinstance(bytesPath, (list, tuple)): path = str(bytesPath[0]) else: path = str(bytesPath) if self.ignore_file_pattern.match(path): continue try: self.walk(path, parent, self.ignore_file_pattern) except Exception as msg: self.warning(f'on walk of {path!r}: {msg!r}') import traceback self.debug(traceback.format_exc()) self.wmc_mapping.update({'14': '0', '15': '0', '16': '0', '17': '0'}) self.init_completed = True
def __init__(self, server, **kwargs): BackendStore.__init__(self, server, **kwargs) self.next_id = 1000 self.name = kwargs.get('name', 'my media') self.content = kwargs.get('content', None) if self.content != None: if isinstance(self.content, str): self.content = [self.content] l = [] for a in self.content: l += a.split(',') self.content = l else: self.content = xdg_content() self.content = [x[0] for x in self.content] if self.content == None: self.content = 'tests/content' if not isinstance(self.content, list): self.content = [self.content] self.content = Set([os.path.abspath(x) for x in self.content]) ignore_patterns = kwargs.get('ignore_patterns', []) self.store = {} self.inotify = None if kwargs.get('enable_inotify', 'yes') == 'yes': if INotify: try: self.inotify = INotify() except Exception as msg: self.info("%s", msg) else: self.info("%s", no_inotify_reason) else: self.info("FSStore content auto-update disabled upon user request") if kwargs.get('enable_destroy', 'no') == 'yes': self.upnp_DestroyObject = self.hidden_upnp_DestroyObject self.import_folder = kwargs.get('import_folder', None) if self.import_folder != None: self.import_folder = os.path.abspath(self.import_folder) if not os.path.isdir(self.import_folder): self.import_folder = None self.ignore_file_pattern = re.compile('|'.join(['^\..*'] + list(ignore_patterns))) parent = None self.update_id = 0 if (len(self.content) > 1 or utils.means_true(kwargs.get('create_root', False)) or self.import_folder != None): UPnPClass = classChooser('root') id = str(self.getnextID()) parent = self.store[id] = FSItem(id, parent, 'media', 'root', self.urlbase, UPnPClass, update=True, store=self) if self.import_folder != None: id = str(self.getnextID()) self.store[id] = FSItem(id, parent, self.import_folder, 'directory', self.urlbase, UPnPClass, update=True, store=self) self.import_folder_id = id for path in self.content: if isinstance(path, (list, tuple)): path = path[0] if self.ignore_file_pattern.match(path): continue try: path = path.encode('utf-8') # patch for #267 self.walk(path, parent, self.ignore_file_pattern) except Exception as msg: self.warning('on walk of %r: %r', path, msg) import traceback self.debug(traceback.format_exc()) self.wmc_mapping.update({'14': '0', '15': '0', '16': '0', '17': '0'}) louie.send('Coherence.UPnP.Backend.init_completed', None, backend=self)