Update app.py
Browse files
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 |
-
|
109 |
-
|
110 |
-
|
|
|
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 |
-
|
240 |
-
|
|
|
|
|
241 |
|
|
|
242 |
if st.button("μκ°λ μ ν"):
|
243 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
244 |
|
245 |
-
#
|
246 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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("μ νλ μκ°λμ μμ λ€μ΄λ‘λ"):
|