|
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_audio(): |
|
data = request.json |
|
url = data.get('url') |
|
|
|
if not url: |
|
return jsonify({'error': 'URL is required'}), 400 |
|
|
|
try: |
|
ydl_opts = { |
|
'format': '251/bestaudio', |
|
'outtmpl': '%(title)s.%(ext)s', |
|
'cookiefile': 'www.youtube.com_cookies.txt', |
|
'postprocessors': [{ |
|
'key': 'FFmpegExtractAudio', |
|
'preferredcodec': 'mp3', |
|
'preferredquality': '192', |
|
}], |
|
} |
|
|
|
with YoutubeDL(ydl_opts) as ydl: |
|
info = ydl.extract_info(url, download=True) |
|
file_name = ydl.prepare_filename(info).rsplit(".", 1)[0] + ".mp3" |
|
|
|
|
|
return send_file( |
|
file_name, |
|
as_attachment=True, |
|
download_name=os.path.basename(file_name) |
|
) |
|
|
|
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) |