openfree commited on
Commit
1d17776
ยท
verified ยท
1 Parent(s): 1101d45

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +1 -942
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),์กฐ์ •",