Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -163,7 +163,7 @@ def run_task(task_id, src_bytes, tgt_bytes):
|
|
| 163 |
|
| 164 |
|
| 165 |
# ============================================================
|
| 166 |
-
# FastAPI + UI
|
| 167 |
# ============================================================
|
| 168 |
app = FastAPI(title="FaceSwap (GFPGAN-Lite)")
|
| 169 |
|
|
@@ -178,14 +178,12 @@ def home():
|
|
| 178 |
<title>FaceSwap</title>
|
| 179 |
<meta name="viewport" content="width=device-width,initial-scale=1">
|
| 180 |
<style>
|
| 181 |
-
body{background:#0e1525;color:
|
| 182 |
.container{max-width:1100px;margin:auto}
|
| 183 |
.flex{display:flex;gap:16px;flex-wrap:wrap}
|
| 184 |
-
.zone{flex:1;min-width:280px;border:2px dashed #ffffff33;padding:18px;
|
| 185 |
.preview img{max-width:100%;border-radius:10px}
|
| 186 |
button{padding:10px 18px;border-radius:10px;border:none;background:#6c5ce7;color:white;font-weight:600}
|
| 187 |
-
.loader{border:3px solid #ffffff33;border-top-color:#00cec9;border-radius:50%;width:18px;height:18px;animation:spin .8s linear infinite;display:inline-block}
|
| 188 |
-
@keyframes spin{to{transform:rotate(360deg)}}
|
| 189 |
</style>
|
| 190 |
</head>
|
| 191 |
<body>
|
|
@@ -201,45 +199,29 @@ Source Image
|
|
| 201 |
Target Image
|
| 202 |
</label>
|
| 203 |
</div>
|
| 204 |
-
<
|
| 205 |
-
<button id="go">Start</button>
|
| 206 |
-
<span id="status"></span>
|
| 207 |
-
<br><br>
|
| 208 |
<img id="out">
|
| 209 |
</div>
|
| 210 |
-
|
| 211 |
<script>
|
| 212 |
-
|
| 213 |
-
|
| 214 |
-
|
| 215 |
-
|
| 216 |
-
|
| 217 |
-
|
| 218 |
-
document.querySelectorAll(".zone")[0].onclick=()=>src.click();
|
| 219 |
-
document.querySelectorAll(".zone")[1].onclick=()=>tgt.click();
|
| 220 |
-
|
| 221 |
-
go.onclick=async()=>{
|
| 222 |
-
if(!src.files[0]||!tgt.files[0]){alert("Select images");return;}
|
| 223 |
-
status.innerHTML='Processing <span class="loader"></span>';
|
| 224 |
let fd=new FormData();
|
| 225 |
-
fd.append("source",src
|
| 226 |
-
fd.append("target",tgt
|
| 227 |
let r=await fetch("/swap-image",{method:"POST",body:fd});
|
| 228 |
let j=await r.json();
|
| 229 |
let id=j.task_id;
|
| 230 |
-
let
|
| 231 |
let s=await fetch("/task-status/"+id).then(r=>r.json());
|
| 232 |
if(s.status==="done"){
|
| 233 |
-
clearInterval(
|
| 234 |
-
out.src="/task-result/"+id;
|
| 235 |
-
status.innerHTML="Done";
|
| 236 |
-
}
|
| 237 |
-
if(s.status==="failed"){
|
| 238 |
-
clearInterval(poll);
|
| 239 |
-
status.innerHTML="Failed";
|
| 240 |
}
|
| 241 |
},1000);
|
| 242 |
-
}
|
| 243 |
</script>
|
| 244 |
</body>
|
| 245 |
</html>
|
|
|
|
| 163 |
|
| 164 |
|
| 165 |
# ============================================================
|
| 166 |
+
# FastAPI + FULL UI
|
| 167 |
# ============================================================
|
| 168 |
app = FastAPI(title="FaceSwap (GFPGAN-Lite)")
|
| 169 |
|
|
|
|
| 178 |
<title>FaceSwap</title>
|
| 179 |
<meta name="viewport" content="width=device-width,initial-scale=1">
|
| 180 |
<style>
|
| 181 |
+
body{background:#0e1525;color:#fff;font-family:Arial;margin:0;padding:20px}
|
| 182 |
.container{max-width:1100px;margin:auto}
|
| 183 |
.flex{display:flex;gap:16px;flex-wrap:wrap}
|
| 184 |
+
.zone{flex:1;min-width:280px;border:2px dashed #ffffff33;padding:18px;text-align:center;border-radius:10px;cursor:pointer}
|
| 185 |
.preview img{max-width:100%;border-radius:10px}
|
| 186 |
button{padding:10px 18px;border-radius:10px;border:none;background:#6c5ce7;color:white;font-weight:600}
|
|
|
|
|
|
|
| 187 |
</style>
|
| 188 |
</head>
|
| 189 |
<body>
|
|
|
|
| 199 |
Target Image
|
| 200 |
</label>
|
| 201 |
</div>
|
| 202 |
+
<button onclick="start()">Start</button>
|
|
|
|
|
|
|
|
|
|
| 203 |
<img id="out">
|
| 204 |
</div>
|
|
|
|
| 205 |
<script>
|
| 206 |
+
let src,tgt;
|
| 207 |
+
document.getElementById("src").onchange=e=>src=e.target.files[0];
|
| 208 |
+
document.getElementById("tgt").onchange=e=>tgt=e.target.files[0];
|
| 209 |
+
async function start(){
|
| 210 |
+
if(!src||!tgt){alert("Select images");return;}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 211 |
let fd=new FormData();
|
| 212 |
+
fd.append("source",src);
|
| 213 |
+
fd.append("target",tgt);
|
| 214 |
let r=await fetch("/swap-image",{method:"POST",body:fd});
|
| 215 |
let j=await r.json();
|
| 216 |
let id=j.task_id;
|
| 217 |
+
let t=setInterval(async()=>{
|
| 218 |
let s=await fetch("/task-status/"+id).then(r=>r.json());
|
| 219 |
if(s.status==="done"){
|
| 220 |
+
clearInterval(t);
|
| 221 |
+
document.getElementById("out").src="/task-result/"+id;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 222 |
}
|
| 223 |
},1000);
|
| 224 |
+
}
|
| 225 |
</script>
|
| 226 |
</body>
|
| 227 |
</html>
|