import gradio as gr import requests import json from PIL import Image import io # API 기본 URL BASE_URL = "https://api.artic.edu/api/v1" def search_artworks(query, is_public_domain=False): search_url = f"{BASE_URL}/artworks/search" params = { "q": query, "limit": 12, # 더 많은 결과 표시 "fields": "id,title,artist_display,date_display,image_id,is_public_domain", } if is_public_domain: params["query"] = {"term": {"is_public_domain": True}} try: response = requests.get(search_url, params=params) response.raise_for_status() results = response.json() if "data" not in results: return [], "No search results found." images = [] captions = [] for artwork in results["data"]: if artwork.get("image_id"): # 더 큰 이미지 사이즈로 변경 (843 -> 1686) image_url = f"https://www.artic.edu/iiif/2/{artwork['image_id']}/full/1686,/0/default.jpg" artwork_info = f"""Title: {artwork.get('title', 'Unknown')}\nArtist: {artwork.get('artist_display', 'Unknown')}\nDate: {artwork.get('date_display', 'Unknown')}""" try: img_response = requests.get(image_url, timeout=10) # 타임아웃 증가 img_response.raise_for_status() img = Image.open(io.BytesIO(img_response.content)) img.verify() img = Image.open(io.BytesIO(img_response.content)) if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info): img = img.convert('RGB') images.append(img) captions.append(artwork_info) except Exception as e: print(f"Error processing image: {e}") continue if not images: return [], "Unable to load images for the searched artworks." return images, "\n\n".join(captions) except Exception as e: print(f"API request error: {e}") return [], f"An error occurred during search: {str(e)}" # Custom CSS for styling custom_css = """ .gradio-container { background: linear-gradient(to right, #1a1a1a, #2d2d2d) !important; color: #ffffff !important; } .gr-button { background: linear-gradient(to right, #c94b4b, #4b134f) !important; border: none !important; color: white !important; font-weight: bold !important; padding: 10px 20px !important; font-size: 1.1em !important; } .gr-button:hover { background: linear-gradient(to right, #4b134f, #c94b4b) !important; transform: scale(1.05); transition: all 0.3s ease; } .gr-input { border: 2px solid #4b134f !important; background: rgba(255, 255, 255, 0.1) !important; color: white !important; font-size: 1.1em !important; } .gr-form { background: rgba(0, 0, 0, 0.2) !important; border-radius: 15px !important; padding: 20px !important; } .gr-box { border-radius: 15px !important; border: 2px solid #4b134f !important; } .gr-gallery { background: rgba(0, 0, 0, 0.3) !important; border-radius: 15px !important; padding: 20px !important; min-height: 800px !important; /* 갤러리 높이 증가 */ } .title-text { text-align: center !important; color: #ffffff !important; font-size: 2.5em !important; margin-bottom: 0.5em !important; text-shadow: 2px 2px 4px rgba(0,0,0,0.5) !important; } .subtitle-text { text-align: center !important; color: #cccccc !important; font-size: 1.2em !important; margin-bottom: 2em !important; font-style: italic !important; } .gallery-image { min-height: 400px !important; /* 개별 이미지 최소 높이 설정 */ object-fit: contain !important; } """ # Gradio interface with gr.Blocks(css=custom_css) as demo: gr.HTML( """