lcjln commited on
Commit
771aad7
Β·
verified Β·
1 Parent(s): f40f90d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +49 -51
app.py CHANGED
@@ -17,7 +17,7 @@ st.title("VOD μ±„νŒ… 크둀러")
17
  st.write("VOD URL을 μž…λ ₯ν•˜κ³  μ±„νŒ… 데이터λ₯Ό ν¬λ‘€λ§ν•©λ‹ˆλ‹€.")
18
 
19
  # URL μž…λ ₯ λ°›κΈ°
20
- vod_url = st.text_input("VOD URL μž…λ ₯")
21
 
22
  # μ„ νƒλœ μ‹œκ°„λŒ€λ₯Ό μ €μž₯ν•  곡간
23
  if 'selected_times' not in st.session_state:
@@ -105,9 +105,10 @@ def crawl_chats(vod_url):
105
  laugh_counts[minute_key] += 1
106
 
107
  total_chats_collected += len(chats)
108
- elapsed_time = time.time() - start_time # κ²½κ³Ό μ‹œκ°„ 계산
109
- elapsed_minutes, elapsed_seconds = divmod(int(elapsed_time), 60)
110
- status_text.text(f"ν˜„μž¬κΉŒμ§€ μˆ˜μ§‘λœ μ±„νŒ… λ©”μ‹œμ§€ 개수: {total_chats_collected} | κ²½κ³Ό μ‹œκ°„: {elapsed_minutes}λΆ„ {elapsed_seconds}초")
 
111
 
112
  # λ‹€μŒ μš”μ²­μ„ μœ„ν•΄ playerMessageTime νŒŒλΌλ―Έν„° μ—…λ°μ΄νŠΈ
113
  next_time = data["content"].get("nextPlayerMessageTime")
@@ -117,45 +118,6 @@ def crawl_chats(vod_url):
117
 
118
  return "\n".join(chat_logs), chat_counts, laugh_counts
119
 
120
- # μ„ νƒν•œ μ‹œκ°„λŒ€ μΆ”κ°€ 및 좜λ ₯
121
- def add_selected_time(hour, minute):
122
- time_str = f"{int(hour):02}:{int(minute):02}:00" # HH:MM:00 ν˜•μ‹
123
- if time_str not in st.session_state['selected_times']:
124
- st.session_state['selected_times'].append(time_str)
125
-
126
- # μ„ νƒλœ μ‹œκ°„λŒ€λ₯Ό ν‘œμ‹œ 및 μ‚­μ œ κΈ°λŠ₯
127
- def display_selected_times():
128
- if st.session_state['selected_times']:
129
- st.write("### μ„ νƒλœ μ‹œκ°„λŒ€")
130
- for time in st.session_state['selected_times']:
131
- col1, col2 = st.columns([9, 1])
132
- col1.write(f"{time}")
133
- if col2.button("X", key=f"remove_{time}"):
134
- st.session_state['selected_times'].remove(time)
135
-
136
- # yt-dlpλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ νƒλœ μ‹œκ°„λŒ€μ˜ μ˜μƒμ„ λ‹€μš΄λ‘œλ“œ
137
- def download_clips():
138
- if st.session_state['selected_times']:
139
- st.write("### μ˜μƒ λ‹€μš΄λ‘œλ“œ")
140
- for idx, start_time in enumerate(st.session_state['selected_times']):
141
- start_time_obj = datetime.datetime.strptime(start_time, '%H:%M:%S')
142
- end_time_obj = start_time_obj + datetime.timedelta(minutes=1)
143
-
144
- # μ‹œμž‘ μ‹œκ°„κ³Ό 끝 μ‹œκ°„μ„ HH:MM:SS ν˜•μ‹μœΌλ‘œ λ³€ν™˜
145
- start_time_str = start_time_obj.strftime('%H:%M:%S')
146
- end_time_str = end_time_obj.strftime('%H:%M:%S')
147
-
148
- # yt-dlp λ‹€μš΄λ‘œλ“œ λͺ…λ Ήμ–΄ μ‹€ν–‰
149
- output_filename = f"clip_{idx + 1}.mp4"
150
- ydl_opts = {
151
- 'outtmpl': output_filename,
152
- 'download_sections': [f"*{start_time_str}-{end_time_str}"]
153
- }
154
-
155
- st.write(f"λ‹€μš΄λ‘œλ“œ 쀑: {start_time_str} ~ {end_time_str} | 파일λͺ…: {output_filename}")
156
- with yt_dlp.YoutubeDL(ydl_opts) as ydl:
157
- ydl.download([vod_url[:-6]]) # Remove the last 6 characters ('/chats')
158
-
159
  # λ²„νŠΌμ„ λˆŒλ €μ„ λ•Œ μ±„νŒ… 크둀링 μ‹œμž‘
