Пример #1
0
    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" })
Пример #2
0
    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" })
Пример #3
0
    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')
Пример #4
0
    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')
Пример #5
0
    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')
Пример #6
0
    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')
Пример #7
0
 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})
Пример #8
0
    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')
Пример #9
0
    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,))
Пример #10
0
    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')
Пример #11
0
    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")
Пример #12
0
def has_object(name):
    try:
        if nerve.get_object(name):
            return True
    except:
        pass
    return False
Пример #13
0
    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")
Пример #14
0
    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,))
Пример #15
0
def has_object(name):
    try:
        if nerve.get_object(name):
            return True
    except:
        pass
    return False
Пример #16
0
    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"})
Пример #17
0
    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)
Пример #18
0
    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)
Пример #19
0
 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)
Пример #20
0
 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)
Пример #21
0
 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" })
Пример #22
0
    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" })
Пример #23
0
    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" })
Пример #24
0
 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" })
Пример #25
0
    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>')
Пример #26
0
 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" })
Пример #27
0
 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" })
Пример #28
0
    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>')
Пример #29
0
    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)
Пример #30
0
    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)
Пример #31
0
    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')
Пример #32
0
    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')
Пример #33
0
    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')
Пример #34
0
    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'})
Пример #35
0
    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)
Пример #36
0
    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)
Пример #37
0
 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)
Пример #38
0
 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)
Пример #39
0
    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')
Пример #40
0
    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)
Пример #41
0
    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()
Пример #42
0
    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')
Пример #43
0
    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()
Пример #44
0
    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
        })
Пример #45
0
    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)
Пример #46
0
    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"})
Пример #47
0
    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)
Пример #48
0
    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" })
Пример #49
0
    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."})
Пример #50
0
    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()
Пример #51
0
    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" })
Пример #52
0
    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" })
Пример #53
0
        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))


Пример #54
0
 def acknowledge_all(self, request):
     notify = nerve.get_object(self.get_setting('device'))
     notify.acknowledge(-1)
     self.load_json_view(True)
Пример #55
0
    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)
Пример #56
0
 def clear_all(self, request):
     notify = nerve.get_object(self.get_setting('device'))
     notify.clear(-1)
     self.load_json_view(True)
Пример #57
0
 def sort_playlist(self, request):
     playlists = nerve.get_object(self.get_setting('playlists'))
     playlist_name = request.args['playlist']
     playlists.sort_playlist(playlist_name)