salomonsky commited on
Commit
49b505f
·
1 Parent(s): 99ba69c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +56 -84
app.py CHANGED
@@ -1,62 +1,27 @@
1
- import os
2
- import zipfile
3
- import random
4
- import base64
5
- from others import *
6
- import streamlit as st
7
- from io import BytesIO
8
- from moviepy.editor import vfx
9
- from streamlit_option_menu import option_menu
10
- from youtube import youtube, download_youtube
11
- from moviepy.video.io.VideoFileClip import VideoFileClip
12
- import tempfile
13
 
14
- def session(info_list):
15
- st.video(info_list[1])
16
- st.text(f"Video Information: {info_list[0]}")
17
- if len(info_list) == 5:
18
- st.text(f"Duration: {info_list[3]} - {info_list[4]} seconds")
19
-
20
- def random_cuts(video_clip, title, num_cuts=1, duration=60, speed_factor=1.0, mute_audio=False, use_aspect_ratio=None):
21
- total_duration = video_clip.duration
22
- cuts = []
23
-
24
- for _ in range(num_cuts):
25
- start_time = random.uniform(0, max(total_duration - duration, 0))
26
- end_time = min(start_time + duration, total_duration)
27
- cuts.append((start_time, end_time))
28
-
29
- output_files = []
30
- prev_end_time = 0
31
-
32
- for i, (start_time, end_time) in enumerate(cuts):
33
- if start_time == prev_end_time:
34
- continue
35
-
36
- output_file = f"{title}_cut_{i+1}.mp4"
37
- temp_filename = None
38
-
39
- with tempfile.NamedTemporaryFile(suffix=".mp4", delete=False) as temp_file:
40
- temp_filename = temp_file.name
41
-
42
- clipped_clip = video_clip.subclip(start_time, end_time)
43
-
44
- if mute_audio:
45
- clipped_clip = clipped_clip.set_audio(None)
46
-
47
- clipped_clip = clipped_clip.fx(vfx.speedx, speed_factor)
48
-
49
  if use_aspect_ratio:
50
- original_width, original_height = video_clip.size
51
-
52
  if use_aspect_ratio == '21:9':
53
  target_ratio = 21 / 9
54
  else:
55
  target_ratio = 16 / 9 if use_aspect_ratio == '16:9' else 9 / 16
56
-
57
  target_width = int(original_height * target_ratio)
58
  target_height = original_height
59
-
60
  if use_aspect_ratio == '21:9':
61
  target_height = int(original_width / target_ratio)
62
  margin = (original_height - target_height) // 2
