Spaces:
Sleeping
Sleeping
File size: 5,492 Bytes
315381c 118d5b5 315381c 49b505f ec90571 49b505f ec90571 49b505f ec90571 49b505f ec90571 49b505f 9182551 49b505f 9182551 a96ed94 7e948ae ba5897d 7e948ae 165e808 9182551 7e948ae 9182551 7e948ae a96ed94 49b505f 4d8755f 49b505f 01f7834 49b505f 99ba69c 49b505f 99ba69c 49b505f 01f7834 49b505f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | import os
import zipfile
import random
import base64
from others import *
import streamlit as st
from io import BytesIO
from moviepy.editor import vfx
from streamlit_option_menu import option_menu
from youtube import youtube, download_youtube
from moviepy.video.io.VideoFileClip import VideoFileClip
def session(info_list):
st.video(info_list[1])
st.text(f"Video Information: {info_list[0]}")
if len(info_list) == 5:
st.text(f"Duration: {info_list[3]} - {info_list[4]} seconds")
def random_cuts(video_file, title, num_cuts=1, duration=60, speed_factor=1.0, mute_audio=False, use_aspect_ratio=None):
clip = VideoFileClip(video_file)
total_duration = clip.duration
cuts = []
for _ in range(num_cuts):
start_time = random.uniform(0, max(total_duration - duration, 0))
end_time = min(start_time + duration, total_duration)
cuts.append((start_time, end_time))
output_files = []
prev_end_time = 0
for i, (start_time, end_time) in enumerate(cuts):
if start_time == prev_end_time:
continue
output_file = f"{title}_cut_{i+1}.mp4"
clipped_clip = clip.subclip(start_time, end_time)
if mute_audio:
clipped_clip = clipped_clip.set_audio(None)
clipped_clip = clipped_clip.fx(vfx.speedx, speed_factor)
if use_aspect_ratio:
original_width, original_height = clip.size
if use_aspect_ratio == '16:9':
target_ratio = 16 / 9
elif use_aspect_ratio == '9:16':
target_ratio = 9 / 16
elif use_aspect_ratio == '21:9':
target_ratio = 21 / 9
else:
target_ratio = 16 / 9
if use_aspect_ratio:
original_width, original_height = clip.size
if use_aspect_ratio == '21:9':
target_ratio = 21 / 9
else:
target_ratio = 16 / 9 if use_aspect_ratio == '16:9' else 9 / 16
target_width = int(original_height * target_ratio)
target_height = original_height
if use_aspect_ratio == '21:9':
target_height = int(original_width / target_ratio)
margin = (original_height - target_height) // 2
clipped_clip = clipped_clip.crop(y1=margin, y2=original_height - margin)
else:
margin = (original_width - target_width) // 2
clipped_clip = clipped_clip.crop(x1=margin, x2=original_width - margin)
with st.spinner(f'Procesando video {i+1} de {num_cuts}...'):
clipped_clip.write_videofile(output_file, codec="libx264", audio_codec="aac", verbose=False)
output_files.append(output_file)
prev_end_time = end_time
return output_files, cuts
def download_all_button(cut_files):
zip_buffer = BytesIO()
with zipfile.ZipFile(zip_buffer, 'w') as zip_file:
for cut_file in cut_files:
zip_file.write(cut_file, os.path.basename(cut_file))
zip_filename = 'cortes_videos.zip'
zip_data = zip_buffer.getvalue()
b64 = base64.b64encode(zip_data).decode()
href = f'<a href="data:application/zip;base64,{b64}" download="{zip_filename}">Descargar Todos</a>'
st.markdown(href, unsafe_allow_html=True)
opciones = ['YouTube']
with st.sidebar:
seleccionado = option_menu("Descargador", opciones, icons=['play'], menu_icon="cast", default_index=0)
funciones = [youtube]
if seleccionado:
indice = opciones.index(seleccionado)
funcion = funciones[indice]
st.title(f"{seleccionado} Descargador de Videos")
st.write(f"Descarga y corta una parte aleatoria de {seleccionado}.")
video_link = st.text_input("Enlace del Video", value='https://www.youtube.com/watch?v=urhsbKIF9pE')
aspect_ratio_options = ['16:9', '9:16', '21:9']
aspect_ratio_choice = st.selectbox('Seleccionar Proporción:', aspect_ratio_options, index=2)
resolution_options = [144, 240, 360, 720]
resolution_choice = st.selectbox('Seleccionar Resolución:', resolution_options, index=2)
choice = st.radio('Seleccionar Proceso:', ['Cortar Video', 'Descargar Completo'], 1)
if choice == 'Cortar Video':
num_cuts = st.slider('Seleccionar número de cortes', 1, 10, 1)
duration_minutes_slider = st.slider('Seleccionar duración de los cortes (minutos)', 1, 180, 1)
duration_seconds = duration_minutes_slider * 60
speed_factor = st.slider('Seleccionar velocidad del video', -2.0, 3.0, 1.0)
mute_audio = st.checkbox('Eliminar sonido de los videos cortados')
if st.button(f"Descargar y Cortar {seleccionado}"):
video_file, titulo_video, video_info, thumbnail_file = funcion(video_link, resolusi_input=resolution_choice)
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)
for i, cut_file in enumerate(cut_files):
file_size = os.path.getsize(cut_file)
info_list = [f"{titulo_video}_cut_{i+1}", cut_file, thumbnail_file, cuts[i][0], cuts[i][1]]
session(info_list)
download_all_button(cut_files)
|