|
import os |
|
import zipfile |
|
import gradio as gr |
|
import requests |
|
import json |
|
from fastapi import FastAPI, Request |
|
from fastapi.responses import HTMLResponse |
|
from fastapi.staticfiles import StaticFiles |
|
from fastapi.templating import Jinja2Templates |
|
from pydantic import BaseModel |
|
from typing import Optional |
|
|
|
import modules.script_callbacks as script_callbacks |
|
from modules import shared, scripts |
|
|
|
|
|
class Item(BaseModel): |
|
|
|
image_url: str |
|
|
|
pose: str |
|
|
|
|
|
EXTENSION_DIR = scripts.basedir() |
|
DIST_DIR = os.path.join(EXTENSION_DIR, 'dist') |
|
|
|
|
|
def get_latest_release(owner, repo) -> Optional[str]: |
|
url = f"https://api.github.com/repos/{owner}/{repo}/releases/latest" |
|
response = requests.get(url) |
|
data = response.json() |
|
if response.status_code == 200: |
|
return data["tag_name"] |
|
else: |
|
return None |
|
|
|
|
|
def get_current_release() -> Optional[str]: |
|
if not os.path.exists(DIST_DIR): |
|
return None |
|
|
|
with open(os.path.join(DIST_DIR, "version.txt"), "r") as f: |
|
return f.read() |
|
|
|
|
|
def get_version_from_package_json(): |
|
with open(os.path.join(EXTENSION_DIR, "package.json")) as f: |
|
data = json.load(f) |
|
return f"v{data.get('version', None)}" |
|
|
|
|
|
def download_latest_release(owner, repo): |
|
url = f"https://api.github.com/repos/{owner}/{repo}/releases/latest" |
|
response = requests.get(url) |
|
data = response.json() |
|
|
|
if response.status_code == 200 and "assets" in data and len(data["assets"]) > 0: |
|
asset_url = data["assets"][0]["url"] |
|
headers = {"Accept": "application/octet-stream"} |
|
response = requests.get(asset_url, headers=headers, allow_redirects=True) |
|
|
|
if response.status_code == 200: |
|
filename = "dist.zip" |
|
with open(filename, "wb") as file: |
|
file.write(response.content) |
|
|
|
|
|
with zipfile.ZipFile(filename, "r") as zip_ref: |
|
zip_ref.extractall(DIST_DIR) |
|
|
|
|
|
os.remove(filename) |
|
else: |
|
print(f"Failed to download the file {url}.") |
|
else: |
|
print(f"Could not get the latest release or there are no assets {url}.") |
|
|
|
|
|
def need_update(current_version: Optional[str], package_version: str) -> bool: |
|
if current_version is None: |
|
return True |
|
|
|
def parse_version(version: str): |
|
return tuple(int(num) for num in version[1:].split('.')) |
|
|
|
return parse_version(current_version) < parse_version(package_version) |
|
|
|
|
|
def update_app(): |
|
"""Attempts to update the application to latest version""" |
|
owner = "huchenlei" |
|
repo = "sd-webui-openpose-editor" |
|
|
|
package_version = get_version_from_package_json() |
|
current_version = get_current_release() |
|
|
|
assert package_version is not None |
|
if need_update(current_version, package_version): |
|
download_latest_release(owner, repo) |
|
|
|
|
|
def mount_openpose_api(_: gr.Blocks, app: FastAPI): |
|
if not getattr(shared.cmd_opts, "disable_openpose_editor_auto_update", False): |
|
update_app() |
|
|
|
templates = Jinja2Templates(directory=DIST_DIR) |
|
app.mount( |
|
"/openpose_editor", |
|
StaticFiles(directory=DIST_DIR, html=True), |
|
name="openpose_editor", |
|
) |
|
|
|
@app.get("/openpose_editor_index", response_class=HTMLResponse) |
|
async def index_get(request: Request): |
|
return templates.TemplateResponse( |
|
"index.html", {"request": request, "data": {}} |
|
) |
|
|
|
@app.post("/openpose_editor_index", response_class=HTMLResponse) |
|
async def index_post(request: Request, item: Item): |
|
return templates.TemplateResponse( |
|
"index.html", {"request": request, "data": item.dict()} |
|
) |
|
|
|
|
|
script_callbacks.on_app_started(mount_openpose_api) |
|
|