name2link2image / app.py
mobenta's picture
Create app.py
ddbe87b verified
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()