| 27 | }] |
| 28 | |
| 29 | class Live2DPuppetAvatarHandler(AvatarHandler): |
| 30 | key = "puppet" |
| 31 | base_url = "http://127.0.0.1:42943" |
| 32 | lockfile = None |
| 33 | def __init__(self, settings, path: str): |
| 34 | super().__init__(settings, path) |
| 35 | self._wait_js = threading.Event() |
| 36 | self._motions_raw = [] |
| 37 | self._expressions_raw = [] |
| 38 | self.webview_path = os.path.join(path, "avatars", "live2d", "web") |
| 39 | self.puppet_path = os.path.join(path, "avatars", "live2d", "DesktopPuppet") |
| 40 | self.models_dir = os.path.join(self.webview_path, "models") |
| 41 | self._puppet_process = None |
| 42 | |
| 43 | def get_available_models(self): |
| 44 | file_list = [] |
| 45 | for root, _, files in os.walk(self.models_dir): |
| 46 | for file in files: |
| 47 | if file.endswith('.model3.json') or file.endswith('.model.json'): |
| 48 | file_name = file.rstrip('.model3.json').rstrip('.model.json') |
| 49 | relative_path = os.path.relpath(os.path.join(root, file), self.models_dir) |
| 50 | file_list.append((file_name, relative_path)) |
| 51 | return file_list |
| 52 | |
| 53 | def get_extra_settings(self) -> list: |
| 54 | return [ |
| 55 | { |
| 56 | "key": "model", |
| 57 | "title": _("Live2D Model"), |
| 58 | "description": _("Live2D Model to use"), |
| 59 | "type": "combo", |
| 60 | "values": self.get_available_models(), |
| 61 | "default": "Arch/arch chan model0.model3.json", |
| 62 | "folder": os.path.abspath(self.models_dir), |
| 63 | "refresh": lambda x: self.settings_update(), |
| 64 | }, |
| 65 | { |
| 66 | "key": "update_model", |
| 67 | "title": "Update Puppet Program", |
| 68 | "description": "Update Puppet program", |
| 69 | "type": "button", |
| 70 | "default": "", |
| 71 | "label": "Update", |
| 72 | "callback": self.update_puppet, |
| 73 | |
| 74 | }, |
| 75 | { |
| 76 | "key": "start_window_server", |
| 77 | "title": "Automatically run puppet", |
| 78 | "description": "Automatically run puppet window server", |
| 79 | "type": "toggle", |
| 80 | "default": True |
| 81 | }, |
| 82 | { |
| 83 | "key": "fps", |
| 84 | "title": _("Lipsync Framerate"), |
| 85 | "description": _("Maximum amount of frames to generate for lipsync"), |
| 86 | "type": "range", |
nothing calls this directly
no outgoing calls
no test coverage detected