From 538e45cc0eb696f78cfc56dbb8d3762c69c33bac Mon Sep 17 00:00:00 2001 From: marcelveldt Date: Wed, 16 Oct 2019 00:59:43 +0200 Subject: [PATCH] typo in dockerfile again --- Dockerfile | 3 -- music_assistant/config.py | 48 +++++++++++++++---------- music_assistant/web.py | 33 ++++++++--------- music_assistant/web/pages/config.vue.js | 8 +++++ 4 files changed, 52 insertions(+), 40 deletions(-) diff --git a/Dockerfile b/Dockerfile index b042502b..fb048f41 100755 --- a/Dockerfile +++ b/Dockerfile @@ -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 diff --git a/music_assistant/config.py b/music_assistant/config.py index ed49bac3..dd091d11 100755 --- a/music_assistant/config.py +++ b/music_assistant/config.py @@ -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: diff --git a/music_assistant/web.py b/music_assistant/web.py index 4b849aec..3f6b1290 100755 --- a/music_assistant/web.py +++ b/music_assistant/web.py @@ -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): ''' diff --git a/music_assistant/web/pages/config.vue.js b/music_assistant/web/pages/config.vue.js index 0bc9ff1d..c6b5eebf 100755 --- a/music_assistant/web/pages/config.vue.js +++ b/music_assistant/web/pages/config.vue.js @@ -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 () { -- 2.34.1