from flask import Flask, request, jsonify, send_file, render_template from yt_dlp import YoutubeDL import os app = Flask(__name__) @app.route('/') def home(): return render_template('index.html') @app.route('/get-info', methods=['POST']) def get_info(): data = request.json url = data.get('url') if not url: return jsonify({'error': 'URL is required'}), 400 try: ydl_opts = { 'cookiefile': 'www.youtube.com_cookies.txt' } with YoutubeDL(ydl_opts) as ydl: info = ydl.extract_info(url, download=False) return jsonify({ 'title': info['title'], 'thumbnail': info.get('thumbnail'), 'duration': info.get('duration'), 'channel': info.get('channel') }) except Exception as e: return jsonify({'error': str(e)}), 500 @app.route('/download', methods=['POST']) def download(): data = request.json url = data.get('url') format_type = data.get('format', 'mp3') quality = data.get('quality', 'best') if not url: return jsonify({'error': 'URL is required'}), 400 try: if format_type == 'mp3': ydl_opts = { 'format': 'bestaudio/best', 'outtmpl': '%(title)s.%(ext)s', 'cookiefile': 'www.youtube.com_cookies.txt', 'headers': { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' }, 'postprocessors': [{ 'key': 'FFmpegExtractAudio', 'preferredcodec': 'mp3', 'preferredquality': '192', 'nopostoverwrites': True, }], } else: quality_map = { '144': 'bv*[height=144][ext=mp4]+ba[ext=m4a]/b[height=144][ext=mp4]', '240': 'bv*[height=240][ext=mp4]+ba[ext=m4a]/b[height=240][ext=mp4]', '360': 'bv*[height=360][ext=mp4]+ba[ext=m4a]/b[height=360][ext=mp4]', '480': 'bv*[height=480][ext=mp4]+ba[ext=m4a]/b[height=480][ext=mp4]', '720': 'bv*[height=720][ext=mp4]+ba[ext=m4a]/b[height=720][ext=mp4]', '1080': 'bv*[height=1080][ext=mp4]+ba[ext=m4a]/b[height=1080][ext=mp4]', 'best': 'bv*[ext=mp4]+ba[ext=m4a]/b[ext=mp4]' } selected_quality = quality_map.get(quality, quality_map['best']) ydl_opts = { 'format': selected_quality, 'outtmpl': '%(title)s.%(ext)s', 'merge_output_format': 'mp4', 'cookiefile': 'www.youtube.com_cookies.txt', 'headers': { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' }, 'nopostoverwrites': True, } with YoutubeDL(ydl_opts) as ydl: info = ydl.extract_info(url, download=True) if format_type == 'mp3': file_name = ydl.prepare_filename(info).rsplit(".", 1)[0] + ".mp3" else: file_name = ydl.prepare_filename(info) return send_file( file_name, as_attachment=True, download_name=os.path.basename(file_name), mimetype='video/mp4' if format_type == 'mp4' else 'audio/mp3' ) except Exception as e: return jsonify({'error': str(e)}), 500 finally: if 'file_name' in locals() and os.path.exists(file_name): os.remove(file_name) if __name__ == '__main__': app.run(host='0.0.0.0', port=7860, debug=True,threaded=True)