160
  if 'chat_logs' not in st.session_state:
161
  st.session_state['chat_logs'] = None
@@ -227,23 +189,59 @@ if st.session_state['chat_logs']:
227
  xaxis=dict(showticklabels=False), # xμΆ• μ‹œκ°„ λ ˆμ΄λΈ” μˆ¨κΉ€
228
  hovermode="x unified", # 마우슀λ₯Ό μ˜¬λ Έμ„ λ•Œ ν•΄λ‹Ή xμΆ•μ—μ„œ 툴팁 ν‘œμ‹œ
229
  showlegend=True,
230
- margin=dict(l=50, r=50, t=100, b=100),
231
- height=600 # κ·Έλž˜ν”„ 높이 μ„€μ •
232
  )
233
 
234
  # κ·Έλž˜ν”„ 좜λ ₯
235
  st.plotly_chart(fig, use_container_width=True)
236
 
237
- # μ‹œκ°„λŒ€ μž…λ ₯ ν•„λ“œ
238
  col1, col2 = st.columns([1, 1])
239
- hour = col1.number_input("μ‹œκ°„", min_value=0, max_value=23, format="%d", value=0)
240
- minute = col2.number_input("λΆ„", min_value=0, max_value=59, format="%d", value=0)
 
 
241
 
 
242
  if st.button("μ‹œκ°„λŒ€ 선택"):
243
- add_selected_time(hour, minute)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
244
 
245
- # οΏ½οΏ½νƒλœ μ‹œκ°„λŒ€ ν‘œμ‹œ
246
- display_selected_times()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
 
248
  # λ‹€μš΄λ‘œλ“œ λ²„νŠΌ ν‘œμ‹œ
249
  if st.button("μ„ νƒλœ μ‹œκ°„λŒ€μ˜ μ˜μƒ λ‹€μš΄λ‘œλ“œ"):
 
17
  st.write("VOD URL을 μž…λ ₯ν•˜κ³  μ±„νŒ… 데이터λ₯Ό ν¬λ‘€λ§ν•©λ‹ˆλ‹€.")
18
 
19
  # URL μž…λ ₯ λ°›κΈ°
20
+ vod_url = st.text_input("VOD URL μž…λ ₯", "https://chzzk.naver.com/video/3890359")
21
 
22
  # μ„ νƒλœ μ‹œκ°„λŒ€λ₯Ό μ €μž₯ν•  곡간
23
  if 'selected_times' not in st.session_state:
 
105
  laugh_counts[minute_key] += 1
106
 
107
  total_chats_collected += len(chats)
108
+
109
+ # ν˜„μž¬ μ‹œκ°„κ³Ό κ²½κ³Ό μ‹œκ°„ ν‘œμ‹œ
110
+ elapsed_time = time.time() - start_time
111
+ status_text.text(f"ν˜„μž¬κΉŒμ§€ μˆ˜μ§‘λœ μ±„νŒ… λ©”μ‹œμ§€ 개수: {total_chats_collected} | κ²½κ³Ό μ‹œκ°„: {int(elapsed_time // 60)}λΆ„ {int(elapsed_time % 60)}초")
112
 
113
  # λ‹€μŒ μš”μ²­μ„ μœ„ν•΄ playerMessageTime νŒŒλΌλ―Έν„° μ—…λ°μ΄νŠΈ
114
  next_time = data["content"].get("nextPlayerMessageTime")
 
118
 
119
  return "\n".join(chat_logs), chat_counts, laugh_counts
120
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  # λ²„νŠΌμ„ λˆŒλ €μ„ λ•Œ μ±„νŒ… 크둀링 μ‹œμž‘
122
  if 'chat_logs' not in st.session_state:
123
  st.session_state['chat_logs'] = None
 
