Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
Update app.py
Browse files
app.py
CHANGED
@@ -279,238 +279,6 @@ def send_to_sandbox(code):
|
|
279 |
"""
|
280 |
|
281 |
|
282 |
-
theme = gr.themes.Soft()
|
283 |
-
|
284 |
-
def load_json_data():
|
285 |
-
# ํ๋์ฝ๋ฉ๋ ๋ฐ์ดํฐ ๋ฐํ
|
286 |
-
return [
|
287 |
-
{
|
288 |
-
"name": "[๊ฒ์] ๋ณด์ ํกํก ๊ฒ์",
|
289 |
-
"image_url": "data:image/gif;base64," + get_image_base64('jewel.gif'), # mouse.gif ์ฌ์ฉ
|
290 |
-
"prompt": "์ด ๊ฒ์ ๊ตฌ์ฑ ํ๋กฌํํธ๋ https://huggingface.co/spaces/openfree/ifbhdc ์ฐธ์กฐ"
|
291 |
-
},
|
292 |
-
{
|
293 |
-
"name": "[ํํ์ด์ง] AI ์คํํธ์
",
|
294 |
-
"image_url": "data:image/png;base64," + get_image_base64('home.png'), # mouse.gif ์ฌ์ฉ
|
295 |
-
"prompt": "๋๋ฉ ํ์ด์ง๋ฅผ ๋ง๋ค์ด๋ผ. ์ ๋ฌธ๊ฐ ์ ์ ํํ์ ๋ฉ์ง ๋น์ฃผ์ผ๋ก ๊ตฌ์ฑ,์ด๋ชจ์ง๋ฅผ ์ ์ ํ ํ์ฉํ๊ณ ๋ค์์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ฌ ๋ฐ์ํ๋๋ก ํ๋ผ.๋ง์ฐ์ค-I๋ ์ฌ์ฉ์๊ฐ ์ํ๋ ์น ์๋น์ค๋ฅผ ํ๋กฌํํธ๋ก ์
๋ ฅํ๋ฉด 60์ด ์ด๋ด์ ์ค์ ์๋ํ๋ ์น ์๋น์ค๋ฅผ ์๋ ์์ฑํ๋ ๋๊ตฌ๋ค. ๋ง์ฐ์ค-I์ ์ฃผ์ ๊ธฐ๋ฅ์ โฒ์ํด๋ฆญ ์ค์๊ฐ ๋ฐฐํฌ โฒ์ค์๊ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ โฒ40์ฌ ๊ฐ์ง ์ฆ์ ์ ์ฉ ํ
ํ๋ฆฟ โฒ์ค์๊ฐ ์์ ๋ฑ์ด๋ค. MBTI ํ
์คํธ, ํฌ์ ๊ด๋ฆฌ ๋๊ตฌ, ํ
ํธ๋ฆฌ์ค ๊ฒ์ ๋ฑ ๋ค์ํ ํ
ํ๋ฆฟ์ ์ ๊ณตํด ๋น๊ฐ๋ฐ์๋ ์ฆ์ ํ์ฉํ ์ ์๋ค."
|
296 |
-
},
|
297 |
-
{
|
298 |
-
"name": "[์ฌ๋ฆฌ] MBTI ์ง๋จ ์๋น์ค",
|
299 |
-
"image_url": "data:image/png;base64," + get_image_base64('mbti.png'), # mbti.png ์ฌ์ฉ
|
300 |
-
"prompt": "MBTI ์ง๋จ์ ์ํด 15๊ฐ์ ์ง๋ฌธ๊ณผ ๊ฐ๊ด์ ๋ต๋ณ์ ํตํด MBTI ์ง๋จ ๊ฒฐ๊ณผ ๋ฐ ํด๋น ์ฑ๊ฒฉ์ ๋ํ ์์ธํ ๊ฒฐ๊ณผ๋ฅผ ์ถ๋ ฅํ๋ผ"
|
301 |
-
},
|
302 |
-
{
|
303 |
-
"name": "[๋์ ๋ณด๋] ํฌ์ ํฌํธํด๋ฆฌ์ค ๋์๋ณด๋",
|
304 |
-
"image_url": "data:image/png;base64," + get_image_base64('dash.png'), # mouse.gif ์ฌ์ฉ
|
305 |
-
"prompt": "Create an interactive dashboard with Chart.js showing different types of charts (line, bar, pie) with smooth animations. Include buttons to switch between different data views.ํฌ์ ํฌํธํด๋ฆฌ์ค๋ฅผ ๋ถ์ํ์ฌ ์ํ๋, ์์ต๋ฅ , ์์ฐ ๋ฐฐ๋ถ์ ์๊ฐํํ๋ ํฌ์ ๊ด๋ฆฌ ๋๊ตฌ๋ฅผ ๋ง๋์ธ์."
|
306 |
-
},
|
307 |
-
{
|
308 |
-
"name": "[๋ฉํฐ๋ชจ๋ฌ] ์ค๋์ค ๋น์ฃผ์ผ๋ผ์ด์ ",
|
309 |
-
"image_url": "data:image/png;base64," + get_image_base64('audio.png'), # mouse.gif ์ฌ์ฉ
|
310 |
-
"prompt": "Web Audio API์ Canvas๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋์ค ๋น์ฃผ์ผ๋ผ์ด์ ๋ฅผ ์ ์ํด ๋ณด์ธ์. ์์
์ฃผํ์ ๋ฐ์ดํฐ์ ๋ฐ์ํ๋ ๋์ ์ธ ๋ง๋๋ค์ด ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์
์ผ๋ก ์์ง์ด๋๋ก ๊ตฌํํด์ผ ํฉ๋๋ค. ๋ํ ์ฌ์/์ผ์ ์ ์ง ์ปจํธ๋กค๊ณผ ์์ ํ
๋ง ์ ํ ๊ธฐ๋ฅ๋ ํฌํจํ์ธ์."
|
311 |
-
},
|
312 |
-
{
|
313 |
-
"name": "[๊ฒ์] ์ฒด์ค ๊ฒ์",
|
314 |
-
"image_url": "data:image/png;base64," + get_image_base64('chess.png'), # mouse.gif ์ฌ์ฉ
|
315 |
-
"prompt": "์ฒด์ค ๊ฒ์: ์ฒด์ค ๊ฒ์์ ๋ฃฐ์ ์ ํํ๊ฒ ์๋ณํ๊ณ ์ ์ฉํ๋ผ, ์๋๋ฐฉ์ auto๋ก ๊ฒ์์ ์งํํ๋ผ"
|
316 |
-
},
|
317 |
-
{
|
318 |
-
"name": "[๊ฒ์] ๋ฒฝ๋๊นจ๊ธฐ ๊ฒ์",
|
319 |
-
"image_url": "data:image/png;base64," + get_image_base64('alcaroid.png'), # mouse.gif ์ฌ์ฉ
|
320 |
-
"prompt": "๋ฒฝ๋๊นจ๊ธฐ ๊ฒ์"
|
321 |
-
},
|
322 |
-
{
|
323 |
-
"name": "[Fun] ํ๋ก์นด๋ ์ด์ธ",
|
324 |
-
"image_url": "data:image/png;base64," + get_image_base64('tarot.png'), # mouse.gif ์ฌ์ฉ
|
325 |
-
"prompt": "ํ๋ก์นด๋ ์ด์ธ๋ฅผ ์ ์น๋๊ฒ์ ์์ฑํ๋ผ. ์์ฃผ ์์ธํ๊ณ ์ ๋ฌธ์ ์ด๋ฉด์ ์ฝ๊ณ ๊ธธ๊ฒ ๋ต๋ณํ๋ผ. ๋ชจ๋ ๋ต๋ณ๊ณผ ์ค๋ช
์ ํ๊ธ๋ก ํ๋ผ"
|
326 |
-
},
|
327 |
-
{
|
328 |
-
"name": "[Fun] AI ์๋ฆฌ์ฌ",
|
329 |
-
"image_url": "data:image/png;base64," + get_image_base64('cook.png'), # mouse.gif ์ฌ์ฉ
|
330 |
-
"prompt": "๋ค์ํ ์์ ์ฌ๋ฃ 10๊ฐ๋ฅผ ์ ์ํ๊ณ , ๊ทธ์ค ์ ํํ ์ฌ๋ฃ ์นด๋๋ฅผ '์๋ฆฌ ๋๋น'์์ ์ง์ด๋ฃ๊ณ '์๋ฆฌ'๋ฅผ ํด๋ฆญํ๋ฉด, ๋ฐ๋์ ์ ํํ ์ฌ๋ฃ๋ก ๋ง๋ค ์ ์๋ ์๋ฆฌ์ ๋ ์ํผ๋ฅผ ์ถ๋ ฅํ์ฌ์ผ ํ๋ฉฐ ์๋ฆฌ ๋ ์ํผ ํฌ๋กค๋ง ์ด๋ ๊ฒ์์ ํตํด ์ ์ฉํ๋ผ"
|
331 |
-
},
|
332 |
-
{
|
333 |
-
"name": "[๋ฉํฐ๋ชจ๋ฌ] ํ
์คํธ๋ก ์์ฑ ์์ฑ ๋ฐ ์กฐ์ ",
|
334 |
-
"image_url": "data:image/png;base64," + get_image_base64('tts.png'), # mouse.gif ์ฌ์ฉ
|
335 |
-
"prompt": "ํ
์คํธ๋ฅผ ์์ฑ์ผ๋ก ๋ณํํ๊ณ , ์์ฑ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์๊ฐ์ผ๋ก ์กฐ์ ํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ์ธ์."
|
336 |
-
},
|
337 |
-
{
|
338 |
-
"name": "[ํ์ต] 3D ๋ถ์ ์๋ฎฌ๋ ์ด์
",
|
339 |
-
"image_url": "data:image/png;base64," + get_image_base64('3ds.png'), # mouse.gif ์ฌ์ฉ
|
340 |
-
"prompt": "Three.js๋ก 3D ๋ถ์ ๊ตฌ์กฐ(์ฃผ์ ๋ถ์๋ค์ ์ ํํ ์ ์๊ฒ)๋ฅผ ์๊ฐํํ์ธ์. ํ์ , ์ค, ์์ ์ ๋ณด ํ์ ๊ธฐ๋ฅ๊ณผ ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ฅผ ๊ตฌํํ์ธ์."
|
341 |
-
},
|
342 |
-
{
|
343 |
-
"name": "[์ปดํฌ๋ํธ] ์ด๋ฉ์ผ ํ์๊ฐ์
๋ฐ ๋ก๊ทธ์ธ",
|
344 |
-
"image_url": "data:image/png;base64," + get_image_base64('login.png'), # mouse.gif ์ฌ์ฉ
|
345 |
-
"prompt": "์ด๋ฉ์ผ ํ์๊ฐ์
& ๋ก๊ทธ์ธ ์นํ์ด์ง๋ฅผ ๋ง๋ค์ด์ฃผ์ธ์. ๋ค์ ์๊ตฌ์ฌํญ์ ๋ฐ์ํด์ฃผ์ธ์: 1. ๋์์ธ - ๋ชจ๋ํ๊ณ ๋ฏธ๋๋ฉํ UI/UX - ๋ฐ์ํ ๋ ์ด์์ - ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์
ํจ๊ณผ - ์ ์ ํ ํผ validation ํผ๋๋ฐฑ 2. ํ์๊ฐ์
๊ธฐ๋ฅ 3. ๋ก๊ทธ์ธ ๊ธฐ๋ฅ - ์ด๋ฉ์ผ/๋น๋ฐ๋ฒํธ ์
๋ ฅ - ์๋๋ก๊ทธ์ธ ๊ธฐ๋ฅ - ๋น๋ฐ๋ฒํธ ์ฐพ๊ธฐ ๋งํฌ - ๋ก๊ทธ์ธ ์คํจ์ ์๋ฌ ๋ฉ์์ง - ๋ก๊ทธ์ธ ์ฑ๊ณต์ ํ์ ๋ฉ์์ง "
|
346 |
-
},
|
347 |
-
{
|
348 |
-
"name": "[์ฌ๋ฆฌ] ๋์ ์ฌ๋ฆฌ์ํ ํด์ฆ ",
|
349 |
-
"image_url": "data:image/png;base64," + get_image_base64('simri.png'),
|
350 |
-
"prompt": "๋ค์ํ ์ฌ๋ฆฌ ์ํ ํ์
์ ์ํ ๊ฐ๊ด์ ๋ฌธ์ ์ถ์ ํ๊ณ , ์ ํ ๊ฒฐ๊ณผ์ ๋ํ ์ฌ๋ฆฌํ์ ํด์ค์ ํด์ค. ์) ๊ธธ์ ๊ฐ๋ ๋น์ ์ด ๋ง๋ ๋๋ฌผ์
๋๋ค. 1) ๊ฐ 2) ์ฌ์ 3) ๊ณฐ 4) ๊ณ ์์ด "
|
351 |
-
},
|
352 |
-
{
|
353 |
-
"name": "[Fun] ํ์ด์ ๋ฃฐ๋ ",
|
354 |
-
"image_url": "data:image/png;base64," + get_image_base64('roolet.png'), # mouse.gif ์ฌ์ฉ
|
355 |
-
"prompt": "ํ์ด์ ์ํ ๋ฃฐ๋ ์ด ๋น ๋ฅด๊ฒ ๋์๊ฐ๊ณ , ๋ง์ฐ์ค๋ก ํ์ด ๋ฐ์ฌ ๋ฒํผ ๋๋ฅด๋ฉด ๋ฃฐ๋ ์ ๋ฒํธ์ ๋๋คํ๊ฒ ๋ง๋๋ค. ๊ฐ ๋ฒํธ์ ์๊ธ์ด '๊ฝ' ~ '100๋ง์' ๊น์ง ๋๋คํ๊ฒ ๋ฐฐ์น๋์ด ์๋ค. shoot ์ ํ๋ ๋ฒํธ์ ๋ฐ๋ผ ํด๋น ๋ฒํธ์ ๋ฐฐ์น๋ ์๊ธ ์ก์๋ ์ถ๋ ฅํ๋ผ"
|
356 |
-
},
|
357 |
-
{
|
358 |
-
"name": "[๊ฒ์] ํ
ํธ๋ฆฌ์ค ๊ฒ์",
|
359 |
-
"image_url": "data:image/png;base64," + get_image_base64('127.png'),
|
360 |
-
"prompt": "๊ณ ์ ํ
ํธ๋ฆฌ์ค ๊ฒ์์ ๋ง๋์ธ์. ์คํํธ์ ๋ฆฌ์คํํธ ๋ฒํผ์ ํฌํจํ์ธ์. ํ
ํธ๋ฆฌ์ค์ ๊ท์น์ ์ ๋ฐ๋ผ์ผํฉ๋๋ค."
|
361 |
-
},
|
362 |
-
|
363 |
-
{
|
364 |
-
"name": "[๊ฒ์] ์นด๋ ๊ธฐ์ต ๊ฒ์",
|
365 |
-
"image_url": "data:image/png;base64," + get_image_base64('112.png'),
|
366 |
-
"prompt": "Create a classic memory matching card game with flip animations. Include a scoring system, timer, and difficulty levels. Add satisfying match/mismatch animations and sound effects using Web Audio API."
|
367 |
-
}, #์ฌ๊ธฐ๊น์ง ๋ฒ ์คํธ(12๊ฑด) ์ ์ฉ ๋์
|
368 |
-
{
|
369 |
-
"name": "[๋๊ตฌ] ์ธํฐ๋ํฐ๋ธ ์ค์ผ์ฅด๋ฌ",
|
370 |
-
"image_url": "data:image/png;base64," + get_image_base64('122.png'),
|
371 |
-
"prompt": "๋๋๊ทธ ์ค ๋๋กญ์ผ๋ก ์ผ์ ์ ๊ด๋ฆฌํ ์ ์๋ ๋ฌ๋ ฅ์ ๋ง๋์ธ์. ์ ๋๋ฉ์ด์
ํจ๊ณผ์ ์ผ์ ํํฐ๋ง ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ธ์."
|
372 |
-
},
|
373 |
-
{
|
374 |
-
"name": "[๊ฒ์] ํ์ ๊ฒ์",
|
375 |
-
"image_url": "data:image/png;base64," + get_image_base64('123.png'),
|
376 |
-
"prompt": "๋จ์ด์ง๋ ๋จ์ด๋ฅผ ํ์ดํํ์ฌ ์ ์๋ฅผ ์ป๋ ๊ฒ์์ ๋ง๋์ธ์. ๋์ด๋ ์กฐ์ ๊ณผ ํจ๊ณผ์์ ์ถ๊ฐํ์ธ์."
|
377 |
-
},
|
378 |
-
{
|
379 |
-
"name": "[์ ๋๋ฉ์ด์
] ์ธํฐ๋ ํฐ๋ธ STARs",
|
380 |
-
"image_url": "data:image/png;base64," + get_image_base64('135.png'),
|
381 |
-
"prompt": "Interactive Stars: Watch stars and constellations appear in the night sky as you move your mouse."
|
382 |
-
},
|
383 |
-
{
|
384 |
-
"name": "[3D] ์งํ ์์ฑ๊ธฐ",
|
385 |
-
"image_url": "data:image/png;base64," + get_image_base64('131.png'),
|
386 |
-
"prompt": "Three.js๋ก ํ๋ก์์ ๋ด ์งํ์ ์์ฑํ์ธ์. ๊ณ ๋, ํ
์ค์ฒ, ๋ฌผ ํจ๊ณผ๋ฅผ ์ค์๊ฐ์ผ๋ก ์กฐ์ ํ ์ ์๊ฒ ๋ง๋์ธ์."
|
387 |
-
},
|
388 |
-
{
|
389 |
-
"name": "[3D] ํ
์คํธ ์ ๋๋ฉ์ดํฐ",
|
390 |
-
"image_url": "data:image/png;base64," + get_image_base64('132.png'),
|
391 |
-
"prompt": "Three.js๋ก 3D ํ
์คํธ ์ ๋๋ฉ์ด์
์ ๋ง๋์ธ์. ๋ค์ํ ๋ณํ ํจ๊ณผ์ ๋ฌผ๋ฆฌ ๊ธฐ๋ฐ ์
์ ํจ๊ณผ๋ฅผ ๊ตฌํํ์ธ์."
|
392 |
-
},
|
393 |
-
{
|
394 |
-
"name": "[์์ ฏ] ๋ ์จ ์ ๋๋ฉ์ด์
",
|
395 |
-
"image_url": "data:image/png;base64," + get_image_base64('114.png'),
|
396 |
-
"prompt": "ํ์ฌ ๋ ์จ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๋ ์ ๋๋ฉ์ด์
์์ ฏ์ ๋ง๋์ธ์. ๋น, ๋, ๊ตฌ๋ฆ, ๋ฒ๊ฐ ๋ฑ์ ๋ ์จ ํจ๊ณผ๋ฅผ Canvas๋ก ๊ตฌํํ๊ณ ๋ถ๋๋ฌ์ด ์ ํ ํจ๊ณผ๋ฅผ ์ถ๊ฐํ์ธ์."
|
397 |
-
},
|
398 |
-
{
|
399 |
-
"name": "[์๋ฎฌ๋ ์ด์
] ๋ฌผ๋ฆฌ ์์ง",
|
400 |
-
"image_url": "data:image/png;base64," + get_image_base64('125.png'),
|
401 |
-
"prompt": "Canvas๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์
์ ๊ตฌํํ์ธ์. ์ค๋ ฅ, ์ถฉ๋, ํ์ฑ ํจ๊ณผ๋ฅผ ์ ์ฉํ ๊ณต ํ๊ธฐ๊ธฐ ์๋ฎฌ๋ ์ด์
์ ๋ง๋์ธ์."
|
402 |
-
},
|
403 |
-
{
|
404 |
-
"name": "[์ค๋์ค] ์ฌ์ด๋ ๋ฏน์",
|
405 |
-
"image_url": "data:image/png;base64," + get_image_base64('126.png'),
|
406 |
-
"prompt": "Web Audio API๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์์์ ๋ฏน์ฑํ ์ ์๋ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋์ธ์. ๋ณผ๋ฅจ, ํจ๋, ์ดํํธ ์กฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ์ธ์."
|
407 |
-
},
|
408 |
-
{
|
409 |
-
"name": "[์ดํํธ] ํํฐํด ํ
์คํธ",
|
410 |
-
"image_url": "data:image/png;base64," + get_image_base64('116.png'),
|
411 |
-
"prompt": "ํ
์คํธ๊ฐ ํํฐํด๏ฟฝ๏ฟฝ๏ฟฝ ๋ณํ๋๋ ํจ๊ณผ๋ฅผ ๊ตฌํํ์ธ์. ๋ง์ฐ์ค ํธ๋ฒ์ ๊ธ์๊ฐ ํฉ์ด์ก๋ค๊ฐ ๋ค์ ๋ชจ์ด๋ ์ ๋๋ฉ์ด์
์ Canvas๋ก ๋ง๋์ธ์."
|
412 |
-
},
|
413 |
-
{
|
414 |
-
"name": "[3D] ์ฑ
์ฅ ๊ฐค๋ฌ๋ฆฌ",
|
415 |
-
"image_url": "data:image/png;base64," + get_image_base64('115.png'),
|
416 |
-
"prompt": "CSS 3D ๋ณํ์ ์ฌ์ฉํ์ฌ ํ์ ํ๋ ์ฑ
์ฅ ํํ์ ๊ฐค๋ฌ๋ฆฌ๋ฅผ ๋ง๋์ธ์. ๊ฐ ์ฑ
์ ํด๋ฆญํ๋ฉด ์์ธ ์ ๋ณด๊ฐ ๋ํ๋๋๋ก ๊ตฌํํ์ธ์."
|
417 |
-
},
|
418 |
-
{
|
419 |
-
"name": "[๊ฒ์] ๋ฆฌ๋ฌ ๊ฒ์",
|
420 |
-
"image_url": "data:image/png;base64," + get_image_base64('117.png'),
|
421 |
-
"prompt": "Web Audio API๋ฅผ ํ์ฉํ ๊ฐ๋จํ ๋ฆฌ๋ฌ ๊ฒ์์ ๋ง๋์ธ์. ๋จ์ด์ง๋ ๋
ธํธ์ ํ์ด๋ฐ ํ์ , ์ ์ ์์คํ
์ ๊ตฌํํ์ธ์."
|
422 |
-
},
|
423 |
-
{
|
424 |
-
"name": "[์ ๋๋ฉ์ด์
] SVG ํจ์ค",
|
425 |
-
"image_url": "data:image/png;base64," + get_image_base64('118.png'),
|
426 |
-
"prompt": "SVG ํจ์ค๋ฅผ ๋ฐ๋ผ ์์ง์ด๋ ์ ๋๋ฉ์ด์
์ ๊ตฌํํ์ธ์. ๋ค์ํ ๋ํ์ด ๊ทธ๋ ค์ง๋ ๊ณผ์ ์ ๋ณด์ฌ์ฃผ๊ณ ์ธํฐ๋ํฐ๋ธํ ์ปจํธ๋กค์ ์ถ๊ฐํ์ธ์."
|
427 |
-
}, #์ฌ๊ธฐ๊น์ง๊ฐ ํธ๋ ๋ 12๊ฐ ํญ๋ชฉ์
|
428 |
-
{
|
429 |
-
"name": "[๋๊ตฌ] ๋๋ก์ ๋ณด๋",
|
430 |
-
"image_url": "data:image/png;base64," + get_image_base64('119.png'),
|
431 |
-
"prompt": "Canvas๋ฅผ ์ฌ์ฉํ ๊ทธ๋ฆฌ๊ธฐ ๋๊ตฌ๋ฅผ ๋ง๋์ธ์. ๋ธ๋ฌ์ ํฌ๊ธฐ, ์์ ๋ณ๊ฒฝ, ์ง์ฐ๊ฐ ๊ธฐ๋ฅ๊ณผ ๊ทธ๋ฆฌ๊ธฐ ๊ธฐ๋ก ์ ์ฅ ๊ธฐ๋ฅ์ ๊ตฌํํ์ธ์."
|
432 |
-
},
|
433 |
-
{
|
434 |
-
"name": "[๊ฒ์] ํผ์ฆ ์ฌ๋ผ์ด๋",
|
435 |
-
"image_url": "data:image/png;base64," + get_image_base64('120.png'),
|
436 |
-
"prompt": "์ซ์๋ ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํ ์ฌ๋ผ์ด๋ ํผ์ฆ ๊ฒ์์ ๋ง๋์ธ์. ์ด๋ ์ ๋๋ฉ์ด์
๊ณผ ์์ฑ ํ์ธ ๊ธฐ๋ฅ์ ์ถ๊ฐํ์ธ์."
|
437 |
-
},
|
438 |
-
{
|
439 |
-
"name": "[์ปดํฌ๋ํธ] ์ธํฐ๋ ํฐ๋ธ ํ์๋ผ์ธ",
|
440 |
-
"image_url": "data:image/png;base64," + get_image_base64('111.png'),
|
441 |
-
"prompt": "Create a vertical timeline with animated entry points. When clicking on timeline items, show detailed information with smooth transitions. Include filtering options and scroll animations."
|
442 |
-
},
|
443 |
-
{
|
444 |
-
"name": "[๋๊ตฌ] ์ค๋ฌธ์กฐ์ฌ ์์ฑ",
|
445 |
-
"image_url": "data:image/png;base64," + get_image_base64('survay.png'),
|
446 |
-
"prompt": "์ค๋ฌธ์กฐ์ฌ ์์ฑ: ๊ฒฐํผ์ ๋ํ ์ธ์ ์กฐ์ฌ๋ฅผ ์ํด ์ด 10๊ฐ์ ์ค๋ฌธ(์ด๋ฉ์ผ ์ฃผ์, ์๋
์
๋ ฅ)๊ณผ ๋ถ์์ ํ๋ผ. ์์ง๋ ์ ๋ณด๋ ๋ก์ปฌ์คํ ๋ฆฌ์ง์ logํ์ผ๋ก ์ ์ฅํ๊ฒ ํ๋ผ."
|
447 |
-
},
|
448 |
-
{
|
449 |
-
"name": "[์๊ฐํ] ๋ฐ์ดํฐ ์ ๋๋ฉ์ด์
",
|
450 |
-
"image_url": "data:image/png;base64," + get_image_base64('124.png'),
|
451 |
-
"prompt": "D3.js๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ๋ณํ๋ฅผ ์ ๋๋ฉ์ด์
์ผ๋ก ๋ณด์ฌ์ฃผ๋ ์ฐจํธ๋ฅผ ๋ง๋์ธ์. ๋ค์ํ ์ ํ ํจ๊ณผ๋ฅผ ์ถ๊ฐํ์ธ์."
|
452 |
-
},
|
453 |
-
{
|
454 |
-
"name": "[๋๊ตฌ] ์ ํ๋ธ ์์ ์ฌ์/๋ถ์/์์ฝ",
|
455 |
-
"image_url": "data:image/png;base64," + get_image_base64('yout.png'),
|
456 |
-
"prompt": "์ ํ๋ธ url์ ์
๋ ฅํ๋ฉด ์์์ด ์ถ๋ ฅ๋๋ผ. ํด๋น ์์์ ๋ํ ์ถ๊ฐ์ ์ธ ๋ถ์์ด๋ ์์ฝ๋ ํ์ํ๋ค"
|
457 |
-
},
|
458 |
-
{
|
459 |
-
"name": "[๋๊ตฌ] ์ธ๊ณ ์ง๋/ ๊ตญ๊ฐ ์ง๋",
|
460 |
-
"image_url": "data:image/png;base64," + get_image_base64('map.png'),
|
461 |
-
"prompt": "์ธ๊ณ์ง๋ ๋งต์ ๊ธฐ๋ฐ์ผ๋ก ๊ตญ๊ฐ๋ณ ์ง๋ ํ์ ๋ฐ ์ธ๊ตฌ์๋ฅผ ์ฐจํธ๋ก ์ถ๋ ฅํ๋ ๋์๋ณด๋"
|
462 |
-
},
|
463 |
-
{
|
464 |
-
"name": "[์ปดํฌ๋ํธ] ๊ฒ์ํ",
|
465 |
-
"image_url": "data:image/png;base64," + get_image_base64('128.png'),
|
466 |
-
"prompt": "์ธํฐ๋ท ๊ฒ์ํ์ ๋ง๋์ธ์. ํ
์คํธ๋ฅผ ์
๋ ฅํ๋ฉด ์ ์ฅ๋๊ณ ์ฝ์ ์ ์์ด์ผ ํฉ๋๋ค."
|
467 |
-
},
|
468 |
-
{
|
469 |
-
"name": "[๋๊ตฌ] ํฌํ ์๋ํฐ",
|
470 |
-
"image_url": "data:image/png;base64," + get_image_base64('129.png'),
|
471 |
-
"prompt": "Canvas๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๋ณธ์ ์ธ ์ด๋ฏธ์ง ํธ์ง ๋๊ตฌ๋ฅผ ๋ง๋์ธ์. ํํฐ ์ ์ฉ, ์๋ฅด๊ธฐ, ํ์ ๊ธฐ๋ฅ์ ๊ตฌํํ์ธ์."
|
472 |
-
},
|
473 |
-
{
|
474 |
-
"name": "[์๊ฐํ] ๋ง์ธ๋๋งต",
|
475 |
-
"image_url": "data:image/png;base64," + get_image_base64('130.png'),
|
476 |
-
"prompt": "D3.js๋ฅผ ์ฌ์ฉํ์ฌ ๋์ ๋ง์ธ๋๋งต์ ๋ง๋์ธ์. ๋
ธ๋ ์ถ๊ฐ/์ญ์ , ๋๋๊ทธ ์ค ๋๋กญ, ํ์ฅ/์ถ์ ์ ๋๋ฉ์ด์
์ ๊ตฌํํ์ธ์."
|
477 |
-
},
|
478 |
-
|
479 |
-
|
480 |
-
{
|
481 |
-
"name": "[๋๊ตฌ] ํจํด ๋์์ด๋",
|
482 |
-
"image_url": "data:image/png;base64," + get_image_base64('133.png'),
|
483 |
-
"prompt": "SVG๋ก ๋ฐ๋ณต ํจํด์ ๋์์ธํ๋ ๋๊ตฌ๋ฅผ ๋ง๋์ธ์. ๋์นญ ์ต์
, ์์ ์คํค๋ง ๊ด๋ฆฌ, ์ค์๊ฐ ํ๋ฆฌ๋ทฐ๋ฅผ ๊ตฌํํ์ธ์."
|
484 |
-
},
|
485 |
-
{
|
486 |
-
"name": "[๋ฉํฐ๋ฏธ๋์ด] ์ค์๊ฐ ํํฐ ์นด๋ฉ๋ผ",
|
487 |
-
"image_url": "data:image/png;base64," + get_image_base64('134.png'),
|
488 |
-
"prompt": "WebRTC์ Canvas๋ฅผ ์ฌ์ฉํ์ฌ ์ค์๊ฐ ๋น๋์ค ํํฐ ์ฑ์ ๋ง๋์ธ์. ๋ค์ํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ํจ๊ณผ๋ฅผ ๊ตฌํํ์ธ์."
|
489 |
-
},
|
490 |
-
|
491 |
-
{
|
492 |
-
"name": "[์๊ฐํ] ์ค์๊ฐ ๋ฐ์ดํฐ ํ๋ก์ฐ",
|
493 |
-
"image_url": "data:image/png;base64," + get_image_base64('136.png'),
|
494 |
-
"prompt": "D3.js๋ก ์ค์๊ฐ ๋ฐ์ดํฐ ํ๋ฆ์ ์๊ฐํํ์ธ์. ๋
ธ๋ ๊ธฐ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ์ ์ ๋๋ฉ์ด์
ํจ๊ณผ๋ฅผ ๊ตฌํํ์ธ์."
|
495 |
-
},
|
496 |
-
{
|
497 |
-
"name": "[์ธํฐ๋ํฐ๋ธ] ์ปฌ๋ฌ ํ๋ ํธ",
|
498 |
-
"image_url": "data:image/png;base64," + get_image_base64('113.png'),
|
499 |
-
"prompt": "๋ง์ฐ์ค ์์ง์์ ๋ฐ๋ผ ๋์ ์ผ๋ก ๋ณํ๋ ์ปฌ๋ฌ ํ๋ ํธ๋ฅผ ๋ง๋์ธ์. ์์ ์ ํ, ์ ์ฅ, ์กฐํฉ ๊ธฐ๋ฅ๊ณผ ํจ๊ป ๋ถ๋๋ฌ์ด ๊ทธ๋ผ๋ฐ์ด์
ํจ๊ณผ๋ฅผ ๊ตฌํํ์ธ์."
|
500 |
-
},
|
501 |
-
{
|
502 |
-
"name": "[์ดํํธ] ํํฐํด ์ปค์",
|
503 |
-
"image_url": "data:image/png;base64," + get_image_base64('121.png'),
|
504 |
-
"prompt": "๋ง์ฐ์ค ์ปค์๋ฅผ ๋ฐ๋ผ๋ค๋๋ ํํฐํด ํจ๊ณผ๋ฅผ ๋ง๋์ธ์. ๋ค์ํ ํํฐํด ํจํด๊ณผ ์์ ๋ณํ๋ฅผ ๊ตฌํํ์ธ์."
|
505 |
-
},
|
506 |
-
|
507 |
-
{
|
508 |
-
"name": "[ํํ์ด์ง] AI ์คํํธ์
",
|
509 |
-
"image_url": "data:image/gif;base64," + get_image_base64('mouse.gif'), # mouse.gif ์ฌ์ฉ
|
510 |
-
"prompt": "๋๋ฉ ํ์ด์ง๋ฅผ ๋ง๋ค์ด๋ผ. ์ ๋ฌธ๊ฐ ์ ์ ํํ์ ๋ฉ์ง ๋น์ฃผ์ผ๋ก ๊ตฌ์ฑ,์ด๋ชจ์ง๋ฅผ ์ ์ ํ ํ์ฉํ๊ณ ๋ค์์ ๋ด์ฉ์ ์ฐธ๊ณ ํ์ฌ ๋ฐ์ํ๋๋ก ํ๋ผ.๋ง์ฐ์ค-I๋ ์ฌ์ฉ์๊ฐ ์ํ๋ ์น ์๋น์ค๋ฅผ ํ๋กฌํํธ๋ก ์
๋ ฅํ๋ฉด 60์ด ์ด๋ด์ ์ค์ ์๋ํ๋ ์น ์๋น์ค๋ฅผ ์๋ ์์ฑํ๋ ๋๊ตฌ๋ค. ๋ง์ฐ์ค-I์ ์ฃผ์ ๊ธฐ๋ฅ์ โฒ์ํด๋ฆญ ์ค์๊ฐ ๋ฐฐํฌ โฒ์ค์๊ฐ ๋ฏธ๋ฆฌ๋ณด๊ธฐ โฒ40์ฌ ๊ฐ์ง ์ฆ์ ์ ์ฉ ํ
ํ๋ฆฟ โฒ์ค์๊ฐ ์์ ๋ฑ์ด๋ค. MBTI ํ
์คํธ, ํฌ์ ๊ด๋ฆฌ ๋๊ตฌ, ํ
ํธ๋ฆฌ์ค ๊ฒ์ ๋ฑ ๋ค์ํ ํ
ํ๋ฆฟ์ ์ ๊ณตํด ๋น๊ฐ๋ฐ์๋ ์ฆ์ ํ์ฉํ ์ ์๋ค."
|
511 |
-
}
|
512 |
-
]
|
513 |
-
|
514 |
def load_best_templates():
|
515 |
json_data = load_json_data()[:12] # ๋ฒ ์คํธ ํ
ํ๋ฆฟ
|
516 |
return create_template_html("๐ ๋ฒ ์คํธ ํ
ํ๋ฆฟ", json_data)
|
@@ -603,326 +371,8 @@ def create_template_html(title, items):
|
|
603 |
# ์ ์ญ ๋ณ์๋ก ํ
ํ๋ฆฟ ๋ฐ์ดํฐ ์บ์
|
604 |
TEMPLATE_CACHE = None
|
605 |
|
606 |
-
def load_session_history(template_type="best"):
|
607 |
-
global TEMPLATE_CACHE
|
608 |
-
|
609 |
-
try:
|
610 |
-
json_data = load_json_data()
|
611 |
-
|
612 |
-
# ๋ฐ์ดํฐ๋ฅผ ์ธ ์น์
์ผ๋ก ๋๋๊ธฐ
|
613 |
-
templates = {
|
614 |
-
"best": json_data[:12], # ๋ฒ ์คํธ ํ
ํ๋ฆฟ
|
615 |
-
"trending": json_data[12:24], # ํธ๋ ๋ฉ ํ
ํ๋ฆฟ
|
616 |
-
"new": json_data[24:44] # NEW ํ
ํ๋ฆฟ
|
617 |
-
}
|
618 |
-
|
619 |
-
titles = {
|
620 |
-
"best": "๐ ๋ฒ ์คํธ ํ
ํ๋ฆฟ",
|
621 |
-
"trending": "๐ฅ ํธ๋ ๋ฉ ํ
ํ๋ฆฟ",
|
622 |
-
"new": "โจ NEW ํ
ํ๋ฆฟ"
|
623 |
-
}
|
624 |
-
|
625 |
-
html_content = """
|
626 |
-
<style>
|
627 |
-
.template-nav {
|
628 |
-
display: flex;
|
629 |
-
gap: 10px;
|
630 |
-
margin: 20px;
|
631 |
-
position: sticky;
|
632 |
-
top: 0;
|
633 |
-
background: white;
|
634 |
-
z-index: 100;
|
635 |
-
padding: 10px 0;
|
636 |
-
border-bottom: 1px solid #eee;
|
637 |
-
}
|
638 |
-
.template-btn {
|
639 |
-
padding: 8px 16px;
|
640 |
-
border: 1px solid #1890ff;
|
641 |
-
border-radius: 4px;
|
642 |
-
cursor: pointer;
|
643 |
-
background: white;
|
644 |
-
color: #1890ff;
|
645 |
-
font-weight: bold;
|
646 |
-
transition: all 0.3s;
|
647 |
-
}
|
648 |
-
.template-btn:hover {
|
649 |
-
background: #1890ff;
|
650 |
-
color: white;
|
651 |
-
}
|
652 |
-
.template-btn.active {
|
653 |
-
background: #1890ff;
|
654 |
-
color: white;
|
655 |
-
}
|
656 |
-
.prompt-grid {
|
657 |
-
display: grid;
|
658 |
-
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
|
659 |
-
gap: 20px;
|
660 |
-
padding: 20px;
|
661 |
-
}
|
662 |
-
.prompt-card {
|
663 |
-
background: white;
|
664 |
-
border: 1px solid #eee;
|
665 |
-
border-radius: 8px;
|
666 |
-
padding: 15px;
|
667 |
-
cursor: pointer;
|
668 |
-
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
|
669 |
-
}
|
670 |
-
.prompt-card:hover {
|
671 |
-
transform: translateY(-2px);
|
672 |
-
transition: transform 0.2s;
|
673 |
-
}
|
674 |
-
.card-image {
|
675 |
-
width: 100%;
|
676 |
-
height: 180px;
|
677 |
-
object-fit: cover;
|
678 |
-
border-radius: 4px;
|
679 |
-
margin-bottom: 10px;
|
680 |
-
}
|
681 |
-
.card-name {
|
682 |
-
font-weight: bold;
|
683 |
-
margin-bottom: 8px;
|
684 |
-
font-size: 16px;
|
685 |
-
color: #333;
|
686 |
-
}
|
687 |
-
.card-prompt {
|
688 |
-
font-size: 11px;
|
689 |
-
line-height: 1.4;
|
690 |
-
color: #666;
|
691 |
-
display: -webkit-box;
|
692 |
-
-webkit-line-clamp: 6;
|
693 |
-
-webkit-box-orient: vertical;
|
694 |
-
overflow: hidden;
|
695 |
-
height: 90px;
|
696 |
-
background-color: #f8f9fa;
|
697 |
-
padding: 8px;
|
698 |
-
border-radius: 4px;
|
699 |
-
}
|
700 |
-
.template-section {
|
701 |
-
display: none;
|
702 |
-
}
|
703 |
-
.template-section.active {
|
704 |
-
display: block;
|
705 |
-
}
|
706 |
-
</style>
|
707 |
-
<div class="template-nav">
|
708 |
-
<button class="template-btn" onclick="showTemplate('best')">๐ ๋ฒ ์คํธ</button>
|
709 |
-
<button class="template-btn" onclick="showTemplate('trending')">๐ฅ ํธ๋ ๋ฉ</button>
|
710 |
-
<button class="template-btn" onclick="showTemplate('new')">โจ NEW</button>
|
711 |
-
</div>
|
712 |
-
"""
|
713 |
-
|
714 |
-
# ๊ฐ ์น์
์ ํ
ํ๋ฆฟ ์์ฑ
|
715 |
-
for section, items in templates.items():
|
716 |
-
html_content += f"""
|
717 |
-
<div class="template-section" id="{section}-templates">
|
718 |
-
<div class="prompt-grid">
|
719 |
-
"""
|
720 |
-
for item in items:
|
721 |
-
html_content += f"""
|
722 |
-
<div class="prompt-card" onclick="copyToInput(this)" data-prompt="{html.escape(item.get('prompt', ''))}">
|
723 |
-
<img src="{item.get('image_url', '')}" class="card-image" loading="lazy" alt="{html.escape(item.get('name', ''))}">
|
724 |
-
<div class="card-name">{html.escape(item.get('name', ''))}</div>
|
725 |
-
<div class="card-prompt">{html.escape(item.get('prompt', ''))}</div>
|
726 |
-
</div>
|
727 |
-
"""
|
728 |
-
html_content += "</div></div>"
|
729 |
-
|
730 |
-
html_content += """
|
731 |
-
<script>
|
732 |
-
function copyToInput(card) {
|
733 |
-
const prompt = card.dataset.prompt;
|
734 |
-
const textarea = document.querySelector('.ant-input-textarea-large textarea');
|
735 |
-
if (textarea) {
|
736 |
-
textarea.value = prompt;
|
737 |
-
textarea.dispatchEvent(new Event('input', { bubbles: true }));
|
738 |
-
document.querySelector('.session-drawer .close-btn').click();
|
739 |
-
}
|
740 |
-
}
|
741 |
-
|
742 |
-
function showTemplate(type) {
|
743 |
-
// ๋ชจ๋ ์น์
์จ๊ธฐ๊ธฐ
|
744 |
-
document.querySelectorAll('.template-section').forEach(section => {
|
745 |
-
section.style.display = 'none';
|
746 |
-
});
|
747 |
-
// ๋ชจ๋ ๋ฒํผ ๋นํ์ฑํ
|
748 |
-
document.querySelectorAll('.template-btn').forEach(btn => {
|
749 |
-
btn.classList.remove('active');
|
750 |
-
});
|
751 |
-
|
752 |
-
// ์ ํ๋ ์น์
๋ณด์ด๊ธฐ
|
753 |
-
document.getElementById(type + '-templates').style.display = 'block';
|
754 |
-
// ์ ํ๋ ๋ฒํผ ํ์ฑํ
|
755 |
-
event.target.classList.add('active');
|
756 |
-
}
|
757 |
-
|
758 |
-
// ์ด๊ธฐ ๋ก๋์ ๋ฒ ์คํธ ํ
ํ๋ฆฟ ํ์
|
759 |
-
document.addEventListener('DOMContentLoaded', function() {
|
760 |
-
showTemplate('best');
|
761 |
-
document.querySelector('.template-btn').classList.add('active');
|
762 |
-
});
|
763 |
-
</script>
|
764 |
-
"""
|
765 |
-
|
766 |
-
return gr.HTML(value=html_content)
|
767 |
-
|
768 |
-
except Exception as e:
|
769 |
-
print(f"Error in load_session_history: {str(e)}")
|
770 |
-
return gr.HTML("Error loading templates")
|
771 |
-
|
772 |
-
|
773 |
-
|
774 |
-
|
775 |
-
|
776 |
-
# ๋ฐฐํฌ ๊ด๋ จ ํจ์ ์ถ๊ฐ
|
777 |
-
def generate_space_name():
|
778 |
-
"""6์๋ฆฌ ๋๋ค ์๋ฌธ ์ด๋ฆ ์์ฑ"""
|
779 |
-
letters = string.ascii_lowercase
|
780 |
-
return ''.join(random.choice(letters) for i in range(6))
|
781 |
-
|
782 |
-
def deploy_to_vercel(code: str):
|
783 |
-
try:
|
784 |
-
token = "A8IFZmgW2cqA4yUNlLPnci0N"
|
785 |
-
if not token:
|
786 |
-
return "Vercel ํ ํฐ์ด ์ค์ ๋์ง ์์์ต๋๋ค."
|
787 |
-
|
788 |
-
# 6์๋ฆฌ ์๋ฌธ ํ๋ก์ ํธ ์ด๋ฆ ์์ฑ
|
789 |
-
project_name = ''.join(random.choice(string.ascii_lowercase) for i in range(6))
|
790 |
-
|
791 |
-
|
792 |
-
# Vercel API ์๋ํฌ์ธํธ
|
793 |
-
deploy_url = "https://api.vercel.com/v13/deployments"
|
794 |
|
795 |
-
# ํค๋ ์ค์
|
796 |
-
headers = {
|
797 |
-
"Authorization": f"Bearer {token}",
|
798 |
-
"Content-Type": "application/json"
|
799 |
-
}
|
800 |
-
|
801 |
-
# package.json ํ์ผ ์์ฑ
|
802 |
-
package_json = {
|
803 |
-
"name": project_name,
|
804 |
-
"version": "1.0.0",
|
805 |
-
"private": True, # true -> True๋ก ์์
|
806 |
-
"dependencies": {
|
807 |
-
"vite": "^5.0.0"
|
808 |
-
},
|
809 |
-
"scripts": {
|
810 |
-
"dev": "vite",
|
811 |
-
"build": "echo 'No build needed' && mkdir -p dist && cp index.html dist/",
|
812 |
-
"preview": "vite preview"
|
813 |
-
}
|
814 |
-
}
|
815 |
|
816 |
-
# ๋ฐฐํฌํ ํ์ผ ๋ฐ์ดํฐ ๊ตฌ์กฐ
|
817 |
-
files = [
|
818 |
-
{
|
819 |
-
"file": "index.html",
|
820 |
-
"data": code
|
821 |
-
},
|
822 |
-
{
|
823 |
-
"file": "package.json",
|
824 |
-
"data": json.dumps(package_json, indent=2) # indent ์ถ๊ฐ๋ก ๊ฐ๋
์ฑ ํฅ์
|
825 |
-
}
|
826 |
-
]
|
827 |
-
|
828 |
-
# ํ๋ก์ ํธ ์ค์
|
829 |
-
project_settings = {
|
830 |
-
"buildCommand": "npm run build",
|
831 |
-
"outputDirectory": "dist",
|
832 |
-
"installCommand": "npm install",
|
833 |
-
"framework": None
|
834 |
-
}
|
835 |
-
|
836 |
-
# ๋ฐฐํฌ ์์ฒญ ๋ฐ์ดํฐ
|
837 |
-
deploy_data = {
|
838 |
-
"name": project_name,
|
839 |
-
"files": files,
|
840 |
-
"target": "production",
|
841 |
-
"projectSettings": project_settings
|
842 |
-
}
|
843 |
-
|
844 |
-
|
845 |
-
deploy_response = requests.post(deploy_url, headers=headers, json=deploy_data)
|
846 |
-
|
847 |
-
if deploy_response.status_code != 200:
|
848 |
-
return f"๋ฐฐํฌ ์คํจ: {deploy_response.text}"
|
849 |
-
|
850 |
-
# URL ํ์ ์์ - 6์๋ฆฌ.vercel.app ํํ๋ก ๋ฐํ
|
851 |
-
deployment_url = f"{project_name}.vercel.app"
|
852 |
-
|
853 |
-
time.sleep(5)
|
854 |
-
|
855 |
-
return f"""๋ฐฐํฌ ์๋ฃ! <a href="https://{deployment_url}" target="_blank" style="color: #1890ff; text-decoration: underline; cursor: pointer;">https://{deployment_url}</a>"""
|
856 |
-
|
857 |
-
except Exception as e:
|
858 |
-
return f"๋ฐฐํฌ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}"
|
859 |
-
|
860 |
-
|
861 |
-
# ํ๋กฌํํธ ์ฆ๊ฐ ํจ์ ์์
|
862 |
-
def boost_prompt(prompt: str) -> str:
|
863 |
-
if not prompt:
|
864 |
-
return ""
|
865 |
-
|
866 |
-
# ์ฆ๊ฐ์ ์ํ ์์คํ
ํ๋กฌํํธ
|
867 |
-
boost_system_prompt = """
|
868 |
-
๋น์ ์ ์น ๊ฐ๋ฐ ํ๋กฌํํธ ์ ๋ฌธ๊ฐ์
๋๋ค.
|
869 |
-
์ฃผ์ด์ง ํ๋กฌํํธ๋ฅผ ๋ถ์ํ์ฌ ๋ ์์ธํ๊ณ ์ ๋ฌธ์ ์ธ ์๊ตฌ์ฌํญ์ผ๋ก ํ์ฅํ๋,
|
870 |
-
์๋ ์๋์ ๋ชฉ์ ์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์ ๋ค์ ๊ด์ ๋ค์ ๊ณ ๋ คํ์ฌ ์ฆ๊ฐํ์ญ์์ค:
|
871 |
-
1. ๊ธฐ์ ์ ๊ตฌํ ์์ธ
|
872 |
-
2. UI/UX ๋์์ธ ์์
|
873 |
-
3. ์ฌ์ฉ์ ๊ฒฝํ ์ต์ ํ
|
874 |
-
4. ์ฑ๋ฅ๊ณผ ๋ณด์
|
875 |
-
5. ์ ๊ทผ์ฑ๊ณผ ํธํ์ฑ
|
876 |
-
|
877 |
-
๊ธฐ์กด SystemPrompt์ ๋ชจ๋ ๊ท์น์ ์ค์ํ๋ฉด์ ์ฆ๊ฐ๋ ํ๋กฌํํธ๋ฅผ ์์ฑํ์ญ์์ค.
|
878 |
-
"""
|
879 |
-
|
880 |
-
try:
|
881 |
-
# Claude API ์๋
|
882 |
-
try:
|
883 |
-
response = claude_client.messages.create(
|
884 |
-
model="claude-3-5-sonnet-20241022",
|
885 |
-
max_tokens=2000,
|
886 |
-
messages=[{
|
887 |
-
"role": "user",
|
888 |
-
"content": f"๋ค์ ํ๋กฌํํธ๋ฅผ ๋ถ์ํ๊ณ ์ฆ๊ฐํ์์ค: {prompt}"
|
889 |
-
}]
|
890 |
-
)
|
891 |
-
|
892 |
-
if hasattr(response, 'content') and len(response.content) > 0:
|
893 |
-
return response.content[0].text
|
894 |
-
raise Exception("Claude API ์๋ต ํ์ ์ค๋ฅ")
|
895 |
-
|
896 |
-
except Exception as claude_error:
|
897 |
-
print(f"Claude API ์๋ฌ, OpenAI๋ก ์ ํ: {str(claude_error)}")
|
898 |
-
|
899 |
-
# OpenAI API ์๋
|
900 |
-
completion = openai_client.chat.completions.create(
|
901 |
-
model="gpt-4",
|
902 |
-
messages=[
|
903 |
-
{"role": "system", "content": boost_system_prompt},
|
904 |
-
{"role": "user", "content": f"๋ค์ ํ๋กฌํํธ๋ฅผ ๋ถ์ํ๊ณ ์ฆ๊ฐํ์์ค: {prompt}"}
|
905 |
-
],
|
906 |
-
max_tokens=2000,
|
907 |
-
temperature=0.7
|
908 |
-
)
|
909 |
-
|
910 |
-
if completion.choices and len(completion.choices) > 0:
|
911 |
-
return completion.choices[0].message.content
|
912 |
-
raise Exception("OpenAI API ์๋ต ํ์ ์ค๋ฅ")
|
913 |
-
|
914 |
-
except Exception as e:
|
915 |
-
print(f"ํ๋กฌํํธ ์ฆ๊ฐ ์ค ์ค๋ฅ ๋ฐ์: {str(e)}")
|
916 |
-
return prompt # ์ค๋ฅ ๋ฐ์์ ์๋ณธ ํ๋กฌํํธ ๋ฐํ
|
917 |
-
|
918 |
-
# Boost ๋ฒํผ ์ด๋ฒคํธ ํธ๋ค๋ฌ
|
919 |
-
def handle_boost(prompt: str):
|
920 |
-
try:
|
921 |
-
boosted_prompt = boost_prompt(prompt)
|
922 |
-
return boosted_prompt, gr.update(active_key="empty")
|
923 |
-
except Exception as e:
|
924 |
-
print(f"Boost ์ฒ๋ฆฌ ์ค ์ค๋ฅ: {str(e)}")
|
925 |
-
return prompt, gr.update(active_key="empty")
|
926 |
|
927 |
|
928 |
# Demo ์ธ์คํด์ค ์์ฑ
|
@@ -993,18 +443,7 @@ def format_timestamp(timestamp):
|
|
993 |
except Exception as e:
|
994 |
print(f"Timestamp conversion error: {str(e)} for timestamp: {timestamp}")
|
995 |
return 'N/A'
|
996 |
-
|
997 |
-
|
998 |
-
def should_exclude_space(space_name):
|
999 |
-
"""ํน์ ์คํ์ด์ค๋ฅผ ์ ์ธํ๋ ํํฐ ํจ์"""
|
1000 |
-
exclude_keywords = [
|
1001 |
-
'mixgen3', 'ginid', 'mouse', 'flxtrainlora',
|
1002 |
-
'vidslicegpu', 'stickimg', 'ultpixgen', 'SORA',
|
1003 |
-
'badassgi', 'newsplus', 'chargen', 'news',
|
1004 |
-
'testhtml'
|
1005 |
-
]
|
1006 |
-
|
1007 |
-
return any(keyword.lower() in space_name.lower() for keyword in exclude_keywords)
|
1008 |
|
1009 |
def get_pastel_color(index):
|
1010 |
"""Generate unique pastel colors based on index"""
|
@@ -1164,189 +603,8 @@ def get_space_card(space, index):
|
|
1164 |
</div>
|
1165 |
"""
|
1166 |
|
1167 |
-
def get_vercel_deployments():
|
1168 |
-
"""Vercel API๋ฅผ ํตํด ๋ชจ๋ ๋ฐฐํฌ๋ ์๋น์ค ์ ๋ณด ๊ฐ์ ธ์ค๊ธฐ (ํ์ด์ง๋ค์ด์
์ ์ฉ)"""
|
1169 |
-
token = "A8IFZmgW2cqA4yUNlLPnci0N"
|
1170 |
-
base_url = "https://api.vercel.com/v6/deployments"
|
1171 |
-
all_deployments = []
|
1172 |
-
has_next = True
|
1173 |
-
page = 1
|
1174 |
-
until = None # ์ฒซ ์์ฒญ์์๋ until ํ๋ผ๋ฏธํฐ ์์
|
1175 |
-
|
1176 |
-
headers = {
|
1177 |
-
"Authorization": f"Bearer {token}",
|
1178 |
-
"Content-Type": "application/json"
|
1179 |
-
}
|
1180 |
-
|
1181 |
-
try:
|
1182 |
-
while has_next:
|
1183 |
-
# URL ๊ตฌ์ฑ (ํ์ด์ง๋ค์ด์
ํ๋ผ๋ฏธํฐ ํฌํจ)
|
1184 |
-
url = f"{base_url}?limit=100"
|
1185 |
-
if until:
|
1186 |
-
url += f"&until={until}"
|
1187 |
-
|
1188 |
-
print(f"Fetching page {page}... URL: {url}") # ๋๋ฒ๊น
์ฉ
|
1189 |
-
|
1190 |
-
response = requests.get(url, headers=headers)
|
1191 |
-
if response.status_code != 200:
|
1192 |
-
print(f"Vercel API Error: {response.text}")
|
1193 |
-
break
|
1194 |
-
|
1195 |
-
data = response.json()
|
1196 |
-
current_deployments = data.get('deployments', [])
|
1197 |
-
|
1198 |
-
if not current_deployments: # ๋ ์ด์ ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฉด ์ข
๋ฃ
|
1199 |
-
break
|
1200 |
-
|
1201 |
-
all_deployments.extend(current_deployments)
|
1202 |
-
|
1203 |
-
# ๋ค์ ํ์ด์ง๋ฅผ ์ํ until ๊ฐ ์ค์
|
1204 |
-
pagination = data.get('pagination', {})
|
1205 |
-
until = pagination.get('next')
|
1206 |
-
has_next = bool(until) # until ๊ฐ์ด ์์ผ๋ฉด ๋ค์ ํ์ด์ง ์กด์ฌ
|
1207 |
-
|
1208 |
-
print(f"Page {page} fetched. Got {len(current_deployments)} deployments") # ๋๋ฒ๊น
์ฉ
|
1209 |
-
page += 1
|
1210 |
-
|
1211 |
-
print(f"Total deployments fetched: {len(all_deployments)}") # ๋๋ฒ๊น
์ฉ
|
1212 |
-
|
1213 |
-
# ์ํ๊ฐ 'READY'์ด๊ณ 'url'์ด ์๋ ๋ฐฐํฌ๋ง ํํฐ๋งํ๊ณ 'javis1' ์ ์ธ
|
1214 |
-
active_deployments = [
|
1215 |
-
dep for dep in all_deployments
|
1216 |
-
if dep.get('state') == 'READY' and
|
1217 |
-
dep.get('url') and
|
1218 |
-
'javis1' not in dep.get('name', '').lower()
|
1219 |
-
]
|
1220 |
-
|
1221 |
-
print(f"Active deployments after filtering: {len(active_deployments)}") # ๋๋ฒ๊น
์ฉ
|
1222 |
-
return active_deployments
|
1223 |
-
|
1224 |
-
except Exception as e:
|
1225 |
-
print(f"Error fetching Vercel deployments: {str(e)}")
|
1226 |
-
return []
|
1227 |
|
1228 |
|
1229 |
-
def get_vercel_card(deployment, index, is_top_best=False):
|
1230 |
-
"""Vercel ๋ฐฐํฌ ์นด๋ HTML ์์ฑ ํจ์"""
|
1231 |
-
raw_url = deployment.get('url', '')
|
1232 |
-
|
1233 |
-
# URL ์ฒ๋ฆฌ
|
1234 |
-
if raw_url.startswith('http'):
|
1235 |
-
url = raw_url
|
1236 |
-
else:
|
1237 |
-
url = f"https://{raw_url}"
|
1238 |
-
|
1239 |
-
name = deployment.get('name', '์ด๋ฆ ์๋ ํ๋ก์ ํธ')
|
1240 |
-
|
1241 |
-
# ์นด๋ ID ์์ฑ
|
1242 |
-
card_id = f"vercel-card-{url.replace('.', '-').replace('/', '-')}"
|
1243 |
-
|
1244 |
-
# Top Best ํญ๋ชฉ์ผ ๊ฒฝ์ฐ์ ์คํฌ๋ฆฐ์ท ์ฒ๋ฆฌ
|
1245 |
-
screenshot_html = ""
|
1246 |
-
if is_top_best:
|
1247 |
-
try:
|
1248 |
-
print(f"์คํฌ๋ฆฐ์ท ์บก์ฒ ์๋: {url}") # ๋๋ฒ๊น
์ฉ ๋ก๊ทธ
|
1249 |
-
screenshot_base64 = take_screenshot(raw_url)
|
1250 |
-
if screenshot_base64:
|
1251 |
-
screenshot_html = f"""
|
1252 |
-
<div style="width: 100%; height: 200px; overflow: hidden; border-radius: 10px; margin-bottom: 15px;">
|
1253 |
-
<img src="data:image/png;base64,{screenshot_base64}"
|
1254 |
-
style="width: 100%; height: 100%; object-fit: cover;"
|
1255 |
-
alt="{name} ์คํฌ๋ฆฐ์ท"/>
|
1256 |
-
</div>
|
1257 |
-
"""
|
1258 |
-
else:
|
1259 |
-
print(f"์คํฌ๋ฆฐ์ท ์บก์ฒ ์คํจ: {url}") # ๋๋ฒ๊น
์ฉ ๋ก๊ทธ
|
1260 |
-
except Exception as e:
|
1261 |
-
print(f"์คํฌ๋ฆฐ์ท ์ฒ๋ฆฌ ์ค๋ฅ: {str(e)} for URL: {url}") # ๋๋ฒ๊น
์ฉ ๋ก๊ทธ
|
1262 |
-
|
1263 |
-
bg_color = get_pastel_color(index + (20 if not is_top_best else 0))
|
1264 |
-
tech_emojis = ['โก', '๐', '๐', 'โจ', '๐ซ', '๐ฅ', '๐', '๐ฏ', '๐จ', '๐ฎ']
|
1265 |
-
random_emojis = random.sample(tech_emojis, 3)
|
1266 |
-
|
1267 |
-
# Top Best ์นด๋์ ๊ฐ์ํ๋ ์ ๋ณด ์น์
|
1268 |
-
if is_top_best:
|
1269 |
-
info_section = f"""
|
1270 |
-
<div style='margin: 15px 0; color: #444; background: rgba(255,255,255,0.5);
|
1271 |
-
padding: 15px; border-radius: 12px;'>
|
1272 |
-
<p style='margin: 8px 0;'>
|
1273 |
-
<strong>URL:</strong> ๐ {url}
|
1274 |
-
</p>
|
1275 |
-
</div>
|
1276 |
-
"""
|
1277 |
-
else:
|
1278 |
-
info_section = f"""
|
1279 |
-
<div style='margin: 15px 0; color: #444; background: rgba(255,255,255,0.5);
|
1280 |
-
padding: 15px; border-radius: 12px;'>
|
1281 |
-
<p style='margin: 8px 0;'>
|
1282 |
-
<strong>Status:</strong> โ
{deployment.get('state', 'N/A')}
|
1283 |
-
</p>
|
1284 |
-
<p style='margin: 8px 0;'>
|
1285 |
-
<strong>Created:</strong> ๐
{format_timestamp(deployment.get('created'))}
|
1286 |
-
</p>
|
1287 |
-
<p style='margin: 8px 0;'>
|
1288 |
-
<strong>URL:</strong> ๐ {url}
|
1289 |
-
</p>
|
1290 |
-
</div>
|
1291 |
-
"""
|
1292 |
-
|
1293 |
-
return f"""
|
1294 |
-
<div id="{card_id}" class="vercel-card"
|
1295 |
-
data-likes="0"
|
1296 |
-
style='border: none;
|
1297 |
-
padding: 25px;
|
1298 |
-
margin: 15px;
|
1299 |
-
border-radius: 20px;
|
1300 |
-
background-color: {bg_color};
|
1301 |
-
box-shadow: 0 4px 15px rgba(0,0,0,0.1);
|
1302 |
-
transition: all 0.3s ease-in-out;
|
1303 |
-
position: relative;
|
1304 |
-
overflow: hidden;'
|
1305 |
-
onmouseover='this.style.transform="translateY(-5px) scale(1.02)"; this.style.boxShadow="0 8px 25px rgba(0,0,0,0.15)"'
|
1306 |
-
onmouseout='this.style.transform="translateY(0) scale(1)"; this.style.boxShadow="0 4px 15px rgba(0,0,0,0.1)"'>
|
1307 |
-
{screenshot_html}
|
1308 |
-
<h3 style='color: #2d2d2d;
|
1309 |
-
margin: 0 0 20px 0;
|
1310 |
-
font-size: 1.4em;
|
1311 |
-
display: flex;
|
1312 |
-
align-items: center;
|
1313 |
-
gap: 10px;'>
|
1314 |
-
<span style='font-size: 1.3em'>{random_emojis[0]}</span>
|
1315 |
-
<a href='{url}' target='_blank'
|
1316 |
-
style='text-decoration: none; color: #2d2d2d;'>
|
1317 |
-
{name}
|
1318 |
-
</a>
|
1319 |
-
<span style='font-size: 1.3em'>{random_emojis[1]}</span>
|
1320 |
-
</h3>
|
1321 |
-
{info_section}
|
1322 |
-
<div style='margin-top: 20px; display: flex; justify-content: space-between; align-items: center;'>
|
1323 |
-
<div class="like-section" style="display: flex; align-items: center; gap: 10px;">
|
1324 |
-
<button onclick="toggleLike('{card_id}')" class="like-button"
|
1325 |
-
style="background: none; border: none; cursor: pointer; font-size: 1.5em; padding: 5px 10px;">
|
1326 |
-
๐ค
|
1327 |
-
</button>
|
1328 |
-
<span class="like-count" style="font-size: 1.2em; color: #666;">0</span>
|
1329 |
-
</div>
|
1330 |
-
<a href='{url}' target='_blank'
|
1331 |
-
style='background: linear-gradient(45deg, #0084ff, #00a3ff);
|
1332 |
-
color: white;
|
1333 |
-
padding: 10px 20px;
|
1334 |
-
border-radius: 15px;
|
1335 |
-
text-decoration: none;
|
1336 |
-
display: inline-flex;
|
1337 |
-
align-items: center;
|
1338 |
-
gap: 8px;
|
1339 |
-
font-weight: 500;
|
1340 |
-
transition: all 0.3s;
|
1341 |
-
box-shadow: 0 2px 8px rgba(0,132,255,0.3);'
|
1342 |
-
onmouseover='this.style.transform="scale(1.05)"; this.style.boxShadow="0 4px 12px rgba(0,132,255,0.4)"'
|
1343 |
-
onmouseout='this.style.transform="scale(1)"; this.style.boxShadow="0 2px 8px rgba(0,132,255,0.3)"'>
|
1344 |
-
<span>GO > </span> ๐ {random_emojis[0]}
|
1345 |
-
</a>
|
1346 |
-
</div>
|
1347 |
-
</div>
|
1348 |
-
"""
|
1349 |
-
|
1350 |
# Top Best URLs ์ ์
|
1351 |
TOP_BEST_URLS = [
|
1352 |
{
|
@@ -1355,206 +613,7 @@ TOP_BEST_URLS = [
|
|
1355 |
"created": "2024-11-18 00:00",
|
1356 |
"state": "READY"
|
1357 |
},
|
1358 |
-
{
|
1359 |
-
"url": "https://mrtzut.vercel.app",
|
1360 |
-
"name": "Free Stock Finder",
|
1361 |
-
"created": "2024-11-18 00:00",
|
1362 |
-
"state": "READY"
|
1363 |
-
},
|
1364 |
-
{
|
1365 |
-
"url": "https://exwafe.vercel.app",
|
1366 |
-
"name": "LLM Race Visualization",
|
1367 |
-
"created": "2024-11-18 00:00",
|
1368 |
-
"state": "READY"
|
1369 |
-
},
|
1370 |
-
{
|
1371 |
-
"url": "ssksqr.vercel.app",
|
1372 |
-
"name": "[๊ฒ์] ์ฒด์ค",
|
1373 |
-
"created": "2024-11-20 00:00",
|
1374 |
-
"state": "READY"
|
1375 |
-
},
|
1376 |
-
{
|
1377 |
-
"url": "fhtlww.vercel.app",
|
1378 |
-
"name": "'์์' ๊ณ์ฐ๊ธฐ",
|
1379 |
-
"created": "2024-11-20 00:00",
|
1380 |
-
"state": "READY"
|
1381 |
-
},
|
1382 |
-
{
|
1383 |
-
"url": "dekvxz.vercel.app",
|
1384 |
-
"name": "[๊ฒ์]๋ค์ด์ดํธ ํํฐ",
|
1385 |
-
"created": "2024-11-20 00:00",
|
1386 |
-
"state": "READY"
|
1387 |
-
},
|
1388 |
-
{
|
1389 |
-
"url": "czbipi.vercel.app",
|
1390 |
-
"name": "์ฌํ ์ผ์ ๊ด๋ฆฌ",
|
1391 |
-
"created": "2024-11-20 00:00",
|
1392 |
-
"state": "READY"
|
1393 |
-
},
|
1394 |
-
{
|
1395 |
-
"url": "https://huggingface.co/spaces/openfree/ggumim",
|
1396 |
-
"name": "[MOUSE-II]์ด๋ฏธ์ง์ ํ๊ธ ์ถ๋ ฅ",
|
1397 |
-
"created": "2024-11-18 00:00",
|
1398 |
-
"state": "READY"
|
1399 |
-
},
|
1400 |
-
{
|
1401 |
-
"url": "xabtnc.vercel.app",
|
1402 |
-
"name": "[์ฑํ
๋ด]๋๋ง์ LLM",
|
1403 |
-
"created": "2024-11-18 00:00",
|
1404 |
-
"state": "READY"
|
1405 |
-
},
|
1406 |
-
|
1407 |
-
{
|
1408 |
-
"url": "nxhquk.vercel.app",
|
1409 |
-
"name": "[๊ฒ์]ํ
ํธ๋ฆฌ์ค",
|
1410 |
-
"created": "2024-11-18 00:00",
|
1411 |
-
"state": "READY"
|
1412 |
-
},
|
1413 |
-
{
|
1414 |
-
"url": "bydcnd.vercel.app",
|
1415 |
-
"name": "[๋ชจ๋ธ]3D ๋ถ์ ๋ชจํ",
|
1416 |
-
"created": "2024-11-18 00:00",
|
1417 |
-
"state": "READY"
|
1418 |
-
},
|
1419 |
-
{
|
1420 |
-
"url": "ijhama.vercel.app",
|
1421 |
-
"name": "ํฌ์ ํฌํธํด๋ฆฌ์ค ๋ถ์",
|
1422 |
-
"created": "2024-11-18 00:00",
|
1423 |
-
"state": "READY"
|
1424 |
-
},
|
1425 |
-
{
|
1426 |
-
"url": "oschnl.vercel.app",
|
1427 |
-
"name": "๋ก๋ ๋ฒํธ ๋ถ์/์ถ์ฒ",
|
1428 |
-
"created": "2024-11-18 00:00",
|
1429 |
-
"state": "READY"
|
1430 |
-
},
|
1431 |
-
{
|
1432 |
-
"url": "rzwzrq.vercel.app",
|
1433 |
-
"name": "์์
/CSV ๋ฐ์ดํฐ ๋ถ์",
|
1434 |
-
"created": "2024-11-18 00:00",
|
1435 |
-
"state": "READY"
|
1436 |
-
},
|
1437 |
-
{
|
1438 |
-
"url": "twkqre.vercel.app",
|
1439 |
-
"name": "[์ด์ธ]ํ๋ก์นด๋",
|
1440 |
-
"created": "2024-11-18 00:00",
|
1441 |
-
"state": "READY"
|
1442 |
-
},
|
1443 |
-
{
|
1444 |
-
"url": "htwymz.vercel.app",
|
1445 |
-
"name": "[๊ฒ์]์๋ฐฉํฌ๊ธฐ",
|
1446 |
-
"created": "2024-11-20 00:00",
|
1447 |
-
"state": "READY"
|
1448 |
-
},
|
1449 |
-
{
|
1450 |
-
"url": "mktmbn.vercel.app",
|
1451 |
-
"name": "[๊ฒ์]์ฐ์ฃผ์ ์",
|
1452 |
-
"created": "2024-11-19 00:00",
|
1453 |
-
"state": "READY"
|
1454 |
-
},
|
1455 |
-
{
|
1456 |
-
"url": "euguwt.vercel.app",
|
1457 |
-
"name": "[๊ฒ์]ํฌ์ธ์ด๋",
|
1458 |
-
"created": "2024-11-19 00:00",
|
1459 |
-
"state": "READY"
|
1460 |
-
},
|
1461 |
-
{
|
1462 |
-
"url": "qmdzoh.vercel.app",
|
1463 |
-
"name": "[๊ฒ์]ํ๋์ ์ง์ผ๋ผ",
|
1464 |
-
"created": "2024-11-19 00:00",
|
1465 |
-
"state": "READY"
|
1466 |
-
},
|
1467 |
-
{
|
1468 |
-
"url": "kofaqo.vercel.app",
|
1469 |
-
"name": "[๊ฒ์]์ด์ ์ถฉ๋!",
|
1470 |
-
"created": "2024-11-19 00:00",
|
1471 |
-
"state": "READY"
|
1472 |
-
},
|
1473 |
-
{
|
1474 |
-
"url": "qoqqkq.vercel.app",
|
1475 |
-
"name": "[๊ฒ์]๋๋์ฅ ์ก๊ธฐ",
|
1476 |
-
"created": "2024-11-19 00:00",
|
1477 |
-
"state": "READY"
|
1478 |
-
},
|
1479 |
-
{
|
1480 |
-
"url": "nmznel.vercel.app",
|
1481 |
-
"name": "[๊ฒ์]์ฅ๋ฅผ ์ก์๋ผ",
|
1482 |
-
"created": "2024-11-19 00:00",
|
1483 |
-
"state": "READY"
|
1484 |
-
},
|
1485 |
-
|
1486 |
-
|
1487 |
-
{
|
1488 |
-
"url": "psrrtp.vercel.app",
|
1489 |
-
"name": "[๋์๋ณด๋]์ธ๊ณ ์ธ๊ตฌ",
|
1490 |
-
"created": "2024-11-18 00:00",
|
1491 |
-
"state": "READY"
|
1492 |
-
},
|
1493 |
-
{
|
1494 |
-
"url": "xxloav.vercel.app",
|
1495 |
-
"name": "[๊ฒ์]๋ฒฝ๋ ๊นจ๊ธฐ",
|
1496 |
-
"created": "2024-11-18 00:00",
|
1497 |
-
"state": "READY"
|
1498 |
-
},
|
1499 |
-
{
|
1500 |
-
"url": "https://huggingface.co/spaces/openfree/edpaje",
|
1501 |
-
"name": "[๊ฒ์]๊ธฐ์ต๋ ฅ ์นด๋",
|
1502 |
-
"created": "2024-11-18 00:00",
|
1503 |
-
"state": "READY"
|
1504 |
-
},
|
1505 |
-
{
|
1506 |
-
"url": "https://huggingface.co/spaces/openfree/ixtidb",
|
1507 |
-
"name": "AI ์๋ฆฌ์ฌ",
|
1508 |
-
"created": "2024-11-18 00:00",
|
1509 |
-
"state": "READY"
|
1510 |
-
},
|
1511 |
-
|
1512 |
-
{
|
1513 |
-
"url": "cnlzji.vercel.app",
|
1514 |
-
"name": "๊ตญ๊ฐ ์ ๋ณด ๋น๊ต",
|
1515 |
-
"created": "2024-11-18 00:00",
|
1516 |
-
"state": "READY"
|
1517 |
-
},
|
1518 |
-
{
|
1519 |
-
"url": "fazely.vercel.app",
|
1520 |
-
"name": "์ํคํผ๋์ ์ง์ ๋ถ์",
|
1521 |
-
"created": "2024-11-18 00:00",
|
1522 |
-
"state": "READY"
|
1523 |
-
},
|
1524 |
-
{
|
1525 |
-
"url": "pkzhbo.vercel.app",
|
1526 |
-
"name": "์ธ๊ณ ๊ตญ๊ฐ๋ณ ์๊ฐ๋",
|
1527 |
-
"created": "2024-11-18 00:00",
|
1528 |
-
"state": "READY"
|
1529 |
-
},
|
1530 |
-
{
|
1531 |
-
"url": "pammgl.vercel.app",
|
1532 |
-
"name": "๋ณด๋์๋ฃ ๋ฐฐํฌ ์๋น์ค",
|
1533 |
-
"created": "2024-11-18 00:00",
|
1534 |
-
"state": "READY"
|
1535 |
-
},
|
1536 |
-
|
1537 |
-
|
1538 |
-
{
|
1539 |
-
"url": "https://ktduhm.vercel.app/",
|
1540 |
-
"name": "์ํ์ ๊ทธ๋ํ๋ก ์ดํด",
|
1541 |
-
"created": "2024-11-18 00:00",
|
1542 |
-
"state": "READY"
|
1543 |
-
},
|
1544 |
|
1545 |
-
|
1546 |
-
{
|
1547 |
-
"url": "vjmfoy.vercel.app",
|
1548 |
-
"name": "[๊ฒ์]3D ๋ฒฝ๋์๊ธฐ",
|
1549 |
-
"created": "2024-11-18 00:00",
|
1550 |
-
"state": "READY"
|
1551 |
-
},
|
1552 |
-
{
|
1553 |
-
"url": "aodakf.vercel.app",
|
1554 |
-
"name": "[๋ฒ์ถ์ผ]3D ๊ฐ์ํ์ค",
|
1555 |
-
"created": "2024-11-18 00:00",
|
1556 |
-
"state": "READY"
|
1557 |
-
},
|
1558 |
{
|
1559 |
"url": "mxoeue.vercel.app",
|
1560 |
"name": "์์ฑ ์์ฑ(TTS),์กฐ์ ",
|
|
|
279 |
"""
|
280 |
|
281 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
282 |
def load_best_templates():
|
283 |
json_data = load_json_data()[:12] # ๋ฒ ์คํธ ํ
ํ๋ฆฟ
|
284 |
return create_template_html("๐ ๋ฒ ์คํธ ํ
ํ๋ฆฟ", json_data)
|
|
|
371 |
# ์ ์ญ ๋ณ์๋ก ํ
ํ๋ฆฟ ๋ฐ์ดํฐ ์บ์
|
372 |
TEMPLATE_CACHE = None
|
373 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
374 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
375 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
376 |
|
377 |
|
378 |
# Demo ์ธ์คํด์ค ์์ฑ
|
|
|
443 |
except Exception as e:
|
444 |
print(f"Timestamp conversion error: {str(e)} for timestamp: {timestamp}")
|
445 |
return 'N/A'
|
446 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
447 |
|
448 |
def get_pastel_color(index):
|
449 |
"""Generate unique pastel colors based on index"""
|
|
|
603 |
</div>
|
604 |
"""
|
605 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
606 |
|
607 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
608 |
# Top Best URLs ์ ์
|
609 |
TOP_BEST_URLS = [
|
610 |
{
|
|
|
613 |
"created": "2024-11-18 00:00",
|
614 |
"state": "READY"
|
615 |
},
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
616 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
617 |
{
|
618 |
"url": "mxoeue.vercel.app",
|
619 |
"name": "์์ฑ ์์ฑ(TTS),์กฐ์ ",
|