File size: 5,551 Bytes
a3208e0 4ad7628 a3208e0 4ad7628 a3208e0 4ad7628 |
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 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 |
from flask import Flask, send_file, request, make_response, Response
import yt_dlp
import os
from urllib.parse import urlparse
from gallery_dl import job
import requests
from datetime import datetime
import tempfile
import shutil
import mimetypes
app = Flask(__name__)
class MediaDownloader:
def __init__(self):
self.temp_dir = tempfile.mkdtemp()
self.create_directories()
def create_directories(self):
self.image_path = os.path.join(self.temp_dir, "images")
self.video_path = os.path.join(self.temp_dir, "videos")
os.makedirs(self.image_path, exist_ok=True)
os.makedirs(self.video_path, exist_ok=True)
def cleanup(self):
shutil.rmtree(self.temp_dir)
def download_video(self, url):
output_template = os.path.join(self.video_path, '%(title)s.%(ext)s')
ydl_opts = {
'format': 'best',
'outtmpl': output_template,
'ignoreerrors': True,
'no_warnings': True,
'quiet': True,
'extract_flat': False,
'http_headers': {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
}
}
try:
with yt_dlp.YoutubeDL(ydl_opts) as ydl:
info = ydl.extract_info(url, download=True)
if info:
filename = ydl.prepare_filename(info)
return filename if os.path.exists(filename) else None
return None
except:
return None
def download_images(self, url):
try:
class UrlDl(job.Job):
def __init__(self, url, parent=None):
job.Job.__init__(self, url, parent)
self.urls = []
def handle_url(self, url, _):
self.urls.append(url)
j = UrlDl(url)
j.run()
if not j.urls:
return None
downloaded_files = []
for img_url in j.urls:
try:
response = requests.get(img_url, headers={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
})
response.raise_for_status()
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S_%f")
ext = os.path.splitext(urlparse(img_url).path)[1]
if not ext:
ext = '.jpg'
filename = f"image_{timestamp}{ext}"
filepath = os.path.join(self.image_path, filename)
with open(filepath, 'wb') as f:
f.write(response.content)
downloaded_files.append(filepath)
except Exception as e:
print(f"Error downloading image {img_url}: {str(e)}")
continue
return downloaded_files if downloaded_files else None
except Exception as e:
print(f"Error in download_images: {str(e)}")
return None
def download_media(self, url):
video_path = self.download_video(url)
if video_path:
return [video_path]
image_paths = self.download_images(url)
if image_paths:
return image_paths
return None
@app.route('/')
def home():
return """
<h1>Social Media Downloader API</h1>
<p>Use: /download?url=YOUR_URL_HERE</p>
"""
@app.route('/download')
def download():
try:
url = request.args.get('url')
if not url:
return "No URL provided", 400
downloader = MediaDownloader()
try:
files = downloader.download_media(url)
if files and len(files) > 0:
if len(files) == 1:
response = make_response(send_file(files[0], as_attachment=True))
@response.call_on_close
def cleanup():
downloader.cleanup()
return response
else:
def generate():
for file_path in files:
with open(file_path, 'rb') as f:
content = f.read()
filename = os.path.basename(file_path)
yield f'Content-Disposition: attachment; filename="{filename}"\n'.encode()
yield f'Content-Type: {mimetypes.guess_type(file_path)[0]}\n'.encode()
yield f'Content-Length: {len(content)}\n\n'.encode()
yield content
yield b'\n--boundary--\n'
downloader.cleanup()
response = Response(
generate(),
mimetype='multipart/x-mixed-replace; boundary=boundary',
direct_passthrough=True
)
response.headers['Content-Type'] = 'multipart/x-mixed-replace; boundary=boundary'
return response
else:
downloader.cleanup()
return "Failed to download media", 400
except Exception as e:
downloader.cleanup()
return f"Error: {str(e)}", 500
except Exception as e:
return f"Error: {str(e)}", 500
if __name__ == '__main__':
app.run(host='0.0.0.0', port=7860) |