immunobiotech commited on
Commit
8540b91
ยท
verified ยท
1 Parent(s): 1c276c4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +97 -69
app.py CHANGED
@@ -8,7 +8,6 @@ import io
8
  BASE_URL = "https://api.artic.edu/api/v1"
9
 
10
  def search_artworks(query, is_public_domain=False):
11
- # ์•„ํŠธ์›Œํฌ ๊ฒ€์ƒ‰ API ํ˜ธ์ถœ
12
  search_url = f"{BASE_URL}/artworks/search"
13
  params = {
14
  "q": query,
@@ -21,107 +20,136 @@ def search_artworks(query, is_public_domain=False):
21
 
22
  try:
23
  response = requests.get(search_url, params=params)
24
- response.raise_for_status() # ์—๋Ÿฌ ์ฒดํฌ
25
  results = response.json()
26
 
27
  if "data" not in results:
28
- return [], "๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค."
29
 
30
  images = []
31
  captions = []
32
 
33
  for artwork in results["data"]:
34
  if artwork.get("image_id"):
35
- # IIIF ์ด๋ฏธ์ง€ URL ์ƒ์„ฑ
36
  image_url = f"https://www.artic.edu/iiif/2/{artwork['image_id']}/full/843,/0/default.jpg"
37
 
38
- # ์ž‘ํ’ˆ ์ •๋ณด ํฌ๋งทํŒ…
39
- artwork_info = f"""์ œ๋ชฉ: {artwork.get('title', 'Unknown')}\n์ž‘๊ฐ€: {artwork.get('artist_display', 'Unknown')}\n์ œ์ž‘์—ฐ๋„: {artwork.get('date_display', 'Unknown')}"""
40
 
41
  try:
42
- img_response = requests.get(image_url, timeout=5) # ํƒ€์ž„์•„์›ƒ ์„ค์ •
43
- img_response.raise_for_status() # ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ ์—๋Ÿฌ ์ฒดํฌ
44
 
45
- # ์ด๋ฏธ์ง€ ๊ฒ€์ฆ
46
  img = Image.open(io.BytesIO(img_response.content))
47
- img.verify() # ์ด๋ฏธ์ง€ ํŒŒ์ผ ๊ฒ€์ฆ
48
- img = Image.open(io.BytesIO(img_response.content)) # ๋‹ค์‹œ ์—ด๊ธฐ
49
 
50
- # RGB ๋ชจ๋“œ๋กœ ๋ณ€ํ™˜ (์•ŒํŒŒ ์ฑ„๋„ ์ œ๊ฑฐ)
51
  if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info):
52
  img = img.convert('RGB')
53
 
54
  images.append(img)
55
  captions.append(artwork_info)
56
  except Exception as e:
57
- print(f"์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ: {e}")
58
  continue
59
 
60
  if not images:
61
- return [], "๊ฒ€์ƒ‰๋œ ์ž‘ํ’ˆ์— ๋Œ€ํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
62
 
63
  return images, "\n\n".join(captions)
64
 
65
  except Exception as e:
66
- print(f"API ์š”์ฒญ ์ค‘ ์—๋Ÿฌ ๋ฐœ์ƒ: {e}")
67
- return [], f"๊ฒ€์ƒ‰ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"
68
 
69
- def get_gallery_info(gallery_id):
70
- try:
71
- gallery_url = f"{BASE_URL}/galleries/{gallery_id}"
72
- response = requests.get(gallery_url)
73
- response.raise_for_status()
74
- gallery = response.json()
75
-
76
- if "data" not in gallery:
77
- return "๊ฐค๋Ÿฌ๋ฆฌ ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค."
78
-
79
- gallery_data = gallery["data"]
80
- return f"""
81
- ๊ฐค๋Ÿฌ๋ฆฌ ์ด๋ฆ„: {gallery_data.get('title', 'Unknown')}
82
- ์œ„์น˜: {gallery_data.get('location', 'Unknown')}
83
- ์„ค๋ช…: {gallery_data.get('description', 'No description available')}
84
- """
85
- except Exception as e:
86
- return f"๊ฐค๋Ÿฌ๋ฆฌ ์ •๋ณด ์กฐํšŒ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค: {str(e)}"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
 
88
- # Gradio ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์„ฑ
89
- with gr.Blocks() as demo:
90
- gr.Markdown("# Art Institute of Chicago Gallery")
 
 
 
 
 
91
 
92
- with gr.Tab("์ž‘ํ’ˆ ๊ฒ€์ƒ‰"):
93
- with gr.Row():
94
- search_input = gr.Textbox(label="๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”")
95
- public_domain = gr.Checkbox(label="๊ณต๊ฐœ ๋„๋ฉ”์ธ ์ž‘ํ’ˆ๋งŒ ๋ณด๊ธฐ")
96
- search_btn = gr.Button("๊ฒ€์ƒ‰")
97
-
98
- with gr.Row():
99
- gallery = gr.Gallery(
100
- label="๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ",
101
- show_label=True,
102
- elem_id="gallery",
103
- columns=[2],
104
- rows=[2],
105
- height="auto"
106
  )
107
-
108
- info = gr.Textbox(label="์ž‘ํ’ˆ ์ •๋ณด", lines=10)
109
-
110
- search_btn.click(
111
- fn=search_artworks,
112
- inputs=[search_input, public_domain],
113
- outputs=[gallery, info]
114
- )
115
 
