Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -1000,32 +1000,24 @@ with gr.Blocks(theme="Nymbo/Nymbo_Theme", css=css, title="NewsAI μλΉμ€") as
|
|
1000 |
|
1001 |
with gr.Tab("μ μΈκ³"):
|
1002 |
gr.Markdown("λλ₯λ³λ‘ 24μκ° μ΄λ΄ λ΄μ€λ₯Ό κ²μν©λλ€.")
|
1003 |
-
|
1004 |
with gr.Column():
|
1005 |
with gr.Column(elem_id="status_area"):
|
1006 |
with gr.Row():
|
1007 |
query_global = gr.Textbox(label="κ²μμ΄")
|
1008 |
region_select = gr.Dropdown(
|
1009 |
-
choices=
|
1010 |
-
"λμμμ",
|
1011 |
-
"λλ¨μμμ/μ€μΈμλμ",
|
1012 |
-
"λμ λ½",
|
1013 |
-
"μμ λ½",
|
1014 |
-
"μ€λ/μν리카",
|
1015 |
-
"μλ©λ¦¬μΉ΄"
|
1016 |
-
],
|
1017 |
label="μ§μ μ ν",
|
1018 |
value="λμμμ"
|
1019 |
)
|
1020 |
search_button_global = gr.Button("κ²μ", variant="primary")
|
1021 |
-
|
1022 |
status_message_global = gr.Markdown("")
|
1023 |
translated_query_display_global = gr.Markdown("")
|
1024 |
-
|
1025 |
with gr.Column(elem_id="results_area"):
|
1026 |
articles_state_global = gr.State([])
|
1027 |
global_article_components = create_article_components(MAX_GLOBAL_RESULTS)
|
1028 |
-
|
1029 |
|
1030 |
global_article_components = []
|
1031 |
for i in range(1000):
|
@@ -1136,112 +1128,109 @@ with gr.Blocks(theme="Nymbo/Nymbo_Theme", css=css, title="NewsAI μλΉμ€") as
|
|
1136 |
return outputs
|
1137 |
|
1138 |
|
1139 |
-
|
1140 |
"""μ νλ μ§μμ κ΅κ° λ° μΈμ΄ μ 보 λ°ν"""
|
1141 |
-
|
1142 |
-
|
1143 |
-
|
1144 |
-
|
1145 |
-
|
1146 |
-
|
1147 |
-
|
1148 |
-
|
1149 |
-
|
1150 |
-
|
1151 |
-
|
1152 |
-
|
1153 |
-
|
1154 |
-
|
1155 |
-
|
1156 |
-
|
1157 |
-
def search_global(query, region, articles_state_global):
|
1158 |
"""μ§μλ³ κ²μ ν¨μ"""
|
1159 |
-
|
1160 |
-
|
|
|
|
|
|
|
|
|
|
|
1161 |
|
1162 |
-
|
1163 |
-
|
1164 |
-
gr.update(
|
1165 |
-
|
1166 |
-
|
1167 |
-
|
1168 |
-
outputs.extend([
|
1169 |
-
gr.update(visible=False), gr.update(), gr.update(),
|
1170 |
-
gr.update(), gr.update()
|
1171 |
-
])
|
1172 |
-
outputs.append([])
|
1173 |
-
|
1174 |
-
yield outputs
|
1175 |
|
1176 |
-
|
1177 |
-
locations, languages = get_region_countries(region)
|
1178 |
-
total_countries = len(locations)
|
1179 |
|
1180 |
-
|
1181 |
-
|
1182 |
-
|
1183 |
-
|
1184 |
-
|
1185 |
-
|
1186 |
-
|
1187 |
-
|
1188 |
-
|
1189 |
-
|
1190 |
-
|
1191 |
-
|
1192 |
-
|
1193 |
-
|
1194 |
-
|
1195 |
-
seen_urls = set()
|
1196 |
-
unique_results = []
|
1197 |
-
for article in sorted_results:
|
1198 |
-
url = article.get('link', '')
|
1199 |
-
if url not in seen_urls:
|
1200 |
-
seen_urls.add(url)
|
1201 |
-
unique_results.append(article)
|
1202 |
-
|
1203 |
-
unique_results = unique_results[:MAX_GLOBAL_RESULTS]
|
1204 |
|
1205 |
-
|
1206 |
-
|
1207 |
-
gr.update(value=f"**κ²μμ΄:** {query} | **μ§μ:** {region}", visible=True),
|
1208 |
-
]
|
1209 |
|
1210 |
-
|
1211 |
-
|
1212 |
-
|
1213 |
-
|
1214 |
-
|
1215 |
-
|
1216 |
-
|
1217 |
-
|
1218 |
-
|
1219 |
-
|
1220 |
-
|
1221 |
-
|
1222 |
-
|
1223 |
-
|
1224 |
-
|
1225 |
-
|
1226 |
-
|
1227 |
-
|
1228 |
-
|
1229 |
-
|
1230 |
-
|
1231 |
-
|
1232 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1233 |
|
1234 |
-
|
1235 |
-
|
1236 |
-
|
1237 |
-
except Exception as e:
|
1238 |
-
print(f"Error searching {country}: {str(e)}")
|
1239 |
-
continue
|
1240 |
-
|
1241 |
-
final_status = f"{region} κ²μ μλ£! μ΄ {len(unique_results)}κ°μ λ΄μ€κ° λ°κ²¬λμμ΅λλ€."
|
1242 |
-
outputs[0] = gr.update(value=final_status, visible=True)
|
1243 |
-
yield outputs
|
1244 |
|
|
|
|
|
|
|
1245 |
|
1246 |
|
1247 |
|
|
|
1000 |
|
1001 |
with gr.Tab("μ μΈκ³"):
|
1002 |
gr.Markdown("λλ₯λ³λ‘ 24μκ° μ΄λ΄ λ΄μ€λ₯Ό κ²μν©λλ€.")
|
1003 |
+
|
1004 |
with gr.Column():
|
1005 |
with gr.Column(elem_id="status_area"):
|
1006 |
with gr.Row():
|
1007 |
query_global = gr.Textbox(label="κ²μμ΄")
|
1008 |
region_select = gr.Dropdown(
|
1009 |
+
choices=REGIONS,
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1010 |
label="μ§μ μ ν",
|
1011 |
value="λμμμ"
|
1012 |
)
|
1013 |
search_button_global = gr.Button("κ²μ", variant="primary")
|
1014 |
+
|
1015 |
status_message_global = gr.Markdown("")
|
1016 |
translated_query_display_global = gr.Markdown("")
|
1017 |
+
|
1018 |
with gr.Column(elem_id="results_area"):
|
1019 |
articles_state_global = gr.State([])
|
1020 |
global_article_components = create_article_components(MAX_GLOBAL_RESULTS)
|
|
|
1021 |
|
1022 |
global_article_components = []
|
1023 |
for i in range(1000):
|
|
|
1128 |
return outputs
|
1129 |
|
1130 |
|
1131 |
+
def get_region_countries(region):
|
1132 |
"""μ νλ μ§μμ κ΅κ° λ° μΈμ΄ μ 보 λ°ν"""
|
1133 |
+
if region == "λμμμ":
|
1134 |
+
return COUNTRY_LOCATIONS_EAST_ASIA, COUNTRY_LANGUAGES_EAST_ASIA
|
1135 |
+
elif region == "λλ¨μμμ/μ€μΈμλμ":
|
1136 |
+
return COUNTRY_LOCATIONS_SOUTHEAST_ASIA_OCEANIA, COUNTRY_LANGUAGES_SOUTHEAST_ASIA_OCEANIA
|
1137 |
+
elif region == "λμ λ½":
|
1138 |
+
return COUNTRY_LOCATIONS_EAST_EUROPE, COUNTRY_LANGUAGES_EAST_EUROPE
|
1139 |
+
elif region == "μμ λ½":
|
1140 |
+
return COUNTRY_LOCATIONS_WEST_EUROPE, COUNTRY_LANGUAGES_WEST_EUROPE
|
1141 |
+
elif region == "μ€λ/μν리카":
|
1142 |
+
return COUNTRY_LOCATIONS_ARAB_AFRICA, COUNTRY_LANGUAGES_ARAB_AFRICA
|
1143 |
+
elif region == "μλ©λ¦¬μΉ΄":
|
1144 |
+
return COUNTRY_LOCATIONS_AMERICA, COUNTRY_LANGUAGES_AMERICA
|
1145 |
+
return {}, {}
|
1146 |
+
|
1147 |
+
def search_global(query, region, articles_state_global):
|
|
|
|
|
1148 |
"""μ§μλ³ κ²μ ν¨μ"""
|
1149 |
+
status_msg = f"{region} μ§μ κ²μμ μμν©λλ€..."
|
1150 |
+
all_results = []
|
1151 |
+
|
1152 |
+
outputs = [
|
1153 |
+
gr.update(value=status_msg, visible=True),
|
1154 |
+
gr.update(value=f"**κ²μμ΄:** {query}", visible=True),
|
1155 |
+
]
|
1156 |
|
1157 |
+
for _ in global_article_components:
|
1158 |
+
outputs.extend([
|
1159 |
+
gr.update(visible=False), gr.update(), gr.update(),
|
1160 |
+
gr.update(), gr.update()
|
1161 |
+
])
|
1162 |
+
outputs.append([])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1163 |
|
1164 |
+
yield outputs
|
|
|
|
|
1165 |
|
1166 |
+
# μ νλ μ§μμ κ΅κ° μ 보 κ°μ Έμ€κΈ°
|
1167 |
+
locations, languages = get_region_countries(region)
|
1168 |
+
total_countries = len(locations)
|
1169 |
+
|
1170 |
+
for idx, (country, location) in enumerate(locations.items(), 1):
|
1171 |
+
try:
|
1172 |
+
status_msg = f"{region} - {country} κ²μ μ€... ({idx}/{total_countries} κ΅κ°)"
|
1173 |
+
outputs[0] = gr.update(value=status_msg, visible=True)
|
1174 |
+
yield outputs
|
1175 |
+
|
1176 |
+
error_message, articles = serphouse_search(query, country)
|
1177 |
+
if not error_message and articles:
|
1178 |
+
for article in articles:
|
1179 |
+
article['source_country'] = country
|
1180 |
+
article['region'] = region
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1181 |
|
1182 |
+
all_results.extend(articles)
|
1183 |
+
sorted_results = sorted(all_results, key=lambda x: x.get('time', ''), reverse=True)
|
|
|
|
|
1184 |
|
1185 |
+
seen_urls = set()
|
1186 |
+
unique_results = []
|
1187 |
+
for article in sorted_results:
|
1188 |
+
url = article.get('link', '')
|
1189 |
+
if url not in seen_urls:
|
1190 |
+
seen_urls.add(url)
|
1191 |
+
unique_results.append(article)
|
1192 |
+
|
1193 |
+
unique_results = unique_results[:MAX_GLOBAL_RESULTS]
|
1194 |
+
|
1195 |
+
outputs = [
|
1196 |
+
gr.update(value=f"{region} - {idx}/{total_countries} κ΅κ° κ²μ μλ£\nνμ¬κΉμ§ λ°κ²¬λ λ΄μ€: {len(unique_results)}건", visible=True),
|
1197 |
+
gr.update(value=f"**κ²μμ΄:** {query} | **μ§μ:** {region}", visible=True),
|
1198 |
+
]
|
1199 |
+
|
1200 |
+
for idx, comp in enumerate(global_article_components):
|
1201 |
+
if idx < len(unique_results):
|
1202 |
+
article = unique_results[idx]
|
1203 |
+
image_url = article.get('image_url', '')
|
1204 |
+
image_update = gr.update(value=image_url, visible=True) if image_url and not image_url.startswith('data:image') else gr.update(value=None, visible=False)
|
1205 |
+
|
1206 |
+
korean_summary = translate_to_korean(article['snippet'])
|
1207 |
+
|
1208 |
+
outputs.extend([
|
1209 |
+
gr.update(visible=True),
|
1210 |
+
gr.update(value=f"### [{article['title']}]({article['link']})"),
|
1211 |
+
image_update,
|
1212 |
+
gr.update(value=f"**μμ½:** {article['snippet']}\n\n**νκΈ μμ½:** {korean_summary}"),
|
1213 |
+
gr.update(value=f"**μΆμ²:** {article['channel']} | **κ΅κ°:** {article['source_country']} | **μ§μ:** {article['region']} | **μκ°:** {article['time']}")
|
1214 |
+
])
|
1215 |
+
else:
|
1216 |
+
outputs.extend([
|
1217 |
+
gr.update(visible=False),
|
1218 |
+
gr.update(),
|
1219 |
+
gr.update(),
|
1220 |
+
gr.update(),
|
1221 |
+
gr.update()
|
1222 |
+
])
|
1223 |
+
|
1224 |
+
outputs.append(unique_results)
|
1225 |
+
yield outputs
|
1226 |
|
1227 |
+
except Exception as e:
|
1228 |
+
print(f"Error searching {country}: {str(e)}")
|
1229 |
+
continue
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1230 |
|
1231 |
+
final_status = f"{region} κ²μ μλ£! μ΄ {len(unique_results)}κ°μ λ΄μ€κ° λ°κ²¬λμμ΅λλ€."
|
1232 |
+
outputs[0] = gr.update(value=final_status, visible=True)
|
1233 |
+
yield outputs
|
1234 |
|
1235 |
|
1236 |
|