Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -18,51 +18,72 @@ def search_artworks(query, is_public_domain=False):
|
|
18 |
|
19 |
if is_public_domain:
|
20 |
params["query"] = {"term": {"is_public_domain": True}}
|
21 |
-
|
22 |
-
response = requests.get(search_url, params=params)
|
23 |
-
results = response.json()
|
24 |
|
25 |
-
|
26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
|
28 |
-
|
29 |
-
|
30 |
-
|
31 |
-
|
32 |
-
image_url = f"https://www.artic.edu/iiif/2/{artwork['image_id']}/full/843,/0/default.jpg"
|
33 |
-
|
34 |
-
# ์ํ ์ ๋ณด ํฌ๋งทํ
|
35 |
-
artwork_info = f"""
|
36 |
-
์ ๋ชฉ: {artwork.get('title', 'Unknown')}
|
37 |
-
์๊ฐ: {artwork.get('artist_display', 'Unknown')}
|
38 |
-
์ ์์ฐ๋: {artwork.get('date_display', 'Unknown')}
|
39 |
-
"""
|
40 |
-
|
41 |
-
# ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ๋ฐ PIL Image๋ก ๋ณํ
|
42 |
-
try:
|
43 |
-
img_response = requests.get(image_url)
|
44 |
-
img = Image.open(io.BytesIO(img_response.content))
|
45 |
-
output.append((img, artwork_info))
|
46 |
-
except:
|
47 |
-
continue
|
48 |
|
49 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
50 |
|
51 |
def get_gallery_info(gallery_id):
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
|
|
59 |
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
|
|
|
|
|
66 |
|
67 |
# Gradio ์ธํฐํ์ด์ค ๊ตฌ์ฑ
|
68 |
with gr.Blocks() as demo:
|
@@ -73,8 +94,18 @@ with gr.Blocks() as demo:
|
|
73 |
search_input = gr.Textbox(label="๊ฒ์์ด๋ฅผ ์
๋ ฅํ์ธ์")
|
74 |
public_domain = gr.Checkbox(label="๊ณต๊ฐ ๋๋ฉ์ธ ์ํ๋ง ๋ณด๊ธฐ")
|
75 |
search_btn = gr.Button("๊ฒ์")
|
76 |
-
|
77 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
78 |
|
79 |
search_btn.click(
|
80 |
fn=search_artworks,
|
|
|
18 |
|
19 |
if is_public_domain:
|
20 |
params["query"] = {"term": {"is_public_domain": True}}
|
|
|
|
|
|
|
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:
|
|
|
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,
|