typo in dockerfile again
authormarcelveldt <marcelvanderveldt@MacBook-Silvia.local>
Tue, 15 Oct 2019 22:59:43 +0000 (00:59 +0200)
committermarcelveldt <marcelvanderveldt@MacBook-Silvia.local>
Tue, 15 Oct 2019 22:59:43 +0000 (00:59 +0200)
Dockerfile
music_assistant/config.py
music_assistant/web.py
music_assistant/web/pages/config.vue.js

index b042502b92b0ad58ddf6131f0f7de21b60374867..fb048f417315fea2a5d6b60cb1ada2224010562a 100755 (executable)
@@ -17,9 +17,6 @@ RUN chmod a+x /usr/src/app/mass.py
 
 VOLUME ["/data"]
 
-COPY run.sh /run.sh
-RUN chmod +x /run.sh
-
 ENV mass_debug false
 ENV mass_datadir /data
 ENV mass_update false
index ed49bac3fe09504c4811f190ef9541a25b8c7211..dd091d11eb9fa84cf5c4e64316b62a00d92bc18d 100755 (executable)
@@ -8,20 +8,44 @@ from .utils import try_load_json_file, json, LOGGER
 from .constants import CONF_KEY_BASE, CONF_KEY_PLAYERSETTINGS, \
         CONF_KEY_MUSICPROVIDERS, CONF_KEY_PLAYERPROVIDERS, EVENT_CONFIG_CHANGED
 
+class WatchedDict(dict):
 
-class MassConfig(dict):
+    def __init__(self, mass, parent, savefunc, existing_dict=None):
+        self.mass = mass
+        self.parent = parent
+        self.savefunc = savefunc
+        if existing_dict:
+            for key, value in existing_dict.items():
+                self[key] = value
+    
+    def __setitem__(self, key, new_value):
+        # optional processing here
+        if key not in self:
+            if isinstance(new_value, dict):
+                new_value = WatchedDict(self.mass, key, self.savefunc, new_value)
+            super().__setitem__(key, new_value)
+        elif self[key] != new_value:
+            # value changed
+            super().__setitem__(key, new_value)
+            self[key] = new_value
+            self.mass.event_loop.create_task(
+                    self.mass.signal_event(EVENT_CONFIG_CHANGED, f"{self.parent}.{key}"))
+            self.savefunc()
+
+class MassConfig(WatchedDict):
     ''' Class which holds our configuration '''
 
     def __init__(self, mass):
         self.mass = mass
         self.loading = False
-        self[CONF_KEY_BASE] = {}
-        self[CONF_KEY_MUSICPROVIDERS] = {}
-        self[CONF_KEY_PLAYERPROVIDERS] = {}
-        self[CONF_KEY_PLAYERSETTINGS] = {}
+        self.savefunc = self.__save
+        self.parent = None
+        self[CONF_KEY_BASE] = WatchedDict(mass, None, self.__save)
+        self[CONF_KEY_MUSICPROVIDERS] = WatchedDict(mass, None, self.__save)
+        self[CONF_KEY_PLAYERPROVIDERS] = WatchedDict(mass, None, self.__save)
+        self[CONF_KEY_PLAYERSETTINGS] = WatchedDict(mass, None, self.__save)
         self.__load()
 
-
     @property
     def base(self):
         ''' return base config '''
@@ -55,18 +79,6 @@ class MassConfig(dict):
         self[base_key][conf_key] = new_conf
         return self[base_key][conf_key]
 
-    def __setitem__(self, key, new_value):
-        # optional processing here
-        if key not in self:
-            super().__setitem__(key, new_value)
-        elif self[key] != new_value:
-            # value changed
-            super().__setitem__(key, new_value)
-            self[key] = new_value
-            self.mass.event_loop.create_task(
-                    self.mass.signal_event(EVENT_CONFIG_CHANGED, self))
-            self.__save()
-
     def __save(self):
         ''' save config to file '''
         if self.loading:
index 4b849aec1c747295de1f6f86824eac19e485e473..3f6b1290c5df17d921b1bfbe839791bbf8b6f7ae 100755 (executable)
@@ -53,7 +53,7 @@ class Web():
         app.add_routes([web.get('/stream/{player_id}/{queue_item_id}', self.mass.http_streamer.stream)])
         app.add_routes([web.get('/api/search', self.search)])
         app.add_routes([web.get('/api/config', self.get_config)])
-        app.add_routes([web.post('/api/config', self.save_config)])
+        app.add_routes([web.post('/api/config/{key}/{subkey}', self.save_config)])
         app.add_routes([web.get('/api/players', self.players)])
         app.add_routes([web.get('/api/players/{player_id}', self.player)])
         app.add_routes([web.get('/api/players/{player_id}/queue', self.player_queue)])
@@ -265,24 +265,19 @@ class Web():
 
     async def save_config(self, request):
         ''' save (partial) config '''
-        LOGGER.debug('save config called from api')
-        new_config = await request.json()
-        config_changed = False
-        for key, value in self.mass.config.items():
-            if isinstance(value, dict):
-                for subkey, subvalue in value.items():
-                    if subkey in new_config[key]:
-                        if self.mass.config[key][subkey] != new_config[key][subkey]:
-                            config_changed = True
-                            self.mass.config[key][subkey] = new_config[key][subkey]
-            elif key in new_config:
-                if self.mass.config[key] != new_config[key]:
-                    config_changed = True
-                    self.mass.config[key] = new_config[key]
-        if config_changed:
-            self.mass.save_config()
-            await self.mass.signal_event('config_changed')
-        return web.Response(text='success')
+        conf_key = request.match_info.get('key')
+        conf_subkey = request.match_info.get('subkey')
+        new_values = await request.json()
+        LOGGER.debug(f'save config called for {conf_key}/{conf_subkey} - new value: {new_values}')
+        cur_values = self.mass.config[conf_key][conf_subkey]
+        result = {"success": True, "restart_required": False, "settings_changed": False}
+        if cur_values != new_values:
+            # config changed
+            result["settings_changed"] = True
+            self.mass.config[conf_key][conf_subkey] = new_values
+            if conf_key != "player_settings":
+                result["restart_required"] = True
+        return web.json_response(result)
 
     async def json_rpc(self, request):
         ''' 
index 0bc9ff1d6c3a4c9832ea69084f70d3b7587c9b8d..c6b5eebf130395fc4ce2765f2fd0c7e66274128b 100755 (executable)
@@ -138,6 +138,14 @@ var Config = Vue.component('Config', {
     confChanged(key, subkey, newvalue) {
       console.log(key + "/" + subkey + " changed!");
       console.log(newvalue);
+      axios
+        .post('/api/config/'+key+'/'+subkey, newvalue)
+        .then(result => {
+          console.log(result);
+        })
+        .catch(error => {
+          console.log("error", error);
+        });
 
     },
     getPlayers () {