Spaces:
Build error
Build error
| from flask import Flask, request, jsonify, send_file, render_template | |
| from yt_dlp import YoutubeDL | |
| import os | |
| app = Flask(__name__) | |
| def home(): | |
| return render_template('index.html') | |
| 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 | |
| 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', | |
| 'postprocessors': [{ | |
| 'key': 'FFmpegExtractAudio', | |
| 'preferredcodec': 'mp3', | |
| 'preferredquality': '192', | |
| }], | |
| } | |
| 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', | |
| } | |
| 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) |