def run_update(self): medialib = nerve.get_object('/modules/medialib') self.list_ids = medialib.get_setting('youtube_playlists') if not self.list_ids: nerve.log("warning: youtube_playlists not set", logtype='warning') return nerve.log("Starting youtube medialib update...") for list_id in self.list_ids: json_playlist = self.fetch_json(list_id) if json_playlist is None or 'video' not in json_playlist: nerve.log("Unable to fetch youtube playlist " + list_id, logtype='error') else: playlist = [ ] for video in json_playlist['video']: if self.stopflag.is_set(): return data = self.hash_video(video) playlist.append({ 'artist' : data['artist'], 'title' : data['title'], 'duration' : data['duration'], 'filename' : data['filename'] }) pl = nerve.medialib.Playlist(json_playlist['title']) pl.set_list(playlist) self.db.insert('info', { 'name' : 'youtube_last_updated', 'value' : str(time.time()) }, replace=True) #nerve.log("Youtube medialib update complete") nerve.query('/devices/notify/send', 'youtube medialib update complete')
def run_update(self): medialib = nerve.get_object('/modules/medialib') self.path = medialib.get_setting('medialib_dirs') self.ignore = medialib.get_setting('ignore_dirs') if not self.path: nerve.log("warning: medialib_dirs not set", logtype='warning') return nerve.log("Starting medialib update...") for libpath in self.path: for root, dirs, files in os.walk(libpath): if len(tuple(name for name in self.ignore if name in root)) > 0: continue if self.stopflag.is_set(): return nerve.log("Searching " + root) for media in files: #if media.endswith('.mp3'): self.update_file(os.path.join(root, media), len(libpath.rstrip('/')) + 2) self.check_for_deleted() self.db.insert('info', { 'name' : 'last_updated', 'value' : str(time.time()) }, replace=True) #nerve.log("Medialib update complete") nerve.query('/devices/notify/send', 'medialib update complete')
def send_code(self, request): code = request.arg('code') if not code: raise nerve.ControllerError("You must provide an IR code") #irremote = nerve.get_object('/devices/irremote') nerve.query('/devices/rgb/ir', code) self.load_json_view({'notice': "Code sent."})
def get_data(self, request): datalog_name = request.args['datalog'] start_time = request.args['start_time'] length = request.args['length'] ref = '/devices/datalogs/%s/get_data' % (datalog_name, ) data = nerve.query(ref, start_time=start_time, length=length) self.load_json_view(data)
def get_data(self, request): datalog_name = request.args['datalog'] start_time = request.args['start_time'] length = request.args['length'] ref = '/devices/datalogs/%s/get_data' % (datalog_name,) data = nerve.query(ref, start_time=start_time, length=length) self.load_json_view(data)
def on_message(self, msg): if msg.mimetype != 'application/json': nerve.log("invalid message type: " + str(msg.mimetype) + " " + str(msg.text)) return nerve.log(msg.mimetype + " " + str(msg.data), logtype='warning') if msg.data['type'] == 'query': try: seq = msg.data['id'] if 'id' in msg.data else 0 args = msg.data[ 'args'] if 'args' in msg.data and msg.data['args'] else {} result = nerve.query(msg.data['query'], **args) self.send_message( nerve.connect.Message('application/json', data={ 'type': 'reply', 'id': seq, 'query': msg.data['query'], 'result': result })) except Exception as e: t = traceback.format_exc() nerve.log(t, logtype='error') self.send_message( nerve.connect.Message('application/json', data={ 'type': 'error', 'id': seq, 'query': msg.data['query'], 'stack': t, 'error': type(e).__name__ + ": " + str(e) })) elif msg.data['type'] == 'subscribe': def _on_event(event): nerve.log(event, logtype='warning') self.send_message( nerve.connect.Message('application/json', data={ 'type': 'publish', 'event': event })) print(msg, _on_event) nerve.events.subscribe(msg.data['topic'], _on_event, label=str(id(self))) elif msg.data['type'] == 'unsubscribe': nerve.events.unsubscribe(msg.data['topic'], label=str(id(self)))
def get_playlist(self, request): playlists = nerve.get_object(self.get_setting('playlists')) playlist = request.args['playlist'] if 'playlist' in request.args else 'default' data = { } data['playlist'] = playlists.get_playlist(playlist) try: data['current_pos'] = nerve.query('/devices/player/get_position') except: data['current_pos'] = 0 self.load_html_view('nerve/medialib/views/playlist-data.blk.pyhtml', data)
def get_playlist(self, request): playlists = nerve.get_object(self.get_setting('playlists')) playlist = request.args['playlist'] if 'playlist' in request.args else 'default' data = { } data['playlist'] = playlists.get(playlist) try: data['current_pos'] = nerve.query('/devices/player/get_position') except: data['current_pos'] = 0 self.load_html_view('nerve/medialib/views/playlist-data.blk.pyhtml', data)
def on_receive(self, line): nerve.log("RECV <- " + self.file + ": " + line) (ref, _, args) = line.partition(" ") if not ref: return with self.lock: for (i, query) in enumerate(self.waiting): if query.ref == ref: self.waiting.pop(i) query.result = args query.ready.set() return if self.get_setting('publish'): nerve.events.publish(topic=self.get_pathname(False) + '/' + ref, type='change', value=args) # TODO this isn't really used anymore (actually it is still the main interface to irremote, but should be replace with events when that gets working) if not args: return notify_ref = self.get_setting('query').rstrip('/') + '/' + ref + '/*' nerve.query(notify_ref, args)
def _collect_data(self): data = {} data['timestamp'] = time.time() for datapoint in self.get_setting('datapoints'): try: data[datapoint['name']] = nerve.query(datapoint['ref']) except Exception as exc: nerve.log("error collecting ref: " + str(datapoint['ref']) + ": " + repr(exc), logtype='error') data[datapoint['name']] = None self.db.insert(self.name, data)
def on_receive(self, line): nerve.log("RECV <- " + self.file + ": " + line) (ref, _, args) = line.partition(" ") if not ref: return with self.lock: for (i, query) in enumerate(self.waiting): if query.ref == ref: self.waiting.pop(i) query.result = args query.ready.set() return if self.get_setting('publish'): nerve.events.publish(topic=self.get_pathname() + '/' + ref, type='change', value=args) if self.get_setting('query'): notify_ref = self.get_setting('query').rstrip( '/') + '/' + ref + '/*' nerve.query(notify_ref, args)
def on_receive_code(self, code): if type(code) == dict: code = code['value'] if code.startswith('x:'): nerve.log("received invalid IR code " + code) return self.add_code_to_history(code) (_, remote_name, button_name) = self.get_button_name(code) if not self.program_mode: try: return self.query(code) except AttributeError: pass # TODO isn't this just for legacy support? We can remove this try: return nerve.query('/events/ir/irrecv/' + code) except AttributeError: nerve.log("No action set for IR code " + code)
def mute(self): nerve.query("/devices/mysensors/11/1/send_msg", 32, 0x281)
def voldown(self): nerve.query("/devices/mysensors/11/1/send_msg", 32, 0xC81) nerve.query("/devices/mysensors/11/1/send_msg", 32, 0xC81)
def volup(self): nerve.query("/devices/mysensors/11/1/send_msg", 32, 0x481) nerve.query("/devices/mysensors/11/1/send_msg", 32, 0x481)
def power(self): nerve.query("/devices/mysensors/11/1/send_msg", 32, 0xA81)
def mute(self): #self.serial.send("ir S 0xC41") nerve.query("/devices/mysensors/11/1/send_msg", 32, 0x281)
def cmd_query(self, args): ref = args.pop(0) if ref.startswith('/') or ref.startswith('http:'): self.print(nerve.query(ref, *args)) else: self.print(nerve.query(self.pwd + "/" + ref, *args))
def tuner(self): #self.serial.send("ir S 0x841") nerve.query("/devices/mysensors/11/1/send_msg", 32, 0x841)
def execute_query(self, querystr, **args): if querystr[0] != '/' and '://' not in querystr: querystr = self.get_setting('root') + '/' + querystr return nerve.query(querystr, **args)
def forward(self, notification): for ref in self.get_setting('forwards'): nerve.query(ref, notification)
def execute_query(self, querystr, **args): if querystr[0] != '/' and not querystr.startswith('http:'): querystr = self.get_setting('root') + '/' + querystr return nerve.query(querystr, **args)
def __call__(self, *args, **kwargs): target = self.get_setting('target') #return target(*args, **kwargs) return nerve.query(target, *args, **kwargs)
def __call__(self): return nerve.query(self.ref)
def voldown(self): #self.serial.send("ir S 0xC81") nerve.query("/devices/mysensors/11/1/send_msg", 32, 0xC81) nerve.query("/devices/mysensors/11/1/send_msg", 32, 0xC81)
def tape(self): nerve.query("/devices/mysensors/11/1/send_msg", 32, 0x4BB610EF)
def speaker_ab(self): nerve.query("/devices/mysensors/11/1/send_msg", 32, 0x4B3611EE)
def cmd_query(self, args): ref = args.pop(0) if ref.startswith('/') or '://' in ref: self.print(nerve.query(ref, *args)) else: self.print(nerve.query(self.pwd + "/" + ref, *args))
def tuner(self): nerve.query("/devices/mysensors/11/1/send_msg", 32, 0x4BB6D02F)
def __init__(self, **config): super().__init__(**config) self.client = nerve.query('/devices/irc')