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 @app.route('/convert_video', methods=['POST']) 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 @app.route('/convert_audio', methods=['POST']) 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 @app.route('/download/', methods=['GET']) 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)