diff --git a/config.py b/config.py index dd16d9c4..62d098bf 100644 --- a/config.py +++ b/config.py @@ -11,6 +11,13 @@ from models.translation.translation_languages import translatorEngine, translati from models.transcription.transcription_languages import transcription_lang from models.transcription.transcription_utils import getInputDevices, getOutputDevices, getDefaultInputDevice, getDefaultOutputDevice +json_serializable_vars = {} +def json_serializable(var_name): + def decorator(func): + json_serializable_vars[var_name] = func + return func + return decorator + def saveJson(path, key, value): with open(path, "r", encoding="utf-8") as fp: json_data = load(fp) @@ -28,6 +35,7 @@ class Config: cls._instance.load_config() return cls._instance + # Read Only @property def VERSION(self): return self._VERSION @@ -36,6 +44,27 @@ class Config: def PATH_CONFIG(self): return self._PATH_CONFIG + @property + def GITHUB_URL(self): + return self._GITHUB_URL + + @property + def BOOTH_URL(self): + return self._BOOTH_URL + + @property + def DOCUMENTS_URL(self): + return self._DOCUMENTS_URL + + @property + def MAX_MIC_ENERGY_THRESHOLD(self): + return self._MAX_MIC_ENERGY_THRESHOLD + + @property + def MAX_SPEAKER_ENERGY_THRESHOLD(self): + return self._MAX_SPEAKER_ENERGY_THRESHOLD + + # Read Write @property def ENABLE_TRANSLATION(self): return self._ENABLE_TRANSLATION @@ -73,6 +102,88 @@ class Config: self._ENABLE_FOREGROUND = value @property + def SOURCE_COUNTRY(self): + return self._SOURCE_COUNTRY + + @SOURCE_COUNTRY.setter + def SOURCE_COUNTRY(self, value): + if type(value) is str: + self._SOURCE_COUNTRY = value + + @property + def SOURCE_LANGUAGE(self): + return self._SOURCE_LANGUAGE + + @SOURCE_LANGUAGE.setter + def SOURCE_LANGUAGE(self, value): + if type(value) is str: + self._SOURCE_LANGUAGE = value + + @property + def TARGET_COUNTRY(self): + return self._TARGET_COUNTRY + + @TARGET_COUNTRY.setter + def TARGET_COUNTRY(self, value): + if type(value) is str: + self._TARGET_COUNTRY = value + + @property + def TARGET_LANGUAGE(self): + return self._TARGET_LANGUAGE + + @TARGET_LANGUAGE.setter + def TARGET_LANGUAGE(self, value): + if type(value) is str: + self._TARGET_LANGUAGE = value + + @property + def CHOICE_TRANSLATOR(self): + return self._CHOICE_TRANSLATOR + + @CHOICE_TRANSLATOR.setter + def CHOICE_TRANSLATOR(self, value): + if value in translatorEngine: + self._CHOICE_TRANSLATOR = value + + # Save Json Data + ## Main Window + @property + @json_serializable('SELECTED_TAB_NO') + def SELECTED_TAB_NO(self): + return self._SELECTED_TAB_NO + + @SELECTED_TAB_NO.setter + def SELECTED_TAB_NO(self, value): + if type(value) is str: + self._SELECTED_TAB_NO = value + saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + + @property + @json_serializable('SELECTED_TAB_YOUR_LANGUAGES') + def SELECTED_TAB_YOUR_LANGUAGES(self): + return self._SELECTED_TAB_YOUR_LANGUAGES + + @SELECTED_TAB_YOUR_LANGUAGES.setter + def SELECTED_TAB_YOUR_LANGUAGES(self, value): + if type(value) is dict: + self._SELECTED_TAB_YOUR_LANGUAGES = value + saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + + @property + @json_serializable('SELECTED_TAB_TARGET_LANGUAGES') + def SELECTED_TAB_TARGET_LANGUAGES(self): + return self._SELECTED_TAB_TARGET_LANGUAGES + + @SELECTED_TAB_TARGET_LANGUAGES.setter + def SELECTED_TAB_TARGET_LANGUAGES(self, value): + if type(value) is dict: + self._SELECTED_TAB_TARGET_LANGUAGES = value + saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) + + ## Config Window + @property + @json_serializable('TRANSPARENCY') def TRANSPARENCY(self): return self._TRANSPARENCY @@ -83,6 +194,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('APPEARANCE_THEME') def APPEARANCE_THEME(self): return self._APPEARANCE_THEME @@ -93,6 +205,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('UI_SCALING') def UI_SCALING(self): return self._UI_SCALING @@ -103,6 +216,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('FONT_FAMILY') def FONT_FAMILY(self): return self._FONT_FAMILY @@ -116,6 +230,7 @@ class Config: root.destroy() @property + @json_serializable('UI_LANGUAGE') def UI_LANGUAGE(self): return self._UI_LANGUAGE @@ -126,56 +241,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property - def CHOICE_TRANSLATOR(self): - return self._CHOICE_TRANSLATOR - - @CHOICE_TRANSLATOR.setter - def CHOICE_TRANSLATOR(self, value): - if value in translatorEngine: - self._CHOICE_TRANSLATOR = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - def SOURCE_LANGUAGE(self): - return self._SOURCE_LANGUAGE - - @SOURCE_LANGUAGE.setter - def SOURCE_LANGUAGE(self, value): - if type(value) is str: - self._SOURCE_LANGUAGE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - def SOURCE_COUNTRY(self): - return self._SOURCE_COUNTRY - - @SOURCE_COUNTRY.setter - def SOURCE_COUNTRY(self, value): - if type(value) is str: - self._SOURCE_COUNTRY = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - def TARGET_LANGUAGE(self): - return self._TARGET_LANGUAGE - - @TARGET_LANGUAGE.setter - def TARGET_LANGUAGE(self, value): - if type(value) is str: - self._TARGET_LANGUAGE = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - def TARGET_COUNTRY(self): - return self._TARGET_COUNTRY - - @TARGET_COUNTRY.setter - def TARGET_COUNTRY(self, value): - if type(value) is str: - self._TARGET_COUNTRY = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property + @json_serializable('CHOICE_MIC_HOST') def CHOICE_MIC_HOST(self): return self._CHOICE_MIC_HOST @@ -186,6 +252,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('CHOICE_MIC_DEVICE') def CHOICE_MIC_DEVICE(self): return self._CHOICE_MIC_DEVICE @@ -196,6 +263,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('INPUT_MIC_ENERGY_THRESHOLD') def INPUT_MIC_ENERGY_THRESHOLD(self): return self._INPUT_MIC_ENERGY_THRESHOLD @@ -206,6 +274,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD') def INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD(self): return self._INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD @@ -216,6 +285,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('INPUT_MIC_RECORD_TIMEOUT') def INPUT_MIC_RECORD_TIMEOUT(self): return self._INPUT_MIC_RECORD_TIMEOUT @@ -226,6 +296,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('INPUT_MIC_PHRASE_TIMEOUT') def INPUT_MIC_PHRASE_TIMEOUT(self): return self._INPUT_MIC_PHRASE_TIMEOUT @@ -236,6 +307,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('INPUT_MIC_MAX_PHRASES') def INPUT_MIC_MAX_PHRASES(self): return self._INPUT_MIC_MAX_PHRASES @@ -246,6 +318,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('INPUT_MIC_WORD_FILTER') def INPUT_MIC_WORD_FILTER(self): return self._INPUT_MIC_WORD_FILTER @@ -256,6 +329,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('CHOICE_SPEAKER_DEVICE') def CHOICE_SPEAKER_DEVICE(self): return self._CHOICE_SPEAKER_DEVICE @@ -268,6 +342,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('INPUT_SPEAKER_ENERGY_THRESHOLD') def INPUT_SPEAKER_ENERGY_THRESHOLD(self): return self._INPUT_SPEAKER_ENERGY_THRESHOLD @@ -278,6 +353,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD') def INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD(self): return self._INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD @@ -288,6 +364,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('INPUT_SPEAKER_RECORD_TIMEOUT') def INPUT_SPEAKER_RECORD_TIMEOUT(self): return self._INPUT_SPEAKER_RECORD_TIMEOUT @@ -298,6 +375,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('INPUT_SPEAKER_PHRASE_TIMEOUT') def INPUT_SPEAKER_PHRASE_TIMEOUT(self): return self._INPUT_SPEAKER_PHRASE_TIMEOUT @@ -308,6 +386,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('INPUT_SPEAKER_MAX_PHRASES') def INPUT_SPEAKER_MAX_PHRASES(self): return self._INPUT_SPEAKER_MAX_PHRASES @@ -318,6 +397,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('OSC_IP_ADDRESS') def OSC_IP_ADDRESS(self): return self._OSC_IP_ADDRESS @@ -328,6 +408,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('OSC_PORT') def OSC_PORT(self): return self._OSC_PORT @@ -338,6 +419,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('AUTH_KEYS') def AUTH_KEYS(self): return self._AUTH_KEYS @@ -350,6 +432,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, self.AUTH_KEYS) @property + @json_serializable('MESSAGE_FORMAT') def MESSAGE_FORMAT(self): return self._MESSAGE_FORMAT @@ -360,6 +443,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('ENABLE_AUTO_CLEAR_MESSAGE_BOX') def ENABLE_AUTO_CLEAR_MESSAGE_BOX(self): return self._ENABLE_AUTO_CLEAR_MESSAGE_BOX @@ -370,6 +454,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('ENABLE_NOTICE_XSOVERLAY') def ENABLE_NOTICE_XSOVERLAY(self): return self._ENABLE_NOTICE_XSOVERLAY @@ -380,6 +465,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('ENABLE_SEND_MESSAGE_TO_VRC') def ENABLE_SEND_MESSAGE_TO_VRC(self): return self._ENABLE_SEND_MESSAGE_TO_VRC @@ -390,6 +476,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property + @json_serializable('STARTUP_OSC_ENABLED_CHECK') def STARTUP_OSC_ENABLED_CHECK(self): return self._STARTUP_OSC_ENABLED_CHECK @@ -400,52 +487,7 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) @property - def GITHUB_URL(self): - return self._GITHUB_URL - - # @property - # def BREAK_KEYSYM_LIST(self): - # return self._BREAK_KEYSYM_LIST - - @property - def MAX_MIC_ENERGY_THRESHOLD(self): - return self._MAX_MIC_ENERGY_THRESHOLD - - @property - def MAX_SPEAKER_ENERGY_THRESHOLD(self): - return self._MAX_SPEAKER_ENERGY_THRESHOLD - - @property - def SELECTED_TAB_NO(self): - return self._SELECTED_TAB_NO - - @SELECTED_TAB_NO.setter - def SELECTED_TAB_NO(self, value): - if type(value) is str: - self._SELECTED_TAB_NO = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - def SELECTED_TAB_YOUR_LANGUAGES(self): - return self._SELECTED_TAB_YOUR_LANGUAGES - - @SELECTED_TAB_YOUR_LANGUAGES.setter - def SELECTED_TAB_YOUR_LANGUAGES(self, value): - if type(value) is dict: - self._SELECTED_TAB_YOUR_LANGUAGES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property - def SELECTED_TAB_TARGET_LANGUAGES(self): - return self._SELECTED_TAB_TARGET_LANGUAGES - - @SELECTED_TAB_TARGET_LANGUAGES.setter - def SELECTED_TAB_TARGET_LANGUAGES(self, value): - if type(value) is dict: - self._SELECTED_TAB_TARGET_LANGUAGES = value - saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - - @property + @json_serializable('ENABLE_LOGGER') def ENABLE_LOGGER(self): return self._ENABLE_LOGGER @@ -455,8 +497,8 @@ class Config: self._ENABLE_LOGGER = value saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) - # Config Window @property + @json_serializable('IS_CONFIG_WINDOW_COMPACT_MODE') def IS_CONFIG_WINDOW_COMPACT_MODE(self): return self._IS_CONFIG_WINDOW_COMPACT_MODE @@ -467,33 +509,58 @@ class Config: saveJson(self.PATH_CONFIG, inspect.currentframe().f_code.co_name, value) def init_config(self): - self._VERSION = "1.3.2" + # Read Only + self._VERSION = "2.0.0" self._PATH_CONFIG = os_path.join(os_path.dirname(sys.argv[0]), "config.json") + self._GITHUB_URL = "https://api.github.com/repos/misyaguziya/VRCT/releases/latest" + self._BOOTH_URL = "https://misyaguziya.booth.pm/" + self._DOCUMENTS_URL = "https://mzsoftware.notion.site/VRCT-Documents-be79b7a165f64442ad8f326d86c22246" + self._MAX_MIC_ENERGY_THRESHOLD = 2000 + self._MAX_SPEAKER_ENERGY_THRESHOLD = 4000 + + # Read Write self._ENABLE_TRANSLATION = False self._ENABLE_TRANSCRIPTION_SEND = False self._ENABLE_TRANSCRIPTION_RECEIVE = False self._ENABLE_FOREGROUND = False - self._TRANSPARENCY = 100 - self._APPEARANCE_THEME = "System" - self._UI_SCALING = "100%" - self._FONT_FAMILY = "Yu Gothic UI" - self._UI_LANGUAGE = "en" + + # Save Json Data self._CHOICE_TRANSLATOR = translatorEngine[0] self._SOURCE_LANGUAGE = "Japanese" self._SOURCE_COUNTRY = "Japan" self._TARGET_LANGUAGE = "English" self._TARGET_COUNTRY = "United States" + + ## Main Window + self._SELECTED_TAB_NO = "1" + self._SELECTED_TAB_YOUR_LANGUAGES = { + "1":"Japanese\n(Japan)", + "2":"Japanese\n(Japan)", + "3":"Japanese\n(Japan)", + } + self._SELECTED_TAB_TARGET_LANGUAGES = { + "1":"English\n(United States)", + "2":"English\n(United States)", + "3":"English\n(United States)", + } + + ## Config Window + self._TRANSPARENCY = 100 + self._APPEARANCE_THEME = "System" + self._UI_SCALING = "100%" + self._FONT_FAMILY = "Yu Gothic UI" + self._UI_LANGUAGE = "en" self._CHOICE_MIC_HOST = getDefaultInputDevice()["host"]["name"] self._CHOICE_MIC_DEVICE = getDefaultInputDevice()["device"]["name"] self._INPUT_MIC_ENERGY_THRESHOLD = 300 - self._INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD = True + self._INPUT_MIC_DYNAMIC_ENERGY_THRESHOLD = False self._INPUT_MIC_RECORD_TIMEOUT = 3 self._INPUT_MIC_PHRASE_TIMEOUT = 3 self._INPUT_MIC_MAX_PHRASES = 10 self._INPUT_MIC_WORD_FILTER = [] self._CHOICE_SPEAKER_DEVICE = getDefaultOutputDevice()["name"] self._INPUT_SPEAKER_ENERGY_THRESHOLD = 300 - self._INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD = True + self._INPUT_SPEAKER_DYNAMIC_ENERGY_THRESHOLD = False self._INPUT_SPEAKER_RECORD_TIMEOUT = 3 self._INPUT_SPEAKER_PHRASE_TIMEOUT = 3 self._INPUT_SPEAKER_MAX_PHRASES = 10 @@ -510,27 +577,7 @@ class Config: self._ENABLE_NOTICE_XSOVERLAY = False self._ENABLE_SEND_MESSAGE_TO_VRC = True self._STARTUP_OSC_ENABLED_CHECK = True - self._GITHUB_URL = "https://api.github.com/repos/misyaguziya/VRCT/releases/latest" - # self._BREAK_KEYSYM_LIST = [ - # "Delete", "Select", "Up", "Down", "Next", "End", "Print", - # "Prior","Insert","Home", "Left", "Clear", "Right", "Linefeed" - # ] - self._MAX_MIC_ENERGY_THRESHOLD = 2000 - self._MAX_SPEAKER_ENERGY_THRESHOLD = 4000 - self._SELECTED_TAB_NO = "1" - self._SELECTED_TAB_YOUR_LANGUAGES = { - "1":"Japanese\n(Japan)", - "2":"Japanese\n(Japan)", - "3":"Japanese\n(Japan)", - } - self._SELECTED_TAB_TARGET_LANGUAGES = { - "1":"English\n(United States)", - "2":"English\n(United States)", - "3":"English\n(United States)", - } self._ENABLE_LOGGER = False - - # Config Window self._IS_CONFIG_WINDOW_COMPACT_MODE = False def load_config(self): @@ -542,13 +589,9 @@ class Config: setattr(self, key, config[key]) with open(self.PATH_CONFIG, 'w', encoding="utf-8") as fp: - setter_methods = [ - name for name, obj in vars(type(self)).items() - if isinstance(obj, property) and obj.fset is not None - ] config = {} - for method in setter_methods: - config[method] = getattr(self, method) + for var_name, var_func in json_serializable_vars.items(): + config[var_name] = var_func(self) json_dump(config, fp, indent=4, ensure_ascii=False) config = Config() \ No newline at end of file