def add_media_items(self, request): operation = request.arg('operation') if not operation: raise nerve.ControllerError("'operation' field must be set") if not request.arg('media[]'): raise nerve.ControllerError("'media[]' field must be set") count = 0 medialib = nerve.get_object(self.get_setting('device')) media = medialib.get_media_queries(request.arg('media[]')) if operation == 'playnow': player = nerve.get_object(self.get_setting('player')) if len(media) > 0: player.play(media[0]['filename']) for media_item in media[1:]: player.enqueue(media_item['filename']) count = len(media) elif operation in [ 'enqueue', 'replace' ]: if not request.arg('playlist'): raise nerve.ControllerError("'playlist' field must be set") playlist = nerve.medialib.Playlist(request.arg('playlist')) if operation == 'replace': count = playlist.set_list(media) elif operation == 'enqueue': count = playlist.add_list(media) if count > 0: self.load_json_view({ 'notice': str(count) + " track(s) were added to playlist " + request.arg('playlist') }) else: self.load_json_view({ 'error': "No tracks were added" })
def search(self, request): medialib = nerve.get_object(self.get_setting('device')) playlists = nerve.get_object(self.get_setting('playlists')) data = { } data['medialib'] = medialib data['list_of_playlists'] = playlists.list() data['mode'] = request.arg('mode', default='album') data['order'] = request.arg('order', default='artist') data['offset'] = request.arg('offset', default=0) data['limit'] = request.arg('limit', default=0) data['search'] = request.arg('search', default='') data['tags'] = request.arg('tags', default='') data['recent'] = request.arg('recent', default=None) data['media_type'] = request.arg('media_type', default=None) """ if request.arg('mode'): data['media_list'] = medialib.search(data['mode'], data['order'], data['offset'], data['limit'], data['search'], data['recent'], data['media_type'], data['tags']) else: data['media_list'] = None """ self.load_template_view('nerve/medialib/views/search.blk.pyhtml', data, request) self.template_add_to_section('jsfiles', '/medialib/assets/js/medialib.js') self.template_add_to_section('cssfiles', '/medialib/assets/css/medialib.css')
def search(self, request): medialib = nerve.get_object(self.get_setting('device')) playlists = nerve.get_object(self.get_setting('playlists')) data = { } data['medialib'] = medialib data['list_of_playlists'] = playlists.get_playlist_list() data['mode'] = request.arg('mode', default='album') data['order'] = request.arg('order', default='artist') data['offset'] = request.arg('offset', default=0) data['limit'] = request.arg('limit', default=0) data['search'] = request.arg('search', default='') data['tags'] = request.arg('tags', default='') data['recent'] = request.arg('recent', default=None) data['media_type'] = request.arg('media_type', default=None) """ if request.arg('mode'): data['media_list'] = medialib.search(data['mode'], data['order'], data['offset'], data['limit'], data['search'], data['recent'], data['media_type'], data['tags']) else: data['media_list'] = None """ self.load_template_view('nerve/medialib/views/search.blk.pyhtml', data, request) self.template_add_to_section('jsfiles', '/medialib/assets/js/medialib.js') self.template_add_to_section('cssfiles', '/medialib/assets/css/medialib.css')
def index(self, request): medialib = nerve.get_object(self.get_setting('device')) playlists = nerve.get_object(self.get_setting('playlists')) playlist = request.args['playlist'] if 'playlist' in request.args else 'default' data = { } data['list_of_playlists'] = playlists.get_playlist_list() self.load_template_view('nerve/medialib/views/playlist.blk.pyhtml', data, request) self.template_add_to_section('jsfiles', '/medialib/assets/js/medialib.js') self.template_add_to_section('cssfiles', '/medialib/assets/css/medialib.css')
def index(self, request): medialib = nerve.get_object(self.get_setting('device')) playlists = nerve.get_object(self.get_setting('playlists')) playlist = request.args['playlist'] if 'playlist' in request.args else 'default' data = { } data['list_of_playlists'] = playlists.list() self.load_template_view('nerve/medialib/views/playlist.blk.pyhtml', data, request) self.template_add_to_section('jsfiles', '/medialib/assets/js/medialib.js') self.template_add_to_section('cssfiles', '/medialib/assets/css/medialib.css')
def toggle_program_mode(self, request): irremote = nerve.get_object('/devices/irremote') if irremote.program_mode: irremote.program_mode = False else: irremote.program_mode = True self.load_json_view({'program_mode': irremote.program_mode})
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 cmd_ls(self, args): flags = '' dirs = [ ] for arg in args[1:]: if arg.startswith('-'): flags += arg[1:] else: dirs.append(arg) if len(dirs) == 0: dirs.append(self.pwd) for dirname in dirs: directory = nerve.get_object(self.pwd + "/" + dirname if dirname[0] != '/' else dirname) if not directory: self.print(dirname + "/ not found") else: self.print(dirname + "/:") items = directory.keys_children() if 'a' in flags: items += directory.keys_attrs() else: items += directory.keys_queries() for itemname in sorted(items): item = getattr(directory, itemname) if isinstance(item, nerve.ObjectNode): self.print(" %s/" % (itemname,)) else: self.print(" %s" % (itemname,))
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")
def has_object(name): try: if nerve.get_object(name): return True except: pass return False
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")
def rename(self, request): nerve.users.require_group('admin') if request.reqtype != "POST": raise nerve.ControllerError("Unexpected request type: " + request.reqtype) # TODO you totally don't validate these names enough oldname = request.arg('oldname') newname = request.arg('newname') if not oldname or not nerve.has_object(oldname): raise nerve.ControllerError( "The directory you've specified is invalid.") if not newname: raise nerve.ControllerError("The new name given is invalid.") if nerve.has_object(newname): raise nerve.ControllerError( "An object of that name already exists.") obj = nerve.get_object(oldname) if not nerve.del_object(oldname): raise nerve.ControllerError("Unable to rename this object.") nerve.set_object(newname, obj) nerve.save_config() self.load_json_view({'notice': "Object renamed"})
def clear(self, request): if not request.arg('nids[]'): raise nerve.ControllerError("'nids[]' field must be set") notify = nerve.get_object(self.get_setting('device')) for nid in request.arg('nids[]'): notify.clear(int(nid)) self.load_json_view(True)
def get_saved_codes(self, request): irremote = nerve.get_object('/devices/irremote') data = {} data['remotelist'] = irremote.get_remote_names() data['codelist'] = irremote.get_saved_codes(request.arg('remote_name')) self.load_html_view('nerve/irremote/views/coderows.blk.pyhtml', data)
def cmd_cd(self, args): if len(args) > 1: if args[1][0] == '/': newpwd = args[1] else: newpwd = self.pwd + "/" + args[1] if nerve.get_object(newpwd): self.pwd = newpwd self.print(self.pwd)
def delete_playlist(self, request): playlists = nerve.get_object(self.get_setting('playlists')) playlist_name = request.args['playlist'] for name in playlists.list(): if name == playlist_name: nerve.medialib.Playlist.delete(playlist_name) self.load_json_view({ 'notice' : "Playlist deleted successfully" }) return self.load_json_view({ 'error' : "That playlist no longer exists" })
def create_playlist(self, request): playlists = nerve.get_object(self.get_setting('playlists')) playlist_name = request.args['playlist'] for name in playlists.get_playlist_list(): if name == playlist_name: raise nerve.ControllerError("A playlist by that name already exists") playlist = nerve.medialib.Playlist.create(playlist_name) self.load_json_view({ 'notice' : "Playlist created successfully" })
def create_playlist(self, request): playlists = nerve.get_object(self.get_setting('playlists')) playlist_name = request.args['playlist'] for name in playlists.list(): if name == playlist_name: raise nerve.ControllerError("A playlist by that name already exists") playlist = nerve.medialib.Playlist.create(playlist_name) self.load_json_view({ 'notice' : "Playlist created successfully" })
def delete_playlist(self, request): playlists = nerve.get_object(self.get_setting('playlists')) playlist_name = request.args['playlist'] for name in playlists.get_playlist_list(): if name == playlist_name: nerve.medialib.Playlist.delete(playlist_name) self.load_json_view({ 'notice' : "Playlist deleted successfully" }) return self.load_json_view({ 'error' : "That playlist no longer exists" })
def rehash(self, request): medialib = nerve.get_object(self.get_setting('device')) medialib.rehash() accept = request.get_header('accept') if 'application/json' in accept: self.load_json_view({ 'notice': "Rehashing database..." }) elif 'text/html' in accept: self.load_template_view(None, { }, request) self.template_add_to_section('content', '<h4>Rehashing database...</h4>')
def remove_tag(self, request): medialib = nerve.get_object(self.get_setting('device')) id = request.arg('id') tag = request.arg('tag') if tag.startswith('"'): tag = tag[1:] if tag.endswith('"'): tag = tag[:-1] medialib.remove_tag(id, tag) self.load_json_view({ 'notice': "Tags removed" })
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 graph(self, request): remain = request.get_slug().lstrip('/') # TODO if remain contains a / then raise an error datalogs = nerve.get_object('/devices/datalogs') data = { } data['datalog_name'] = remain data['datalog_list'] = [ name for name in datalogs.keys_children() ] self.load_template_view('nerve/datalog/views/graph.blk.pyhtml', data, request) self.template_add_to_section('jsfiles', '/datalog/assets/js/datalog.js') self.template_add_to_section('cssfiles', '/datalog/assets/css/datalog.css')
def search_youtube(self, request): medialib = nerve.get_object(self.get_setting('device')) playlists = nerve.get_object(self.get_setting('playlists')) data = { } data['list_of_playlists'] = playlists.get_playlist_list() data['media_list'] = None data['search'] = request.arg('search', default='') if data['search']: #apikey = 'AIzaSyCh7XyVVs4biXd-Rvnm71W5SdejRAK26M4' apikey = 'AIzaSyDYYxJMZAFV1hZjWjQAbjTS2FGEtF8n-IE' #url = "http://ajax.googleapis.com/ajax/services/search/video?v=1.0&rsz=large&q=%s" % (data['search'],) url = "https://www.googleapis.com/youtube/v3/search?part=snippet&q=%s&key=%s" % (urllib.parse.quote_plus(data['search']), apikey) r = requests.get(url) if r.text: data['media_list'] = json.loads(r.text) #print(json.dumps(data['media_list'], sort_keys=True, indent=4, separators=(',', ':'))) self.load_template_view('nerve/medialib/views/search_youtube.blk.pyhtml', data, request) self.template_add_to_section('jsfiles', '/medialib/assets/js/medialib.js') self.template_add_to_section('cssfiles', '/medialib/assets/css/medialib.css')
def search_youtube(self, request): medialib = nerve.get_object(self.get_setting('device')) playlists = nerve.get_object(self.get_setting('playlists')) data = { } data['list_of_playlists'] = playlists.list() data['media_list'] = None data['search'] = request.arg('search', default='') if data['search']: #apikey = 'AIzaSyCh7XyVVs4biXd-Rvnm71W5SdejRAK26M4' apikey = 'AIzaSyDYYxJMZAFV1hZjWjQAbjTS2FGEtF8n-IE' #url = "http://ajax.googleapis.com/ajax/services/search/video?v=1.0&rsz=large&q=%s" % (data['search'],) url = "https://www.googleapis.com/youtube/v3/search?part=snippet&q=%s&key=%s" % (urllib.parse.quote_plus(data['search']), apikey) r = requests.get(url) if r.text: data['media_list'] = json.loads(r.text) #print(json.dumps(data['media_list'], sort_keys=True, indent=4, separators=(',', ':'))) self.load_template_view('nerve/medialib/views/search_youtube.blk.pyhtml', data, request) self.template_add_to_section('jsfiles', '/medialib/assets/js/medialib.js') self.template_add_to_section('cssfiles', '/medialib/assets/css/medialib.css')
def delete_code(self, request): if request.reqtype != "POST": raise nerve.ControllerError("Unexpected request type: " + request.reqtype) code = request.arg('code') if not code: raise nerve.ControllerError( "You must provide the 'code' argument.") irremote = nerve.get_object('/devices/irremote') irremote.delete_code(code) self.load_json_view({'notice': code + ' has been deleted'})
def search_data(self, request): medialib = nerve.get_object(self.get_setting('device')) playlists = nerve.get_object(self.get_setting('playlists')) data = { } data['medialib'] = medialib data['list_of_playlists'] = playlists.list() data['mode'] = request.arg('mode', default='album') data['order'] = request.arg('order', default='artist') data['offset'] = request.arg('offset', default=0) data['limit'] = request.arg('limit', default=0) data['search'] = request.arg('search', default='') data['tags'] = request.arg('tags', default='') data['recent'] = request.arg('recent', default=None) data['media_type'] = request.arg('media_type', default=None) if request.arg('mode'): data['media_list'] = medialib.search(data['mode'], data['order'], data['offset'], data['limit'], data['search'], data['recent'], data['media_type'], data['tags']) else: data['media_list'] = None self.load_html_view('nerve/medialib/views/search-data.blk.pyhtml', data, request)
def search_data(self, request): medialib = nerve.get_object(self.get_setting('device')) playlists = nerve.get_object(self.get_setting('playlists')) data = { } data['medialib'] = medialib data['list_of_playlists'] = playlists.get_playlist_list() data['mode'] = request.arg('mode', default='album') data['order'] = request.arg('order', default='artist') data['offset'] = request.arg('offset', default=0) data['limit'] = request.arg('limit', default=0) data['search'] = request.arg('search', default='') data['tags'] = request.arg('tags', default='') data['recent'] = request.arg('recent', default=None) data['media_type'] = request.arg('media_type', default=None) if request.arg('mode'): data['media_list'] = medialib.search(data['mode'], data['order'], data['offset'], data['limit'], data['search'], data['recent'], data['media_type'], data['tags']) else: data['media_list'] = None self.load_html_view('nerve/medialib/views/search-data.blk.pyhtml', data, request)
def get_setting(self, name, typename=None): setting = super().get_setting(name, typename) if setting: return setting if name == 'parent': return None parentname = self.get_setting('parent') if not parentname: return None try: parent = nerve.get_object(parentname) except AttributeError: return None return parent.get_setting(name, typename)
def index(self, request): irremote = nerve.get_object('/devices/irremote') data = {} data['remotelist'] = irremote.get_remote_names() data['codelist'] = irremote.get_recent_codes() data['program_mode'] = irremote.program_mode self.load_template_view('nerve/irremote/views/codes.blk.pyhtml', data, request) self.template_add_to_section('jsfiles', '/irremote/assets/js/irremote.js') self.template_add_to_section('jsfiles', '/assets/js/formview.js') self.template_add_to_section('cssfiles', '/irremote/assets/css/irremote.css')
def get_recent_codes(self, request): irremote = nerve.get_object('/devices/irremote') try: last_update = float(request.args['last_update']) except: raise nerve.ControllerError( "You must provide the 'last_update' argument as a float." ) from None data = {} data['remotelist'] = irremote.get_remote_names() data['codelist'] = irremote.get_recent_codes(last_update, wait=60) self.load_html_view('nerve/irremote/views/coderows.blk.pyhtml', data)
def check_update(self): row = self.db.get_first_row('info', 'name,value', self.db.inline_expr('name', 'last_updated')) if row is None or float(row[1]) + 86400 < time.time(): self.run_update() return lasttime = float(row[1]) medialib = nerve.get_object('/modules/medialib') self.path = medialib.get_setting('medialib_dirs') for libpath in self.path: mtime = os.path.getmtime(libpath) # if the dir has changed since we last updated, it's been more than 10 minutes since our last update, and more than 2 minutes since the dir changed, then update if mtime > lasttime and mtime + 120 > time.time() and lasttime + 600 > time.time(): self.run_update()
def graph(self, request): remain = request.get_slug().lstrip('/') # TODO if remain contains a / then raise an error datalogs = nerve.get_object('/devices/datalogs') data = {} data['datalog_name'] = remain data['datalog_list'] = [name for name in datalogs.keys_children()] self.load_template_view('nerve/datalog/views/graph.blk.pyhtml', data, request) self.template_add_to_section('jsfiles', '/datalog/assets/js/datalog.js') self.template_add_to_section('cssfiles', '/datalog/assets/css/datalog.css')
def remove_remote(self, request): if request.reqtype != "POST": raise nerve.ControllerError("Unexpected request type: " + request.reqtype) remote_name = request.arg('remote_name') if not remote_name: raise nerve.ControllerError( "You must provide the 'remote_name' argument.") irremote = nerve.get_object('/devices/irremote') irremote.remove_remote(remote_name) self.load_json_view({ 'notice': "Remote " + remote_name + " has been removed.", 'remote_name': remote_name })
def update_playlist(self, request): medialib = nerve.get_object(self.get_setting('device')) playlist = nerve.medialib.Playlist(request.arg('playlist')) media_list = [ ] for media in playlist.get_list(): if not os.path.exists(media['filename']) and media['filename'].startswith('/'): selected = next((m for m in medialib.get_media_query(media) if int(m['duration']) == int(media['duration'])), None) if selected: nerve.log("Updating playlist {} with {}: {} - {} ({})".format(request.arg('playlist'), selected['id'], selected['artist'], selected['title'], selected['filename']), logtype='info') media['filename'] = selected['filename'] else: nerve.log("No media item found for {}: {} - {}".format(media['filename'], media['artist'], media['title']), logtype='warning') media_list.append(media) playlist.set_list(media_list)
def save_action(self, request): nerve.users.require_group('admin') if request.reqtype != "POST": raise nerve.ControllerError("Unexpected request type: " + request.reqtype) code = request.get_slug() if not code: raise nerve.ControllerError("You must provide a valid object name") irremote = nerve.get_object('/devices/irremote') defaults = nerve.ObjectNode.get_class_config_info( 'asyncs/PyCodeAsyncTask') config = defaults.validate(request.args) config['__type__'] = 'asyncs/PyCodeAsyncTask' irremote.set_action(code, config) self.load_json_view({'notice': "Action added"})
def edit(self, request): nerve.users.require_group('admin') path = request.get_slug() if not path: raise nerve.ControllerError("You must provide a valid object name") obj = nerve.get_object(path) if not obj: raise nerve.ControllerError("Object not found: " + path) form = FormView(obj.get_config_info(), obj.get_config_data(), '/config/save/' + path, submitback=True) if request.arg('dialog'): self.set_view(form) else: self.load_template_view(None, None, request) self.template_add_to_section('jsfiles', '/assets/js/formview.js') self.template_add_to_section('content', form)
def save(self, request): nerve.users.require_group('admin') if request.reqtype != "POST": raise nerve.ControllerError("Unexpected request type: " + request.reqtype) path = request.get_slug() if not path: raise nerve.ControllerError("You must provide a valid object name") print(path) print(request.args) obj = nerve.get_object(path) config = obj.get_config_info().validate(request.args) obj.update_config_data(config) nerve.save_config() self.load_json_view({ 'notice': "Saved successfully" })
def add_remote(self, request): if request.reqtype != "POST": raise nerve.ControllerError("Unexpected request type: " + request.reqtype) remote_name = request.arg('remote_name') if not remote_name: raise nerve.ControllerError( "You must provide the 'remote_name' argument.") irremote = nerve.get_object('/devices/irremote') if irremote.add_remote(remote_name): self.load_json_view({ 'notice': "Remote " + remote_name + " has been added.", 'remote_name': remote_name }) else: self.load_json_view( {'error': "A remote by that name already exists."})
def run(self): if self.get_setting('gateway'): self.handler = nerve.get_object(self.get_setting('gateway')) else: self.handler = WSGIHandler(**{'parent': '/servers/default'}) """ def application(environ, start_response): print(environ) start_response('200 OK', [('Content-Type', 'text/html')]) return [b"<b>hello world</b>"] self.handler = application """ tornado.log.enable_pretty_logging() self.container = tornado.wsgi.WSGIContainer(self.handler) self.server = tornado.httpserver.HTTPServer(self.container) self.server.listen(self.port) nerve.log('starting http(s) on port ' + str(self.port)) tornado.ioloop.IOLoop.current().start()
def modify_tags(self, request): medialib = nerve.get_object(self.get_setting('device')) if not request.arg('media[]'): raise nerve.ControllerError("'media[]' field must be set") if not request.arg('tags'): raise nerve.ControllerError("'tags' field must be set") tags = nerve.medialib.MediaLibDevice.split_tags(request.arg('tags')) media = medialib.get_media_queries(request.arg('media[]')) for media_item in media: for tag in tags: if tag[0] != '!': medialib.add_tag(media_item['id'], tag) else: medialib.remove_tag(media_item['id'], tag[1:]) if len(media) > 0: self.load_json_view({ 'notice': str(len(media)) + " track(s) tags modified" }) else: self.load_json_view({ 'error': "No tags were modified" })
def rename(self, request): nerve.users.require_group('admin') if request.reqtype != "POST": raise nerve.ControllerError("Unexpected request type: " + request.reqtype) # TODO you totally don't validate these names enough oldname = request.arg('oldname') newname = request.arg('newname') if not oldname or not nerve.has_object(oldname): raise nerve.ControllerError("The directory you've specified is invalid.") if not newname: raise nerve.ControllerError("The new name given is invalid.") if nerve.has_object(newname): raise nerve.ControllerError("An object of that name already exists.") obj = nerve.get_object(oldname) if not nerve.del_object(oldname): raise nerve.ControllerError("Unable to rename this object.") nerve.set_object(newname, obj) nerve.save_config() self.load_json_view({ 'notice': "Object renamed" })
nerve.Device.__init__(self, **config) self.serial = serial def power(self): self.serial.send("ir P 0x4004 0x100BCBD") def volup(self): self.serial.send("ir P 0x4004 0x1000405") def voldown(self): self.serial.send("ir P 0x4004 0x1008485") def ps3(self): self.serial.send("ir P 0x4004 0x100A0A1") self.serial.send("ir P 0x4004 0x1008889") def netbook(self): self.serial.send("ir P 0x4004 0x100A0A1") self.serial.send("ir P 0x4004 0x1004849") def computer(self): self.serial.send("ir P 0x4004 0x100A0A1") self.serial.send("ir P 0x4004 0x1004849") rgb = nerve.get_object('/devices/rgb') nerve.set_object('/devices/stereo', Stereo(rgb)) nerve.set_object('/devices/tv', Television(rgb))
def acknowledge_all(self, request): notify = nerve.get_object(self.get_setting('device')) notify.acknowledge(-1) self.load_json_view(True)
def list(self, request): notify = nerve.get_object(self.get_setting('device')) data = { } data['notifications'] = notify.list() self.load_html_view('nerve/notify/views/list-data.blk.pyhtml', data)
def clear_all(self, request): notify = nerve.get_object(self.get_setting('device')) notify.clear(-1) self.load_json_view(True)
def sort_playlist(self, request): playlists = nerve.get_object(self.get_setting('playlists')) playlist_name = request.args['playlist'] playlists.sort_playlist(playlist_name)