Spaces:
Running
Running
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( | |
""" | |
<div class="title-text">π¨ Art Institute of Chicago Explorer</div> | |
<div class="subtitle-text">Discover masterpieces from one of the world's premier art collections through an elegant and intuitive interface.</div> | |
""" | |
) | |
gr.HTML("""<a href="https://visitorbadge.io/status?path=https%3A%2F%2Fimmunobiotech-ChicagoGallery.hf.space"> | |
<img src="https://api.visitorbadge.io/api/visitors?path=https%3A%2F%2Fimmunobiotech-ChicagoGallery.hf.space&countColor=%23263759" /> | |
</a>""") | |
with gr.Row(): | |
with gr.Column(scale=4): | |
search_input = gr.Textbox( | |
label="Enter your search term", | |
placeholder="e.g., Monet, Impressionism, landscape...", | |
) | |
with gr.Column(scale=1): | |
public_domain = gr.Checkbox( | |
label="Show only public domain artworks", | |
value=False | |
) | |
with gr.Column(scale=1): | |
search_btn = gr.Button( | |
"π Search", | |
variant="primary" | |
) | |
with gr.Row(): | |
gallery = gr.Gallery( | |
label="Search Results", | |
show_label=True, | |
elem_id="gallery", | |
columns=3, # μ΄ μ μ¦κ° | |
rows=4, # ν μ μ¦κ° | |
height="800px", # κ°€λ¬λ¦¬ λμ΄ μ¦κ° | |
object_fit="contain" | |
) | |
info = gr.Textbox( | |
label="Artwork Details", | |
lines=10, | |
show_label=True | |
) | |
search_btn.click( | |
fn=search_artworks, | |
inputs=[search_input, public_domain], | |
outputs=[gallery, info] | |
) | |
demo.launch() |