1- from .utils import here
1+ from .utils import here , run_command , comfy_mode
22from aiohttp import web
33from .log import mklog
4- import os
4+ import sys
55
66endlog = mklog ("mtb endpoint" )
77
8- #- ACTIONS
8+ # - ACTIONS
9+ import requirements
10+
11+
12+
13+ def ACTIONS_installDependency (dependency_names = None ):
14+ if dependency_names is None :
15+ return {"error" : "No dependency name provided" }
16+ endlog .debug (f"Received Install Dependency request for { dependency_names } " )
17+ reqs = []
18+ if comfy_mode == "embeded" :
19+ reqs = list (requirements .parse ((here / "reqs_portable.txt" ).read_text ()))
20+ else :
21+ reqs = list (requirements .parse ((here / "reqs.txt" ).read_text ()))
22+ print ([x .specs for x in reqs ])
23+ print (
24+ "\n " .join ([f"{ x .line } { '' .join (x .specs [0 ] if x .specs else '' )} " for x in reqs ])
25+ )
26+ for dependency_name in dependency_names :
27+ for req in reqs :
28+ if req .name == dependency_name :
29+ endlog .debug (f"Dependency { dependency_name } installed" )
30+ break
31+ return {"success" : True }
32+
933
1034def ACTIONS_getStyles (style_name = None ):
1135 from .nodes .conditions import StylesLoader
@@ -19,10 +43,7 @@ def ACTIONS_getStyles(style_name=None):
1943 if not key .startswith ("__" ) and key not in match_list
2044 }
2145 if style_name :
22- if style_name in filtered_styles :
23- return filtered_styles [style_name ]
24- else :
25- return {"error" : "Style not found" }
46+ return filtered_styles .get (style_name , {"error" : "Style not found" })
2647 return filtered_styles
2748 return {"error" : "No styles found" }
2849
@@ -35,7 +56,7 @@ async def do_action(request) -> web.Response:
3556
3657 endlog .debug (f"Received action request: { name } { args } " )
3758
38- method_name = "ACTIONS_" + name
59+ method_name = f "ACTIONS_{ name } "
3960 method = globals ().get (method_name )
4061
4162 if callable (method ):
@@ -53,16 +74,36 @@ async def do_action(request) -> web.Response:
5374
5475
5576# - HTML UTILS
77+
78+
79+ def dependencies_button (name , dependencies ):
80+ deps = "," .join ([f"'{ x } '" for x in dependencies ])
81+ return f"""
82+ <button class="dependency-button" onclick="window.mtb_action('installDependency',[{ deps } ])">Install { name } deps</button>
83+ """
84+
85+
5686def render_table (table_dict , sort = True , title = None ):
57- table_rows = ""
5887 table_dict = sorted (
5988 table_dict .items (), key = lambda item : item [0 ]
6089 ) # Sort the dictionary by keys
6190
62- for name , description in table_dict :
63- table_rows += f"<tr><td>{ name } </td><td>{ description } </td></tr>"
91+ table_rows = ""
92+ for name , item in table_dict :
93+ if isinstance (item , dict ):
94+ if "dependencies" in item :
95+ table_rows += f"<tr><td>{ name } </td><td>"
96+ table_rows += f"{ dependencies_button (name ,item ['dependencies' ])} "
97+
98+ table_rows += "</td></tr>"
99+ else :
100+ table_rows += f"<tr><td>{ name } </td><td>{ render_table (item )} </td></tr>"
101+ # elif isinstance(item, str):
102+ # table_rows += f"<tr><td>{name}</td><td>{item}</td></tr>"
103+ else :
104+ table_rows += f"<tr><td>{ name } </td><td>{ item } </td></tr>"
64105
65- html_response = f"""
106+ return f"""
66107 <div class="table-container">
67108 { "" if title is None else f"<h1>{ title } </h1>" }
68109 <table>
@@ -78,7 +119,6 @@ def render_table(table_dict, sort=True, title=None):
78119 </table>
79120 </div>
80121 """
81- return html_response
82122
83123
84124def render_base_template (title , content ):
@@ -98,6 +138,29 @@ def render_base_template(title, content):
98138 { css_content }
99139 </style>
100140 </head>
141+ <script type="module">
142+ import {{ api }} from '/scripts/api.js'
143+ const mtb_action = async (action, args) =>{{
144+ console.log(`Sending ${{action}} with args: ${{args}}`)
145+ }}
146+ window.mtb_action = async (action, args) =>{{
147+ console.log(`Sending ${{action}} with args: ${{args}} to the API`)
148+ const res = await api.fetchApi('/actions', {{
149+ method: 'POST',
150+ body: JSON.stringify({{
151+ name: action,
152+ args,
153+ }}),
154+ }})
155+
156+ const output = await res.json()
157+ console.debug(`Received ${{action}} response:`, output)
158+ if (output?.result?.error){{
159+ alert(`An error occured: {{output?.result?.error}}`)
160+ }}
161+ return output?.result
162+ }}
163+ </script>
101164 <body>
102165 <header>
103166 <a href="/">Back to Comfy</a>
@@ -117,5 +180,6 @@ def render_base_template(title, content):
117180 <!-- Shared footer content here -->
118181 </footer>
119182 </body>
183+
120184 </html>
121185 """
0 commit comments