Spaces:
Build error
Build error
File size: 3,909 Bytes
b0fa22e 940c88d 1954490 b0fa22e 29b0711 1954490 32ac84b b0fa22e 1954490 b0fa22e 1954490 29b0711 3fee868 b0fa22e 3fee868 1954490 b605d72 3fee868 b605d72 3fee868 b605d72 5964f9b b605d72 5964f9b b605d72 5964f9b 3fee868 5964f9b 0fb735a 3fee868 5964f9b 3fee868 b605d72 3fee868 5833d54 3fee868 5833d54 29b0711 b605d72 3fee868 0fb735a b605d72 29b0711 b605d72 5964f9b 1954490 b605d72 5964f9b b605d72 b0fa22e 1954490 0fb735a |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
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) |