189
  xaxis=dict(showticklabels=False), # xμΆ• μ‹œκ°„ λ ˆμ΄λΈ” μˆ¨κΉ€
190
  hovermode="x unified", # 마우슀λ₯Ό μ˜¬λ Έμ„ λ•Œ ν•΄λ‹Ή xμΆ•μ—μ„œ 툴팁 ν‘œμ‹œ
191
  showlegend=True,
192
+ margin=dict(l=50, r=50, t=100, b=100)
 
193
  )
194
 
195
  # κ·Έλž˜ν”„ 좜λ ₯
196
  st.plotly_chart(fig, use_container_width=True)
197
 
198
+ # μ‹œκ°„ μž…λ ₯ ν•„λ“œ
199
  col1, col2 = st.columns([1, 1])
200
+ with col1:
201
+ hour = st.number_input("μ‹œκ°„", min_value=0, max_value=23, value=0)
202
+ with col2:
203
+ minute = st.number_input("λΆ„", min_value=0, max_value=59, value=0)
204
 
205
+ # μ„ νƒλœ μ‹œκ°„λŒ€ μΆ”κ°€ λ²„νŠΌ
206
  if st.button("μ‹œκ°„λŒ€ 선택"):
207
+ selected_time = f"{hour:02}:{minute:02}:00" # "HH:MM:SS" ν˜•μ‹μœΌλ‘œ λ³€ν™˜
208
+ if selected_time not in st.session_state['selected_times']:
209
+ st.session_state['selected_times'].append(selected_time)
210
+
211
+ # μž…λ ₯ μΉΈ μ΄ˆκΈ°ν™”
212
+ hour = 0
213
+ minute = 0
214
+
215
+ # μ„ νƒλœ μ‹œκ°„λŒ€λ₯Ό ν‘œμ‹œ 및 μ‚­μ œ κΈ°λŠ₯
216
+ if st.session_state['selected_times']:
217
+ st.write("### μ„ νƒλœ μ‹œκ°„λŒ€")
218
+ for time in st.session_state['selected_times']:
219
+ col1, col2 = st.columns([9, 1])
220
+ col1.write(f"{time}")
221
+ if col2.button("X", key=f"remove_{time}"):
222
+ st.session_state['selected_times'].remove(time)
223
 
224
+ # yt-dlpλ₯Ό μ‚¬μš©ν•˜μ—¬ μ„ νƒλœ μ‹œκ°„λŒ€μ˜ μ˜μƒμ„ λ‹€μš΄λ‘œλ“œ
225
+ def download_clips():
226
+ if st.session_state['selected_times']:
227
+ for idx, start_time in enumerate(st.session_state['selected_times']):
228
+ start_time_obj = datetime.datetime.strptime(start_time, '%H:%M:%S')
229
+ end_time_obj = start_time_obj + datetime.timedelta(minutes=1)
230
+
231
+ # μ‹œμž‘ μ‹œκ°„κ³Ό 끝 μ‹œκ°„μ„ HH:MM:SS ν˜•μ‹μœΌλ‘œ λ³€ν™˜
232
+ start_time_str = start_time_obj.strftime('%H:%M:%S')
233
+ end_time_str = end_time_obj.strftime('%H:%M:%S')
234
+
235
+ # yt-dlp λ‹€μš΄λ‘œλ“œ λͺ…λ Ήμ–΄ μ‹€ν–‰
236
+ output_filename = f"clip_{idx + 1}.mp4"
237
+ ydl_opts = {
238
+ 'outtmpl': os.path.join(os.path.expanduser("~/Downloads"), output_filename),
239
+ 'download_sections': [f"*{start_time_str}-{end_time_str}"]
240
+ }
241
+
242
+ st.write(f"λ‹€μš΄λ‘œλ“œ 쀑: {start_time_str} ~ {end_time_str} | 파일λͺ…: {output_filename}")
243
+ with yt_dlp.YoutubeDL(ydl_opts) as ydl:
244
+ ydl.download([vod_url[:-6]]) # Remove the last 6 characters ('/chats')
245
 
246
  # λ‹€μš΄λ‘œλ“œ λ²„νŠΌ ν‘œμ‹œ
247
  if st.button("μ„ νƒλœ μ‹œκ°„λŒ€μ˜ μ˜μƒ λ‹€μš΄λ‘œλ“œ"):