@@ -64,12 +29,12 @@ def random_cuts(video_clip, title, num_cuts=1, duration=60, speed_factor=1.0, mu
64
  else:
65
  margin = (original_width - target_width) // 2
66
  clipped_clip = clipped_clip.crop(x1=margin, x2=original_width - margin)
67
-
68
- with st.spinner(f'Procesando video {i+1} de {num_cuts}...'):
69
- clipped_clip.write_videofile(temp_filename, codec="libx264", audio_codec="aac", verbose=False)
70
 
71
- output_files.append(temp_filename)
72
- prev_end_time = end_time
73
 
74
  return output_files, cuts
75
 
@@ -86,42 +51,49 @@ def download_all_button(cut_files):
86
  href = f'<a href="data:application/zip;base64,{b64}" download="{zip_filename}">Descargar Todos</a>'
87
  st.markdown(href, unsafe_allow_html=True)
88
 
89
- st.title("Descargador de Videos")
90
- video_link = st.text_input("Enlace del Video", value='')
91
- video_input = st.file_uploader("Cargar Video", type=["mp4", "avi", "mov"])
92
-
93
- aspect_ratio_options = ['16:9', '9:16', '21:9']
94
- aspect_ratio_choice = st.selectbox('Seleccionar Proporción:', aspect_ratio_options, index=2)
95
- resolution_options = [144, 240, 360, 720]
96
- resolution_choice = st.selectbox('Seleccionar Resolución:', resolution_options, index=2)
97
-
98
- choice = st.radio('Seleccionar Proceso:', ['Cortar Video', 'Descargar Completo'], 1)
99
 
100
- if st.button("Procesar"):
101
- if video_input is not None:
102
- video_clip = VideoFileClip(video_input)
103
- video_clip = video_clip.subclip(0, video_clip.duration) # Ajusta la duración si es necesario
104
 
105
- if choice == 'Cortar Video':
106
- num_cuts = st.slider('Seleccionar número de cortes', 1, 10, 1)
107
- duration_minutes_slider = st.slider('Seleccionar duración de los cortes (minutos)', 1, 180, 1)
108
- duration_seconds = duration_minutes_slider * 60
109
- speed_factor = st.slider('Seleccionar velocidad del video', -2.0, 3.0, 1.0)
110
- mute_audio = st.checkbox('Eliminar sonido de los videos cortados')
111
 
112
- cuts = random_cuts(video_clip, "video_cortado", num_cuts=num_cuts, duration=duration_seconds, speed_factor=speed_factor, mute_audio=mute_audio, use_aspect_ratio=aspect_ratio_choice)
 
 
 
 
113
 
114
- output_files, _ = cuts
115
- download_all_button(output_files)
 
 
 
116
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
117
  else:
118
  if st.button(f"Descargar {seleccionado}"):
119
  video_file, titulo_video, video_info, thumbnail_file = funcion(video_link, resolusi_input=resolution_choice)
120
  file_size = os.path.getsize(video_file)
121
  info_list = [titulo_video, video_file, thumbnail_file]
122
  download_all_button([video_file])
123
- session(info_list)
124
- for temp_filename in output_files:
125
- os.remove(temp_filename)
126
-
127
- st.success("Proceso completado y archivos temporales eliminados.")
 
 
 
 
 
 
 
 
 
 
 
 
 
1
 
2
+ if use_aspect_ratio:
3
+ original_width, original_height = clip.size
4
+
5
+ if use_aspect_ratio == '16:9':
6
+ target_ratio = 16 / 9
7
+ elif use_aspect_ratio == '9:16':
8
+ target_ratio = 9 / 16
9
+ elif use_aspect_ratio == '21:9':
10
+ target_ratio = 21 / 9
11
+ else:
12
+ target_ratio = 16 / 9
13
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14
  if use_aspect_ratio:
15
+ original_width, original_height = clip.size
16
+
17
  if use_aspect_ratio == '21:9':
18
  target_ratio = 21 / 9
19
  else:
20
  target_ratio = 16 / 9 if use_aspect_ratio == '16:9' else 9 / 16
21
+
22
  target_width = int(original_height * target_ratio)
23
  target_height = original_height
24
+
25
  if use_aspect_ratio == '21:9':
26
  target_height = int(original_width / target_ratio)
27
  margin = (original_height - target_height) // 2
 
29
  else:
30
  margin = (original_width - target_width) // 2
31
  clipped_clip = clipped_clip.crop(x1=margin, x2=original_width - margin)
32
+
33
+ with st.spinner(f'Procesando video {i+1} de {num_cuts}...'):
34
+ clipped_clip.write_videofile(output_file, codec="libx264", audio_codec="aac", verbose=False)
35
 
36
+ output_files.append(output_file)
37
+ prev_end_time = end_time
38
 
39
  return output_files, cuts
40
 
 
51
  href = f'<a href="data:application/zip;base64,{b64}" download="{zip_filename}">Descargar Todos</a>'
52
  st.markdown(href, unsafe_allow_html=True)
53
 
54
+ opciones = ['YouTube']
 
 
 
 
 
 
 
 
 
55
 
56
+ with st.sidebar:
57
+ seleccionado = option_menu("Descargador", opciones, icons=['play'], menu_icon="cast", default_index=0)
 
 
58
 
59
+ funciones = [youtube]
 
 
 
 
 
60
 
61
+ if seleccionado:
62
+ indice = opciones.index(seleccionado)
63
+ funcion = funciones[indice]
64
+ st.title(f"{seleccionado} Descargador de Videos")
65
+ st.write(f"Descarga y corta una parte aleatoria de {seleccionado}.")
66
 
67
+ video_link = st.text_input("Enlace del Video", value='https://www.youtube.com/watch?v=urhsbKIF9pE')
68
+ aspect_ratio_options = ['16:9', '9:16', '21:9']
69
+ aspect_ratio_choice = st.selectbox('Seleccionar Proporción:', aspect_ratio_options, index=2)
70
+ resolution_options = [144, 240, 360, 720]
71
+ resolution_choice = st.selectbox('Seleccionar Resolución:', resolution_options, index=2)
72
 
73
+ choice = st.radio('Seleccionar Proceso:', ['Cortar Video', 'Descargar Completo'], 1)
74
+
75
+ if choice == 'Cortar Video':
76
+ num_cuts = st.slider('Seleccionar número de cortes', 1, 10, 1)
77
+ duration_minutes_slider = st.slider('Seleccionar duración de los cortes (minutos)', 1, 180, 1)
78
+ duration_seconds = duration_minutes_slider * 60
79
+ speed_factor = st.slider('Seleccionar velocidad del video', -2.0, 3.0, 1.0)
80
+ mute_audio = st.checkbox('Eliminar sonido de los videos cortados')
81
+
82
+ if st.button(f"Descargar y Cortar {seleccionado}"):
83
+ video_file, titulo_video, video_info, thumbnail_file = funcion(video_link, resolusi_input=resolution_choice)
84
+ cut_files, cuts = random_cuts(video_file, titulo_video, num_cuts=num_cuts, duration=duration_seconds, speed_factor=speed_factor, mute_audio=mute_audio, use_aspect_ratio=aspect_ratio_choice)
85
+
86
+ for i, cut_file in enumerate(cut_files):
87
+ file_size = os.path.getsize(cut_file)
88
+ info_list = [f"{titulo_video}_cut_{i+1}", cut_file, thumbnail_file, cuts[i][0], cuts[i][1]]
89
+ session(info_list)
90
+
91
+ download_all_button(cut_files)
92
+
93
  else:
94
  if st.button(f"Descargar {seleccionado}"):
95
  video_file, titulo_video, video_info, thumbnail_file = funcion(video_link, resolusi_input=resolution_choice)
96
  file_size = os.path.getsize(video_file)
97
  info_list = [titulo_video, video_file, thumbnail_file]
98
  download_all_button([video_file])
99
+ session(info_list)