File size: 6,051 Bytes
a45ed83
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
import gradio as gr
import subprocess
import os
import shutil
import sys

target_paths = {
    "video": "/home/user/app/upload/source_and_edits/source.mp4",
    "image": "/home/user/app/upload/source_and_edits/ref.jpg",
    "config": "/home/user/app/upload/config/customize_train.yaml",
    "lora": "/homw/user/app/upload/lora/lora.pt",
    "output_l": "/home/user/app/outputs/train_motion_lora",
    "output_r": "/home/user/app/outputs/ref.mp4",
    "zip": "/home/user/app/outputs/train_motion_lora.zip",
}


def zip_outputs():
    if os.path.exists(target_paths["zip"]):
        os.remove(target_paths["zip"])
    shutil.make_archive(target_paths["zip"].replace(".zip", ""), 'zip', root_dir=target_paths["output_l"])
    return target_paths["zip"]

def output_video():
    if os.path.exists(target_paths["output_r"]):
        return target_paths["output_r"]
    return None 


def start_training_stream():
    process = subprocess.Popen(
        ["python", "main.py", "--config=" + target_paths["config"]],
        stdout=subprocess.PIPE,
        stderr=subprocess.STDOUT,
        text=True,
        bufsize=1,
        universal_newlines=True
    )
    
    output = []
    for line in process.stdout:
        output.append(line)
        yield "".join(output)

def install_i2vedit():
    try:
        import i2vedit
        print("i2vedit already installed")
    except ImportError:
        print("Installing i2vedit...")
        subprocess.check_call([sys.executable, "-m", "pip", "install", "-e", "./i2vedit"])
        print("i2vedit installed")


def install_package(package_name):
    try:
        result = subprocess.run(
            [sys.executable, "-m", "pip", "install", package_name],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
        )
        output = result.stdout + "\n" + result.stderr
        return output
    except Exception as e:
        return f"Error: {str(e)}"
    

def show_package(pkg_name):
    try:
        result = subprocess.run(
            [sys.executable, "-m", "pip", "show", pkg_name],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
        )
        return result.stdout if result.stdout else result.stderr
    except Exception as e:
        return str(e)
    

def uninstall_package(package_name):
    try:
        result = subprocess.run(
            [sys.executable, "-m", "pip", "uninstall", package_name, "-y"],
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
            text=True,
        )
        output = result.stdout + "\n" + result.stderr
        return output
    except Exception as e:
        return f"Error: {str(e)}"



def save_files(video_file, image_file, config_file, lora_file=None):
    os.makedirs(os.path.dirname(target_paths["video"]), exist_ok=True)
    os.makedirs(os.path.dirname(target_paths["config"]), exist_ok=True)

    shutil.copy(video_file.name, target_paths["video"])
    shutil.copy(image_file.name, target_paths["image"])
    shutil.copy(config_file.name, target_paths["config"])
    if lora_file:
        os.makedirs(os.path.dirname(target_paths["lora"]), exist_ok=True)
        shutil.copy(lora_file.name, target_paths["lora"])
    return "檔案已成功上傳並儲存!"


install_i2vedit()
install_package("huggingface_hub==0.25.1")
install_package("diffusers==0.25.1")
install_package("gradio==5.0.0")
uninstall_package("datasets")
print("package version set complete")


with gr.Blocks(theme=gr.themes.Origin()) as demo:
    gr.Markdown("## 請先上傳檔案")
    with gr.Row():
        video_input = gr.File(label="原始影片", file_types=[".mp4"])
        image_input = gr.File(label="編輯圖像", file_types=[".jpg", ".jpeg", ".png"])
        config_input = gr.File(label="Config 檔", file_types=[".yaml", ".yml"])
        lora_input = gr.File(label="LoRA 檔案", file_types=[".pt"])

    upload_button = gr.Button("上傳並儲存")
    output = gr.Textbox(label="狀態")


    gr.Markdown("## Training")
    with gr.Column():
        log_output = gr.Textbox(label="Training Log", lines=20)
        train_btn = gr.Button("Start Training")
 
    gr.Markdown("## Pip Installer")
    with gr.Column():
        with gr.Row():
            pkg_input = gr.Textbox(lines=1, placeholder="輸入想安裝的套件名稱,例如 diffusers 或 numpy==1.2.0")
            install_output = gr.Textbox(label="Install Output", lines=10)
        install_btn = gr.Button("Install Package")
    
    gr.Markdown("## Pip Uninstaller")
    with gr.Column():
        with gr.Row():
            pkg_input2 = gr.Textbox(lines=1, placeholder="輸入想解除安裝的套件名稱,例如 diffusers 或 numpy")
            uninstall_output = gr.Textbox(label="Uninstall Output", lines=10)
        uninstall_btn = gr.Button("Uninstall Package")
    
    gr.Markdown("## Pip show")
    with gr.Column():
        with gr.Row():
            show_input = gr.Textbox(label="輸入套件名稱(如 diffusers)")
            show_output = gr.Textbox(label="套件資訊", lines=10)
        show_btn = gr.Button("pip show")

    gr.Markdown("## Download lora")
    with gr.Column():
        file_output = gr.File(label="點擊下載", interactive=True)
        download_btn = gr.Button("下載lora")
    
    gr.Markdown("## Download results")
    with gr.Column():
        file_output2 = gr.File(label="點擊下載", interactive=True)
        download_btn2 = gr.Button("下載結果")

    show_btn.click(fn=show_package, inputs=show_input, outputs=show_output)
    download_btn.click(fn=zip_outputs, outputs=file_output)
    download_btn2.click(fn=output_video, outputs=file_output2)
    install_btn.click(fn=install_package, inputs=pkg_input, outputs=install_output)
    train_btn.click(fn=start_training_stream, outputs=log_output)
    uninstall_btn.click(fn=uninstall_package, inputs=pkg_input2, outputs=uninstall_output)
    upload_button.click(fn=save_files,inputs=[video_input, image_input, config_input, lora_input],outputs=output)
demo.launch()