116
- with gr.Tab("๊ฐค๋Ÿฌ๋ฆฌ ์ •๋ณด"):
117
- gallery_id = gr.Number(label="๊ฐค๋Ÿฌ๋ฆฌ ID๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”")
118
- gallery_btn = gr.Button("์ •๋ณด ์กฐํšŒ")
119
- gallery_info = gr.Textbox(label="๊ฐค๋Ÿฌ๋ฆฌ ์ •๋ณด", lines=5)
120
-
121
- gallery_btn.click(
122
- fn=get_gallery_info,
123
- inputs=gallery_id,
124
- outputs=gallery_info
125
  )
 
 
 
 
 
 
 
 
 
 
 
 
126
 
127
- demo.launch()
 
 
 
 
 
 
 
8
  BASE_URL = "https://api.artic.edu/api/v1"
9
 
10
  def search_artworks(query, is_public_domain=False):
 
11
  search_url = f"{BASE_URL}/artworks/search"
12
  params = {
13
  "q": query,
 
20
 
21
  try:
22
  response = requests.get(search_url, params=params)
23
+ response.raise_for_status()
24
  results = response.json()
25
 
26
  if "data" not in results:
27
+ return [], "No search results found."
28
 
29
  images = []
30
  captions = []
31
 
32
  for artwork in results["data"]:
33
  if artwork.get("image_id"):
 
34
  image_url = f"https://www.artic.edu/iiif/2/{artwork['image_id']}/full/843,/0/default.jpg"
35
 
36
+ artwork_info = f"""Title: {artwork.get('title', 'Unknown')}\nArtist: {artwork.get('artist_display', 'Unknown')}\nDate: {artwork.get('date_display', 'Unknown')}"""
 
37
 
38
  try:
39
+ img_response = requests.get(image_url, timeout=5)
40
+ img_response.raise_for_status()
41
 
 
42
  img = Image.open(io.BytesIO(img_response.content))
43
+ img.verify()
44
+ img = Image.open(io.BytesIO(img_response.content))
45
 
 
46
  if img.mode in ('RGBA', 'LA') or (img.mode == 'P' and 'transparency' in img.info):
47
  img = img.convert('RGB')
48
 
49
  images.append(img)
50
  captions.append(artwork_info)
51
  except Exception as e:
52
+ print(f"Error processing image: {e}")
53
  continue
54
 
55
  if not images:
56
+ return [], "Unable to load images for the searched artworks."
57
 
58
  return images, "\n\n".join(captions)
59
 
60
  except Exception as e:
61
+ print(f"API request error: {e}")
62
+ return [], f"An error occurred during search: {str(e)}"
63
 
64
+ # Custom CSS for styling
65
+ custom_css = """
66
+ .gradio-container {
67
+ background: linear-gradient(to right, #1a1a1a, #2d2d2d);
68
+ color: #ffffff;
69
+ }
70
+ .gr-button {
71
+ background: linear-gradient(to right, #c94b4b, #4b134f);
72
+ border: none;
73
+ color: white;
74
+ font-weight: bold;
75
+ }
76
+ .gr-button:hover {
77
+ background: linear-gradient(to right, #4b134f, #c94b4b);
78
+ transform: scale(1.05);
79
+ transition: all 0.3s ease;
80
+ }
81
+ .gr-input {
82
+ border: 2px solid #4b134f;
83
+ background: rgba(255, 255, 255, 0.1);
84
+ color: white;
85
+ }
86
+ .gr-form {
87
+ background: rgba(0, 0, 0, 0.2);
88
+ border-radius: 15px;
89
+ padding: 20px;
90
+ }
91
+ .gr-box {
92
+ border-radius: 15px;
93
+ border: 2px solid #4b134f;
94
+ }
95
+ .gr-gallery {
96
+ background: rgba(0, 0, 0, 0.3);
97
+ border-radius: 15px;
98
+ padding: 10px;
99
+ }
100
+ """
101
 
102
+ # Gradio interface
103
+ with gr.Blocks(css=custom_css) as demo:
104
+ gr.Markdown(
105
+ """
106
+ # ๐ŸŽจ Art Institute of Chicago Explorer
107
+ *Discover masterpieces from one of the world's premier art collections through an elegant and intuitive interface.*
108
+ """
109
+ )
110
 
111
+ with gr.Row():
112
+ with gr.Column():
113
+ search_input = gr.Textbox(
114
+ label="Enter your search term",
115
+ placeholder="e.g., Monet, Impressionism, landscape...",
116
+ )
117
+ public_domain = gr.Checkbox(
118
+ label="Show only public domain artworks",
119
+ value=False
120
+ )
121
+ search_btn = gr.Button(
122
+ "๐Ÿ” Search",
123
+ variant="primary"
 
124
  )
 
 
 
 
 
 
 
 
125
 
126
+ with gr.Row():
127
+ gallery = gr.Gallery(
128
+ label="Search Results",
129
+ show_label=True,
130
+ elem_id="gallery",
131
+ columns=[2],
132
+ rows=[2],
133
+ height="500px",
134
+ object_fit="contain"
135
  )
136
+
137
+ info = gr.Textbox(
138
+ label="Artwork Details",
139
+ lines=10,
140
+ show_label=True
141
+ )
142
+
143
+ search_btn.click(
144
+ fn=search_artworks,
145
+ inputs=[search_input, public_domain],
146
+ outputs=[gallery, info]
147
+ )
148
 
149
+ # Launch with a dark theme
150
+ demo.launch(theme=gr.themes.Monochrome(
151
+ primary_hue="purple",
152
+ secondary_hue="red",
153
+ neutral_hue="slate",
154
+ font=["Helvetica", "ui-sans-serif"]
155
+ ))