haepada commited on
Commit
8101c4f
·
verified ·
1 Parent(s): e8f1811

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +142 -31
app.py CHANGED
@@ -525,12 +525,12 @@ self.addEventListener('fetch', event => {
525
  <html lang="ko">
526
  <head>
527
  <meta charset="UTF-8">
528
- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
529
  <title>디지털 굿판</title>
530
  <link rel="manifest" href="/manifest.json">
531
  <meta name="theme-color" content="#0b0f19">
532
  <meta name="apple-mobile-web-app-capable" content="yes">
533
- <meta name="apple-mobile-web-app-status-bar-style" content="black">
534
  <meta name="apple-mobile-web-app-title" content="디지털 굿판">
535
  <link rel="apple-touch-icon" href="/static/icons/icon-152x152.png">
536
  <style>
@@ -549,13 +549,13 @@ self.addEventListener('fetch', event => {
549
  background: black;
550
  z-index: 1000;
551
  }
552
- #gradio-app {
553
  background: #0b0f19 !important;
 
554
  </style>
555
  <script>
556
  // 페이지 로드 시 상단으로 스크롤
557
  window.addEventListener('load', function() {
558
- // 약간의 지연을 주어 컨텐츠가 모두 로드된 후 스크롤
559
  setTimeout(() => {
560
  window.scrollTo(0, 0);
561
  }, 100);
@@ -579,32 +579,41 @@ self.addEventListener('fetch', event => {
579
  }
580
  }
581
 
582
- // PWA 설치 관련
583
- if ('serviceWorker' in navigator) {
584
- window.addEventListener('load', function() {
585
- setTimeout(() => {
586
- window.scrollTo(0, 0);
587
- }, 100);
588
- });
589
- // 화면 꺼짐 방지
590
- async function preventSleep() {
591
- try {
592
- if ('wakeLock' in navigator) {
593
- const wakeLock = await navigator.wakeLock.request('screen');
594
- console.log('화면 켜짐 유지 활성화');
595
-
596
- document.addEventListener('visibilitychange', async () => {
597
- if (document.visibilityState === 'visible') {
598
- await preventSleep();
599
- }
600
- });
601
- }
602
- } catch (err) {
603
- console.log('화면 켜짐 유지 실패:', err);
 
 
 
 
 
 
 
 
 
604
  }
605
  }
606
 
607
- // 서비스 워커 등록
608
  if ('serviceWorker' in navigator) {
609
  window.addEventListener('load', async () => {
610
  try {
@@ -944,8 +953,9 @@ def create_interface():
944
  color: #4a90e2 !important;
945
  }
946
  }
 
947
  /* Hugging Face 로고 숨기기 */
948
- div.gr-header {
949
  display: none !important;
950
  }
951
 
@@ -1037,6 +1047,65 @@ def create_interface():
1037
  background: #000000;
1038
  }
1039
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1040
  """
1041
 
1042
  with gr.Blocks(theme=gr.themes.Soft(), css=css) as app:
@@ -1113,12 +1182,26 @@ def create_interface():
1113
 
1114
  with gr.TabItem("청신") as tab_listen:
1115
  gr.Markdown("## 청신 - 신을 부르기 위한 정화 의식")
 
 
 
 
 
 
 
1116
  gr.Markdown("""
1117
  **청신(淸神)** 단계는 신을 부르는 의식으로, 정화와 연결의 의미를 담고 있습니다.
1118
  이 단계에서는 참여자가 도시의 번잡함에서 벗어나 내면의 고요함을 찾고 신성과의 교감을 시작하게 됩니다.
1119
 
1120
  본격적인 의식을 시작하기 전, 마음을 정화하고 감각을 열어 경험에 몰입할 준비를 마치세요
1121
-
 
 
 
 
 
 
 
1122
  **보다 몰입된 경험을 위해**
1123
  이 경험은 부산 동래구 온천장역에서 시작하여, 금정구 장전역까지 온천천을 따라 신화적 공간과 연결될 수 있도록 설계되었습니다.
1124
  특히 이곳에서 시작하면 온천천의 자연스러운 소리와 금샘의 생명력을 더욱 깊이 느낄 수 있습니다.
@@ -1572,13 +1655,41 @@ def create_interface():
1572
  analyze_btn.click(
1573
  fn=safe_analyze_voice,
1574
  inputs=[voice_input, state],
1575
- outputs=[state, transcribed_text, voice_emotion, text_emotion, final_prompt, status_display]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1576
  )
1577
 
1578
  generate_btn.click(
1579
  fn=generate_image_from_prompt,
1580
  inputs=[final_prompt],
1581
- outputs=[result_image]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1582
  )
1583
 
1584
  save_final_btn.click(
 
525
  <html lang="ko">
526
  <head>
527
  <meta charset="UTF-8">
528
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no, viewport-fit=cover">
529
  <title>디지털 굿판</title>
530
  <link rel="manifest" href="/manifest.json">
531
  <meta name="theme-color" content="#0b0f19">
532
  <meta name="apple-mobile-web-app-capable" content="yes">
533
+ <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
534
  <meta name="apple-mobile-web-app-title" content="디지털 굿판">
535
  <link rel="apple-touch-icon" href="/static/icons/icon-152x152.png">
536
  <style>
 
549
  background: black;
550
  z-index: 1000;
551
  }
552
+ #gradio-app {
553
  background: #0b0f19 !important;
554
+ }
555
  </style>
556
  <script>
557
  // 페이지 로드 시 상단으로 스크롤
558
  window.addEventListener('load', function() {
 
559
  setTimeout(() => {
560
  window.scrollTo(0, 0);
561
  }, 100);
 
579
  }
580
  }
581
 
582
+ // 로딩 상태 관리 함수들
583
+ function showLoading(buttonId, loadingText) {
584
+ // 버튼 비활성화
585
+ const button = document.getElementById(buttonId);
586
+ if (button) {
587
+ button.disabled = true;
588
+ button.innerHTML = loadingText;
589
+ }
590
+
591
+ // 로딩 오버레이 표시
592
+ const overlay = document.createElement('div');
593
+ overlay.className = 'processing-overlay';
594
+ overlay.innerHTML = `
595
+ <div class="loading-spinner"></div>
596
+ <div class="loading-text">${loadingText}</div>
597
+ `;
598
+ document.body.appendChild(overlay);
599
+ }
600
+
601
+ function hideLoading(buttonId, originalText) {
602
+ // 버튼 활성화
603
+ const button = document.getElementById(buttonId);
604
+ if (button) {
605
+ button.disabled = false;
606
+ button.innerHTML = originalText;
607
+ }
608
+
609
+ // 로딩 오버레이 제거
610
+ const overlay = document.querySelector('.processing-overlay');
611
+ if (overlay) {
612
+ overlay.remove();
613
  }
614
  }
615
 
616
+ // PWA 설치 관련
617
  if ('serviceWorker' in navigator) {
618
  window.addEventListener('load', async () => {
619
  try {
 
953
  color: #4a90e2 !important;
954
  }
955
  }
956
+
957
  /* Hugging Face 로고 숨기기 */
958
+ .div.gr-header {
959
  display: none !important;
960
  }
961
 
 
1047
  background: #000000;
1048
  }
1049
  }
1050
+ /* 로딩 상태 표시 */
1051
+ .processing-overlay {
1052
+ position: fixed;
1053
+ top: 0;
1054
+ left: 0;
1055
+ right: 0;
1056
+ bottom: 0;
1057
+ background: rgba(11, 15, 25, 0.8);
1058
+ display: flex;
1059
+ justify-content: center;
1060
+ align-items: center;
1061
+ z-index: 1000;
1062
+ }
1063
+
1064
+ .loading-spinner {
1065
+ width: 50px;
1066
+ height: 50px;
1067
+ border: 5px solid #f3f3f3;
1068
+ border-top: 5px solid #4a90e2;
1069
+ border-radius: 50%;
1070
+ animation: spin 1s linear infinite;
1071
+ }
1072
+
1073
+ .loading-text {
1074
+ position: absolute;
1075
+ top: 60%;
1076
+ left: 50%;
1077
+ transform: translateX(-50%);
1078
+ color: white;
1079
+ font-size: 18px;
1080
+ }
1081
+
1082
+ @keyframes spin {
1083
+ 0% { transform: rotate(0deg); }
1084
+ 100% { transform: rotate(360deg); }
1085
+ }
1086
+
1087
+ /* 버튼 비활성화 스타일 */
1088
+ .gradio-button:disabled {
1089
+ opacity: 0.6;
1090
+ cursor: not-allowed;
1091
+ }
1092
+
1093
+ /* 이미지 컨테이너 스타일 */
1094
+ .location-image-container,
1095
+ .oncheon-image-container {
1096
+ width: 100%;
1097
+ margin: 1rem 0;
1098
+ text-align: center;
1099
+ }
1100
+
1101
+ .location-image,
1102
+ .oncheon-image {
1103
+ width: 100%;
1104
+ max-width: 600px;
1105
+ height: auto;
1106
+ border-radius: 12px;
1107
+ margin: 0 auto;
1108
+ }
1109
  """
1110
 
1111
  with gr.Blocks(theme=gr.themes.Soft(), css=css) as app:
 
1182
 
1183
  with gr.TabItem("청신") as tab_listen:
1184
  gr.Markdown("## 청신 - 신을 부르기 위한 정화 의식")
1185
+ # 온천 이미지 추가
1186
+ oncheon_image = encode_image_to_base64("static/oncheon.png")
1187
+ gr.HTML(f"""
1188
+ <div class="oncheon-image-container">
1189
+ <img src="data:image/png;base64,{oncheon_image}" alt="온천천 이미지" class="oncheon-image">
1190
+ </div>
1191
+ """)
1192
  gr.Markdown("""
1193
  **청신(淸神)** 단계는 신을 부르는 의식으로, 정화와 연결의 의미를 담고 있습니다.
1194
  이 단계에서는 참여자가 도시의 번잡함에서 벗어나 내면의 고요함을 찾고 신성과의 교감을 시작하게 됩니다.
1195
 
1196
  본격적인 의식을 시작하기 전, 마음을 정화하고 감각을 열어 경험에 몰입할 준비를 마치세요
1197
+ """)
1198
+ location_image = encode_image_to_base64("static/location.png")
1199
+ gr.HTML(f"""
1200
+ <div class="location-image-container">
1201
+ <img src="data:image/png;base64,{location_image}" alt="위치 안내 이미지" class="location-image">
1202
+ </div>
1203
+ """)
1204
+ gr.Markdown("""
1205
  **보다 몰입된 경험을 위해**
1206
  이 경험은 부산 동래구 온천장역에서 시작하여, 금정구 장전역까지 온천천을 따라 신화적 공간과 연결될 수 있도록 설계되었습니다.
1207
  특히 이곳에서 시작하면 온천천의 자연스러운 소리와 금샘의 생명력을 더욱 깊이 느낄 수 있습니다.
 
1655
  analyze_btn.click(
1656
  fn=safe_analyze_voice,
1657
  inputs=[voice_input, state],
1658
+ outputs=[state, transcribed_text, voice_emotion, text_emotion, final_prompt, status_display],
1659
+ _js=f"""
1660
+ async (voice_input, state) => {{
1661
+ if (!voice_input) {{
1662
+ return;
1663
+ }}
1664
+ showLoading('analyze-btn', '분석 중...');
1665
+ try {{
1666
+ const result = await original_fn(voice_input, state);
1667
+ return result;
1668
+ }} finally {{
1669
+ hideLoading('analyze-btn', '소원 분석하기');
1670
+ }}
1671
+ }}
1672
+ """
1673
  )
1674
 
1675
  generate_btn.click(
1676
  fn=generate_image_from_prompt,
1677
  inputs=[final_prompt],
1678
+ outputs=[result_image],
1679
+ _js=f"""
1680
+ async (prompt) => {{
1681
+ if (!prompt) {{
1682
+ return;
1683
+ }}
1684
+ showLoading('generate-btn', '그림 생성 중...');
1685
+ try {{
1686
+ const result = await original_fn(prompt);
1687
+ return result;
1688
+ }} finally {{
1689
+ hideLoading('generate-btn', '마음의 그림 그리기');
1690
+ }}
1691
+ }}
1692
+ """
1693
  )
1694
 
1695
  save_final_btn.click(