flask-server-01 / app.py
eoia's picture
Update app.py
37ff29b verified
raw
history blame contribute delete
No virus
3.67 kB
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/<path:filename>', 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)