Spaces:
Runtime error
Runtime error
from flask import Flask, request, jsonify, send_file | |
import threading | |
import time | |
import os | |
from pytube import YouTube, Playlist | |
from moviepy.editor import VideoFileClip | |
from pydub import AudioSegment | |
app = Flask(__name__) | |
def delete_file_after_delay(file_path, delay=600): | |
def delete_file(): | |
time.sleep(delay) | |
if os.path.exists(file_path): | |
os.remove(file_path) | |
threading.Thread(target=delete_file).start() | |
def download_youtube_video(url): | |
yt = YouTube(url) | |
stream = yt.streams.filter(progressive=True, file_extension='mp4').first() | |
file_path = stream.download(filename=f"{yt.title}.mp4") | |
delete_file_after_delay(file_path) | |
return file_path | |
def download_youtube_audio(url): | |
yt = YouTube(url) | |
stream = yt.streams.filter(only_audio=True).first() | |
file_path = stream.download(filename=f"{yt.title}.mp4") | |
delete_file_after_delay(file_path) | |
return file_path | |
def download_youtube_playlist(url, download_audio=False): | |
playlist = Playlist(url) | |
files = [] | |
for video in playlist.videos: | |
if download_audio: | |
file_path = video.streams.filter(only_audio=True).first().download(filename=f"{video.title}.mp4") | |
else: | |
file_path = video.streams.filter(progressive=True, file_extension='mp4').first().download(filename=f"{video.title}.mp4") | |
delete_file_after_delay(file_path) | |
files.append(file_path) | |
return files | |
def video_convert(video_file, target_format): | |
original_filename = os.path.splitext(os.path.basename(video_file))[0] | |
output_video_file = f"{original_filename}.{target_format}" | |
clip = VideoFileClip(video_file) | |
clip.write_videofile(output_video_file, codec="libx264") | |
delete_file_after_delay(output_video_file) | |
return output_video_file | |
def audio_convert(input_audio_file, target_format): | |
original_filename = os.path.splitext(os.path.basename(input_audio_file))[0] | |
output_audio_file = f"{original_filename}.{target_format}" | |
audio = AudioSegment.from_file(input_audio_file) | |
audio.export(output_audio_file, format=target_format) | |
delete_file_after_delay(output_audio_file) | |
return output_audio_file | |
def handle_video_conversion(): | |
data = request.json | |
url = data.get('url') | |
format = data.get('format') | |
if url: | |
if "playlist" in url: | |
files = download_youtube_playlist(url, download_audio=False) | |
converted_files = [video_convert(file, format) for file in files] | |
else: | |
video_file = download_youtube_video(url) | |
converted_file = video_convert(video_file, format) | |
converted_files = [converted_file] | |
return jsonify({"files": converted_files}) | |
return jsonify({"error": "No URL provided"}), 400 | |
def handle_audio_conversion(): | |
data = request.json | |
url = data.get('url') | |
format = data.get('format') | |
if url: | |
if "playlist" in url: | |
files = download_youtube_playlist(url, download_audio=True) | |
converted_files = [audio_convert(file, format) for file in files] | |
else: | |
audio_file = download_youtube_audio(url) | |
converted_file = audio_convert(audio_file, format) | |
converted_files = [converted_file] | |
return jsonify({"files": converted_files}) | |
return jsonify({"error": "No URL provided"}), 400 | |
def download_file(filename): | |
return send_file(filename, as_attachment=True) | |
if __name__ == '__main__': | |
app.run(host='0.0.0.0', port=8080, debug=True) | |