File size: 4,468 Bytes
6f37261
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1c276c4
 
8540b91
1c276c4
 
 
8540b91
1c276c4
 
 
6f37261
1c276c4
 
 
6f37261
8540b91
1c276c4
 
8540b91
 
1c276c4
 
8540b91
 
1c276c4
 
 
 
 
 
 
8540b91
1c276c4
 
 
8540b91
1c276c4
 
 
 
8540b91
 
6f37261
8540b91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6f37261
8540b91
 
 
 
 
 
 
 
6f37261
8540b91
 
 
 
 
 
 
 
 
 
 
 
 
1c276c4
6f37261
8540b91
 
 
 
 
 
 
 
 
6f37261
8540b91
 
 
 
 
 
 
 
 
 
 
 
6f37261
8540b91
 
 
 
 
 
 
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
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": 10,
        "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"):
                image_url = f"https://www.artic.edu/iiif/2/{artwork['image_id']}/full/843,/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=5)
                    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);
    color: #ffffff;
}
.gr-button {
    background: linear-gradient(to right, #c94b4b, #4b134f);
    border: none;
    color: white;
    font-weight: bold;
}
.gr-button:hover {
    background: linear-gradient(to right, #4b134f, #c94b4b);
    transform: scale(1.05);
    transition: all 0.3s ease;
}
.gr-input {
    border: 2px solid #4b134f;
    background: rgba(255, 255, 255, 0.1);
    color: white;
}
.gr-form {
    background: rgba(0, 0, 0, 0.2);
    border-radius: 15px;
    padding: 20px;
}
.gr-box {
    border-radius: 15px;
    border: 2px solid #4b134f;
}
.gr-gallery {
    background: rgba(0, 0, 0, 0.3);
    border-radius: 15px;
    padding: 10px;
}
"""

# Gradio interface
with gr.Blocks(css=custom_css) as demo:
    gr.Markdown(
        """
        # 🎨 Art Institute of Chicago Explorer
        *Discover masterpieces from one of the world's premier art collections through an elegant and intuitive interface.*
        """
    )
    
    with gr.Row():
        with gr.Column():
            search_input = gr.Textbox(
                label="Enter your search term",
                placeholder="e.g., Monet, Impressionism, landscape...",
            )
            public_domain = gr.Checkbox(
                label="Show only public domain artworks",
                value=False
            )
            search_btn = gr.Button(
                "🔍 Search",
                variant="primary"
            )
    
    with gr.Row():
        gallery = gr.Gallery(
            label="Search Results",
            show_label=True,
            elem_id="gallery",
            columns=[2],
            rows=[2],
            height="500px",
            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]
    )

# Launch with a dark theme
demo.launch(theme=gr.themes.Monochrome(
    primary_hue="purple",
    secondary_hue="red",
    neutral_hue="slate",
    font=["Helvetica", "ui-sans-serif"]
))