pcdoido2 commited on
Commit
5eadf15
·
verified ·
1 Parent(s): 949b5e2

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +62 -29
app.py CHANGED
@@ -125,10 +125,10 @@ if st.session_state.processando:
125
  status.markdown("🔎 Analisando duração e resolução do vídeo...")
126
  barra.progress(5)
127
 
 
128
  duracao_cmd = [
129
  "ffprobe", "-v", "error", "-show_entries",
130
- "format=duration", "-of",
131
- "default=noprint_wrappers=1:nokey=1", video_path
132
  ]
133
  resultado = subprocess.run(duracao_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
134
  dur = float(resultado.stdout.decode().strip())
@@ -148,29 +148,66 @@ if st.session_state.processando:
148
  excluir_fim = st.session_state.excluir_fim
149
  velocidade_cortes = st.session_state.velocidade_cortes
150
 
151
- cortes = []
152
- usados = set()
153
 
154
- barra.progress(15)
155
- status.markdown("✂️ Realizando cortes...")
156
-
157
- if st.session_state.embaralhar_cortes:
158
- corte_min = st.session_state.corte_min
159
- corte_max = st.session_state.corte_max
160
 
161
- partes = []
162
  if excluir_inicio > 0:
163
- partes.append((0, excluir_inicio))
 
 
 
 
 
164
  if excluir_fim < dur:
165
- partes.append((excluir_fim, dur))
 
 
 
 
 
 
 
 
 
 
 
166
 
167
- for inicio, fim in partes:
168
- pos = inicio
169
- while pos < fim:
170
- tam_possivel = min(corte_max, fim - pos)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
171
  if tam_possivel < corte_min:
172
  break
173
- tamanho = random.randint(corte_min, tam_possivel)
174
  fim_corte = pos + tamanho
175
 
176
  if (pos, fim_corte) not in usados:
@@ -178,24 +215,20 @@ if st.session_state.processando:
178
  usados.add((pos, fim_corte))
179
  pos = fim_corte
180
 
181
- random.shuffle(cortes)
182
- else:
183
- # Apenas remover o trecho entre excluir_inicio e excluir_fim
184
- if excluir_inicio > 0:
185
- cortes.append((0, excluir_inicio))
186
- if excluir_fim < dur:
187
- cortes.append((excluir_fim, dur))
188
- barra.progress(25)
189
 
190
- # --- PROCESSAR OS CORTES ---
191
- with tempfile.TemporaryDirectory() as tmpdir:
192
  arquivos_cortes = []
193
  total_cortes = len(cortes)
 
194
  for idx, (start, end) in enumerate(cortes):
195
  saida = os.path.join(tmpdir, f"clip_{idx}.mp4")
196
 
197
  subprocess.call([
198
- "ffmpeg", "-y", "-i", video_path,
199
  "-ss", str(start), "-to", str(end),
200
  "-filter:v", f"setpts=PTS/{velocidade_cortes}",
201
  "-an",
 
125
  status.markdown("🔎 Analisando duração e resolução do vídeo...")
126
  barra.progress(5)
127
 
128
+ # Duração e resolução
129
  duracao_cmd = [
130
  "ffprobe", "-v", "error", "-show_entries",
131
+ "format=duration", "-of", "default=noprint_wrappers=1:nokey=1", video_path
 
132
  ]
133
  resultado = subprocess.run(duracao_cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
134
  dur = float(resultado.stdout.decode().strip())
 
148
  excluir_fim = st.session_state.excluir_fim
149
  velocidade_cortes = st.session_state.velocidade_cortes
150
 
151
+ barra.progress(10)
152
+ status.markdown("🧹 Removendo parte indesejada...")
153
 
154
+ with tempfile.TemporaryDirectory() as tmpdir:
155
+ parte1 = os.path.join(tmpdir, "parte1.mp4")
156
+ parte2 = os.path.join(tmpdir, "parte2.mp4")
157
+ video_base = os.path.join(tmpdir, "video_base.mp4")
 
 
158
 
 
159
  if excluir_inicio > 0:
160
+ subprocess.call([
161
+ "ffmpeg", "-y", "-i", video_path,
162
+ "-t", str(excluir_inicio),
163
+ "-c", "copy",
164
+ parte1
165
+ ])
166
  if excluir_fim < dur:
167
+ subprocess.call([
168
+ "ffmpeg", "-y", "-i", video_path,
169
+ "-ss", str(excluir_fim),
170
+ "-c", "copy",
171
+ parte2
172
+ ])
173
+
174
+ with open(os.path.join(tmpdir, "lista_remocao.txt"), "w") as f:
175
+ if os.path.exists(parte1):
176
+ f.write(f"file '{parte1}'\n")
177
+ if os.path.exists(parte2):
178
+ f.write(f"file '{parte2}'\n")
179
 
180
+ subprocess.call([
181
+ "ffmpeg", "-y", "-f", "concat", "-safe", "0", "-i",
182
+ os.path.join(tmpdir, "lista_remocao.txt"),
183
+ "-c", "copy",
184
+ video_base
185
+ ])
186
+
187
+ barra.progress(15)
188
+ status.markdown("✂️ Preparando cortes...")
189
+
190
+ cortes = []
191
+ usados = set()
192
+
193
+ if st.session_state.embaralhar_cortes:
194
+ corte_min = st.session_state.corte_min
195
+ corte_max = st.session_state.corte_max
196
+
197
+ # Duração nova (do vídeo já limpo)
198
+ resultado = subprocess.run([
199
+ "ffprobe", "-v", "error", "-show_entries",
200
+ "format=duration", "-of",
201
+ "default=noprint_wrappers=1:nokey=1", video_base
202
+ ], stdout=subprocess.PIPE)
203
+ dur_base = float(resultado.stdout.decode().strip())
204
+
205
+ pos = 0
206
+ while pos < dur_base:
207
+ tam_possivel = min(corte_max, dur_base - pos)
208
  if tam_possivel < corte_min:
209
  break
210
+ tamanho = random.randint(corte_min, int(tam_possivel))
211
  fim_corte = pos + tamanho
212
 
213
  if (pos, fim_corte) not in usados:
 
215
  usados.add((pos, fim_corte))
216
  pos = fim_corte
217
 
218
+ random.shuffle(cortes)
219
+ else:
220
+ # Sem cortes usa vídeo limpo
221
+ cortes = [(0, dur)] # isso será ignorado e o vídeo_base usado direto mais abaixo
222
+ barra.progress(25)
 
 
 
223
 
 
 
224
  arquivos_cortes = []
225
  total_cortes = len(cortes)
226
+
227
  for idx, (start, end) in enumerate(cortes):
228
  saida = os.path.join(tmpdir, f"clip_{idx}.mp4")
229
 
230
  subprocess.call([
231
+ "ffmpeg", "-y", "-i", video_base,
232
  "-ss", str(start), "-to", str(end),
233
  "-filter:v", f"setpts=PTS/{velocidade_cortes}",
234
  "-an",