Spaces:
Sleeping
Sleeping
import gradio as gr | |
import requests | |
import os | |
import zipfile | |
import shutil | |
from PIL import Image | |
import io | |
def download_images(image_links, image_names, directory): | |
# Links und Namen aufteilen und leere Zeilen entfernen | |
links = [link.strip() for link in image_links.strip().split('\n') if link.strip()] | |
names = [name.strip() for name in image_names.strip().split('\n') if name.strip()] | |
# Ergebnistext und Bildvorschauen | |
result_text = "" | |
previews = [] | |
# Verzeichnis erstellen, falls nicht vorhanden | |
if directory.strip(): | |
directory = directory.strip() | |
os.makedirs(directory, exist_ok=True) | |
else: | |
directory = "images" | |
os.makedirs(directory, exist_ok=True) | |
# Prüfen, ob Links und Namen verfügbar sind | |
if not links: | |
return "Keine Links angegeben.", [], None | |
# Falls weniger Namen als Links, fülle mit generischen Namen auf | |
while len(names) < len(links): | |
names.append(f"image_{len(names) + 1}.jpg") | |
# Bilder herunterladen | |
successful = 0 | |
failed = 0 | |
downloaded_files = [] | |
for i, (link, name) in enumerate(zip(links, names)): | |
try: | |
# Prüfen, ob der Name eine Dateiendung hat | |
if not any(name.lower().endswith(ext) for ext in ['.jpg', '.jpeg', '.png', '.gif', '.webp']): | |
name = name + '.jpg' # Standard-Endung hinzufügen | |
filepath = os.path.join(directory, name) | |
# Bild herunterladen | |
response = requests.get(link, timeout=15) | |
if response.status_code == 200: | |
with open(filepath, 'wb') as f: | |
f.write(response.content) | |
successful += 1 | |
downloaded_files.append(filepath) | |
# Bildvorschau für die Anzeige erstellen (alle Bilder) | |
try: | |
img = Image.open(io.BytesIO(response.content)) | |
previews.append(img) | |
except Exception as e: | |
# Wenn Vorschau fehlschlägt, überspringen | |
pass | |
else: | |
failed += 1 | |
result_text += f"Fehler bei {link} -> {name}: HTTP Status {response.status_code}\n" | |
except Exception as e: | |
failed += 1 | |
result_text += f"Fehler bei {link} -> {name}: {str(e)}\n" | |
# ZIP-Datei erstellen, wenn mindestens ein Bild erfolgreich heruntergeladen wurde | |
zip_path = None | |
if successful > 0: | |
try: | |
zip_filename = f"{directory}.zip" | |
with zipfile.ZipFile(zip_filename, 'w') as zipf: | |
for file in downloaded_files: | |
zipf.write(file) | |
result_text += f"\nAlle Bilder wurden in {zip_filename} gepackt.\n" | |
zip_path = zip_filename | |
except Exception as e: | |
result_text += f"\nFehler beim Erstellen der ZIP-Datei: {str(e)}\n" | |
# Zusammenfassung | |
summary = f"Download abgeschlossen! {successful} Bilder erfolgreich, {failed} fehlgeschlagen.\n" | |
result_text = summary + result_text | |
return result_text, previews, zip_path | |
# Gradio-Interface erstellen | |
with gr.Blocks(title="Bild-Download-App") as app: | |
gr.Markdown("# Bild-Downloader") | |
gr.Markdown("Geben Sie Bildlinks und gewünschte Dateinamen ein (jeweils ein Link/Name pro Zeile)") | |
with gr.Row(): | |
with gr.Column(scale=1): | |
image_links = gr.Textbox( | |
placeholder="https://example.com/image1.jpg\nhttps://example.com/image2.jpg", | |
label="Bildlinks (ein Link pro Zeile)", | |
lines=10 | |
) | |
image_names = gr.Textbox( | |
placeholder="strand.jpg\nberg.jpg", | |
label="Dateinamen (ein Name pro Zeile)", | |
lines=10 | |
) | |
directory = gr.Textbox( | |
placeholder="images", | |
label="Verzeichnis (leer lassen für 'images')", | |
value="images" | |
) | |
download_button = gr.Button("Bilder herunterladen") | |
with gr.Column(scale=1): | |
result_output = gr.Textbox(label="Ergebnis", lines=10) | |
zip_download = gr.File(label="ZIP-Datei zum Download") | |
gr.Markdown("### Bildvorschau") | |
image_gallery = gr.Gallery(label="Heruntergeladene Bilder") | |
# Beispiele hinzufügen | |
gr.Examples( | |
[ | |
[ | |
"https://images.unsplash.com/photo-1599982890963-3aabd60064d2\nhttps://images.unsplash.com/photo-1530122037265-a5f1f91d3b99", | |
"munich-skyline.jpg\nswiss-alps.jpg", | |
"destinations" | |
], | |
[ | |
"https://images.unsplash.com/photo-1436491865332-7a61a109cc05\nhttps://images.unsplash.com/photo-1519494026892-80bbd2d6fd0d", | |
"airport-transfer.jpg\nmedical-tourism.jpg", | |
"services" | |
] | |
], | |
[image_links, image_names, directory], | |
"Beispiele" | |
) | |
download_button.click( | |
fn=download_images, | |
inputs=[image_links, image_names, directory], | |
outputs=[result_output, image_gallery, zip_download] | |
) | |
# App starten | |
if __name__ == "__main__": | |
app.launch() | |