Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -2,6 +2,32 @@ import requests
|
|
| 2 |
import gradio as gr
|
| 3 |
from datetime import datetime
|
| 4 |
import random
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
| 6 |
USERNAME = "openfree"
|
| 7 |
|
|
@@ -254,15 +280,55 @@ def get_vercel_deployments():
|
|
| 254 |
return []
|
| 255 |
|
| 256 |
def get_vercel_card(deployment, index):
|
| 257 |
-
"""
|
| 258 |
raw_url = deployment.get('url', '')
|
| 259 |
|
| 260 |
-
# URL 처리
|
| 261 |
if raw_url.startswith('http'):
|
| 262 |
-
url = raw_url
|
| 263 |
else:
|
| 264 |
-
|
| 265 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 266 |
|
| 267 |
# Hugging Face 스페이스 URL인 경우 직접 사용
|
| 268 |
if 'huggingface.co' in url:
|
|
@@ -685,4 +751,7 @@ with demo:
|
|
| 685 |
html_output = gr.HTML(value=get_user_spaces()) # 초기 로드 시 직접 함수 호출
|
| 686 |
|
| 687 |
if __name__ == "__main__":
|
|
|
|
|
|
|
|
|
|
| 688 |
demo.launch()
|
|
|
|
| 2 |
import gradio as gr
|
| 3 |
from datetime import datetime
|
| 4 |
import random
|
| 5 |
+
from selenium import webdriver
|
| 6 |
+
from selenium.common.exceptions import WebDriverException
|
| 7 |
+
from PIL import Image
|
| 8 |
+
from io import BytesIO
|
| 9 |
+
|
| 10 |
+
def take_screenshot(url):
|
| 11 |
+
"""웹사이트 스크린샷 촬영 함수"""
|
| 12 |
+
options = webdriver.ChromeOptions()
|
| 13 |
+
options.add_argument('--headless')
|
| 14 |
+
options.add_argument('--no-sandbox')
|
| 15 |
+
options.add_argument('--disable-dev-shm-usage')
|
| 16 |
+
|
| 17 |
+
try:
|
| 18 |
+
driver = webdriver.Chrome(options=options)
|
| 19 |
+
driver.set_window_size(1080, 720) # 스크린샷 크기 설정
|
| 20 |
+
driver.get(url)
|
| 21 |
+
driver.implicitly_wait(10)
|
| 22 |
+
screenshot = driver.get_screenshot_as_png()
|
| 23 |
+
return Image.open(BytesIO(screenshot))
|
| 24 |
+
except WebDriverException as e:
|
| 25 |
+
print(f"스크린샷 촬영 실패: {str(e)}")
|
| 26 |
+
return Image.new('RGB', (1, 1)) # 오류 시 빈 이미지 반환
|
| 27 |
+
finally:
|
| 28 |
+
if driver:
|
| 29 |
+
driver.quit()
|
| 30 |
+
|
| 31 |
|
| 32 |
USERNAME = "openfree"
|
| 33 |
|
|
|
|
| 280 |
return []
|
| 281 |
|
| 282 |
def get_vercel_card(deployment, index):
|
| 283 |
+
"""Vercel 배포 카드 HTML 생성 함수"""
|
| 284 |
raw_url = deployment.get('url', '')
|
| 285 |
|
| 286 |
+
# URL 처리
|
| 287 |
if raw_url.startswith('http'):
|
| 288 |
+
url = raw_url
|
| 289 |
else:
|
| 290 |
+
url = f"https://{raw_url}"
|
| 291 |
+
|
| 292 |
+
name = deployment.get('name', '이름 없는 프로젝트')
|
| 293 |
+
created = format_timestamp(deployment.get('created'))
|
| 294 |
+
state = deployment.get('state', 'N/A')
|
| 295 |
+
|
| 296 |
+
# 카드 ID 생성
|
| 297 |
+
card_id = f"vercel-card-{url.replace('.', '-').replace('/', '-')}"
|
| 298 |
+
|
| 299 |
+
|
| 300 |
+
# 스크린샷 이미지 가져오기
|
| 301 |
+
try:
|
| 302 |
+
screenshot = take_screenshot(url)
|
| 303 |
+
screenshot_html = f"""
|
| 304 |
+
<div style="width: 100%; height: 200px; overflow: hidden; border-radius: 10px; margin-bottom: 15px;">
|
| 305 |
+
<img src="data:image/png;base64,{screenshot}"
|
| 306 |
+
style="width: 100%; height: 100%; object-fit: cover;"
|
| 307 |
+
alt="{name} 스크린샷"/>
|
| 308 |
+
</div>
|
| 309 |
+
"""
|
| 310 |
+
except Exception as e:
|
| 311 |
+
print(f"스크린샷 처리 오류: {str(e)}")
|
| 312 |
+
screenshot_html = "" # 오류 시 스크린샷 영역 생략
|
| 313 |
+
|
| 314 |
+
# 나머지 카드 스타일링 코드는 기존과 동일...
|
| 315 |
+
return f"""
|
| 316 |
+
<div id="{card_id}" class="vercel-card"
|
| 317 |
+
style='border: none;
|
| 318 |
+
padding: 25px;
|
| 319 |
+
margin: 15px;
|
| 320 |
+
border-radius: 20px;
|
| 321 |
+
background-color: {get_pastel_color(index)};
|
| 322 |
+
box-shadow: 0 4px 15px rgba(0,0,0,0.1);'>
|
| 323 |
+
{screenshot_html}
|
| 324 |
+
<h3>{name}</h3>
|
| 325 |
+
<div style='margin: 15px 0;'>
|
| 326 |
+
<p>상태: {state}</p>
|
| 327 |
+
<p>생성일: {created}</p>
|
| 328 |
+
<p>URL: <a href="{url}" target="_blank">{url}</a></p>
|
| 329 |
+
</div>
|
| 330 |
+
</div>
|
| 331 |
+
"""
|
| 332 |
|
| 333 |
# Hugging Face 스페이스 URL인 경우 직접 사용
|
| 334 |
if 'huggingface.co' in url:
|
|
|
|
| 751 |
html_output = gr.HTML(value=get_user_spaces()) # 초기 로드 시 직접 함수 호출
|
| 752 |
|
| 753 |
if __name__ == "__main__":
|
| 754 |
+
demo = gr.Blocks()
|
| 755 |
+
with demo:
|
| 756 |
+
gr.HTML(value=get_user_spaces())
|
| 757 |
demo.launch()
|