ttv-ec / video_utils.py
eusholli's picture
add Boost Mobile
f32772f
from moviepy.editor import VideoFileClip
import os
import requests
from ai_config_faiss import timestamp_to_seconds
from pytube import YouTube
import yt_dlp
CLIP_DIR = "clip/"
if not os.path.exists(CLIP_DIR):
os.makedirs(CLIP_DIR)
def get_youtube_video(cache_dir, yt_id):
yt_url = f"https://www.youtube.com/watch?v={yt_id}"
download_file = cache_dir + yt_id + ".mp4"
if os.path.exists(download_file):
print(f"{yt_url} already cached.")
return download_file
# try yt_dlp
if try_yt_dlp_download(yt_url, download_file):
return download_file
# try pytube
if try_pytube_download(yt_url, download_file):
return download_file
# Try Cobalt API
if try_cobalt_api(yt_url, download_file):
return download_file
return None
def try_cobalt_api(yt_url, download_file):
cobalt_api_url = "https://api.cobalt.tools/api/json"
headers = {
"Accept": "application/json",
"Content-Type": "application/json"
}
payload = {
"url": yt_url,
"vCodec": "h264",
"vQuality": "720",
"aFormat": "mp3",
"isAudioOnly": False
}
try:
response = requests.post(cobalt_api_url, headers=headers, json=payload)
response.raise_for_status()
data = response.json()
if data['status'] == 'success' and 'url' in data:
video_url = data['url']
video_response = requests.get(video_url)
video_response.raise_for_status()
with open(download_file, 'wb') as file:
file.write(video_response.content)
print(f"Video downloaded successfully using Cobalt API: "
f"{download_file}")
return True
else:
print(f"Cobalt API Error: {data.get('text', 'Unknown error')}")
return False
except requests.exceptions.RequestException as e:
print(f"Cobalt API Error: Unable to process the YouTube URL. {str(e)}")
return False
def try_pytube_download(yt_url, download_file):
try:
yt = YouTube(yt_url)
video = yt.streams.filter(progressive=True, file_extension='mp4').order_by(
'resolution').desc().first()
video.download(filename=download_file)
print(f"Video downloaded successfully using pytube: {download_file}")
return True
except Exception as e:
print(f"Pytube Error: Unable to download the YouTube video. {str(e)}")
return False
def try_yt_dlp_download(yt_url, download_file):
ydl_opts = {
'format': 'bestvideo[ext=h264]+bestaudio[ext=mp3]/best[ext=h264]/best',
'outtmpl': download_file,
}
try:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
ydl.download([yt_url])
print(f"Video downloaded successfully using yt-dlp: {download_file}")
return True
except Exception as e:
print(f"yt-dlp Error: Unable to download the YouTube video. {str(e)}")
return False
def main():
video = get_youtube_video("tCDvOQI3pco")
if video:
print(f"Downloaded video: {video}")
else:
print("Failed to download video.")
def generate_clips(cache_dir, info):
yt_id = info['metadata']['youtube_id']
download_file = get_youtube_video(cache_dir, yt_id)
transcript = info['transcript']
if download_file:
video = VideoFileClip(download_file)
for entry in transcript:
start_time = timestamp_to_seconds(
entry['metadata']['start_timestamp'])
end_time = timestamp_to_seconds(entry['metadata']['end_timestamp'])
# Adjust start and end times
# Start 1 second earlier, but not before 0
start_time = max(0, start_time - 1)
end_time = min(video.duration, end_time +
1) if end_time != 0 else video.duration
# Generate output filename
output_filename = (
f"{CLIP_DIR}{yt_id}-"
f"{start_time}-{end_time}.mp4"
)
entry['metadata']['download'] = output_filename
if os.path.exists(output_filename):
continue
# Create clip
clip = video.subclip(start_time, end_time)
# Write the clip to a file
clip.write_videofile(
output_filename, codec="libx264", audio_codec="aac")
print(f"Generated clip: {output_filename}")
# Close the video to free up resources
video.close()
else:
print(f"Failed to download video for YouTube ID: {yt_id}")
return transcript
if __name__ == "__main__":
main()