|
from flask import Flask, request, jsonify |
|
from yt_dlp import YoutubeDL |
|
import os |
|
import uuid |
|
from threading import Thread |
|
import hashlib |
|
|
|
app = Flask(__name__) |
|
|
|
|
|
DOWNLOAD_DIR = 'downloads' |
|
if not os.path.exists(DOWNLOAD_DIR): |
|
os.makedirs(DOWNLOAD_DIR) |
|
|
|
from flask import send_from_directory |
|
|
|
@app.route('/downloads/<path:path>') |
|
def serve_downloads(path): |
|
return send_from_directory(DOWNLOAD_DIR, path) |
|
|
|
|
|
@app.route('/') |
|
def root(): |
|
return jsonify({'message': 'This is an API service. Please use the appropriate endpoints.'}), 404 |
|
|
|
@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: |
|
|
|
unique_id = str(uuid.uuid4()) |
|
file_name = os.path.join(DOWNLOAD_DIR, f'{unique_id}.mp3') |
|
|
|
|
|
ydl_opts = { |
|
'format': '140/bestaudio', |
|
'outtmpl': file_name.rsplit('.', 1)[0] + '.%(ext)s', |
|
'cookiefile': 'www.youtube.com_cookies.txt', |
|
'postprocessors': [{ |
|
'key': 'FFmpegExtractAudio', |
|
'preferredcodec': 'mp3', |
|
'preferredquality': '128', |
|
}], |
|
'noplaylist': True, |
|
} |
|
|
|
with YoutubeDL(ydl_opts) as ydl: |
|
|
|
ydl.extract_info(url, download=True) |
|
|
|
|
|
download_url = f'{request.host_url}{DOWNLOAD_DIR}/{os.path.basename(file_name)}' |
|
return jsonify({'download_url': download_url}) |
|
|
|
except Exception as e: |
|
return jsonify({'error': str(e)}), 500 |
|
|
|
|
|
|
|
|
|
@app.route('/audio', methods=['POST']) |
|
def download_high_audio(): |
|
data = request.json |
|
url = data.get('url') |
|
if not url: |
|
return jsonify({'error': 'URL is required'}), 400 |
|
try: |
|
|
|
unique_id = str(uuid.uuid4()) |
|
file_name = os.path.join(DOWNLOAD_DIR, f'{unique_id}.mp3') |
|
|
|
ydl_opts = { |
|
'format': 'bestaudio/best', |
|
'outtmpl': file_name.rsplit('.', 1)[0] + '.%(ext)s', |
|
'cookiefile': 'www.youtube.com_cookies.txt', |
|
'postprocessors': [{ |
|
'key': 'FFmpegExtractAudio', |
|
'preferredcodec': 'mp3', |
|
'preferredquality': '320', |
|
}], |
|
'noplaylist': True, |
|
} |
|
with YoutubeDL(ydl_opts) as ydl: |
|
|
|
ydl.extract_info(url, download=True) |
|
|
|
download_url = f'{request.host_url}{DOWNLOAD_DIR}/{os.path.basename(file_name)}' |
|
return jsonify({'download_url': download_url}) |
|
except Exception as e: |
|
return jsonify({'error': str(e)}), 500 |
|
|
|
|
|
if __name__ == '__main__': |
|
app.run(host='0.0.0.0', port=7860, debug=True) |