benjamin5607 commited on
Commit
b7044ee
·
verified ·
1 Parent(s): c7eeef5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +31 -201
app.py CHANGED
@@ -1,6 +1,7 @@
1
  import streamlit as st
2
  import streamlit.components.v1 as components
3
  import json
 
4
 
5
  # 1. 페이지 설정
6
  st.set_page_config(page_title="Drunken Plane", page_icon="✈️", layout="wide")
@@ -13,204 +14,18 @@ st.markdown("""
13
  </style>
14
  """, unsafe_allow_html=True)
15
 
16
- # ---------------------------------------------------------
17
- # 💾 GLOBAL DATABASE (데이터는 소중하니까 100% 유지)
18
- # ---------------------------------------------------------
19
- PLACE_DB = {
20
- "South Korea 🇰🇷": [
21
- {"name": "Zest", "category": "Bar", "label": "🍸 Asia's Best", "lat": 37.526, "lon": 127.040, "desc_ko": "아시아 베스트 바 2위, 제로웨이스트 진토닉 성지", "desc_en": "Asia's leading zero-waste bar."},
22
- {"name": "Bar Cham", "category": "Bar", "label": "🍸 Hanok Bar", "lat": 37.578, "lon": 126.970, "desc_ko": "서촌 한옥에서 즐기는 독창적인 전통주 칵테일", "desc_en": "Cocktails with Korean spirits in a Hanok."},
23
- {"name": "Charles H.", "category": "Bar", "label": "🍸 Speakeasy", "lat": 37.570, "lon": 126.975, "desc_ko": "광화문 포시즌스 지하의 전설적인 스피크이지 바", "desc_en": "Legendary speakeasy at Four Seasons."},
24
- {"name": "Le Chamber", "category": "Bar", "label": "🍸 Secret", "lat": 37.524, "lon": 127.041, "desc_ko": "책장을 밀고 들어가는 청담동 스피크이지", "desc_en": "Hidden bar behind a bookshelf."},
25
- {"name": "Pine & Co.", "category": "Bar", "label": "🍸 Trendy", "lat": 37.523, "lon": 127.028, "desc_ko": "압구정의 힙한 모던 바, 한국 식재료 재해석", "desc_en": "Modern bar reinterpreting Korean ingredients."},
26
- {"name": "Mr. Ahn's Craft Makgeolli", "category": "Bar", "label": "🍶 Michelin Pub", "lat": 37.540, "lon": 126.987, "desc_ko": "미슐랭 가이드 등재, 전통주 가스트로 펍", "desc_en": "Michelin-recognized Korean gastropub."},
27
- {"name": "Alice Cheongdam", "category": "Bar", "label": "🍸 Concept", "lat": 37.525, "lon": 127.041, "desc_ko": "이상한 나라의 앨리스 컨셉의 환상적인 바", "desc_en": "Alice in Wonderland themed bar."},
28
- {"name": "Hwayo Distillery", "category": "Spirits", "label": "🏭 Premium Soju", "lat": 37.294, "lon": 127.632, "desc_ko": "한국 프리미엄 소주 '화요'의 본산", "desc_en": "Home of Hwayo Soju."},
29
- {"name": "Andong Soju Museum", "category": "Traditional", "label": "🍶 Heritage", "lat": 36.568, "lon": 128.729, "desc_ko": "700년 역사, 명인 박재서 안동소주", "desc_en": "Museum of Andong Soju."},
30
- {"name": "Sansawon", "category": "Traditional", "label": "🏛️ Museum", "lat": 37.899, "lon": 127.279, "desc_ko": "느린마을 막걸리와 전통주 정원(산사원)", "desc_en": "Traditional liquor museum and brewery park."},
31
- {"name": "Haechang Brewery", "category": "Traditional", "label": "🍶 Premium", "lat": 34.428, "lon": 126.588, "desc_ko": "막걸리계의 롤스로이스, 해남 해창", "desc_en": "The Rolls-Royce of Makgeolli."},
32
- {"name": "Boksoondoga", "category": "Traditional", "label": "🍶 Champagne", "lat": 35.539, "lon": 129.106, "desc_ko": "손으로 빚는 천연 탄산 샴페인 막걸리", "desc_en": "Hand-brewed sparkling Makgeolli."},
33
- {"name": "Jindo Hongju", "category": "Traditional", "label": "🍶 Red Spirit", "lat": 34.482, "lon": 126.261, "desc_ko": "지초로 붉은 빛을 낸 진도 명주", "desc_en": "Traditional red liquor from Jindo."},
34
- {"name": "Jeonju Igangju", "category": "Traditional", "label": "🍶 Pear & Ginger", "lat": 35.845, "lon": 127.108, "desc_ko": "배와 생강으로 빚은 조선 3대 명주", "desc_en": "Top 3 liquor of Joseon Dynasty."},
35
- {"name": "Hansan Sogokju", "category": "Traditional", "label": "🍶 Rice Wine", "lat": 36.066, "lon": 126.657, "desc_ko": "한번 앉으면 못 일어나는 앉은뱅이 술", "desc_en": "Sogokju, known as 'cripple wine'."},
36
- {"name": "Munbaeju", "category": "Traditional", "label": "🍶 Royal", "lat": 37.457, "lon": 126.677, "desc_ko": "평양 유래, 남북정상회담 만찬주", "desc_en": "Royal spirit from Pyongyang."},
37
- {"name": "Gamhongro", "category": "Traditional", "label": "🍶 Herbal", "lat": 37.948, "lon": 126.745, "desc_ko": "별주부전에 나오는 전설의 명주", "desc_en": "Legendary herbal liquor."},
38
- {"name": "Three Societies", "category": "Whiskey", "label": "🏭 Single Malt", "lat": 37.625, "lon": 127.189, "desc_ko": "한국 최초 싱글몰트 위스키 증류소 '기원'", "desc_en": "Korea's first single malt distillery."},
39
- {"name": "Kimchangsoo Whisky", "category": "Whiskey", "label": "🏭 Craft", "lat": 37.660, "lon": 126.770, "desc_ko": "김창수 명인의 한국 정통 위스키", "desc_en": "Authentic whisky made by Kim Chang-soo."},
40
- {"name": "Jeju Beer Company", "category": "Beer", "label": "🍺 Craft", "lat": 33.364, "lon": 126.242, "desc_ko": "제주 위트 에일의 탄생지", "desc_en": "Birthplace of Jeju Wit Ale."},
41
- {"name": "Magpie Brewing", "category": "Beer", "label": "🍺 Craft", "lat": 33.523, "lon": 126.559, "desc_ko": "제주의 힙한 감성, 맥파이", "desc_en": "Jeju's hippest craft beer brewery."},
42
- {"name": "Amazing Brewing", "category": "Beer", "label": "🍺 Brewpub", "lat": 37.545, "lon": 127.056, "desc_ko": "성수동 수제 맥주의 랜드마크", "desc_en": "Landmark of craft beer in Seongsu."},
43
- {"name": "Cheongdo Wine Tunnel", "category": "Wine", "label": "🍷 Persimmon", "lat": 35.617, "lon": 128.734, "desc_ko": "터널에서 숙성되는 감 와인", "desc_en": "Persimmon wine tunnel."},
44
- {"name": "Gochang Seonun", "category": "Wine", "label": "🍷 Bokbunja", "lat": 35.483, "lon": 126.583, "desc_ko": "고창 복분자주(블랙 라즈베리) 특구", "desc_en": "Famous for Bokbunja wine."},
45
- {"name": "Yesan Apple Winery", "category": "Wine", "label": "🍷 Apple", "lat": 36.745, "lon": 126.742, "desc_ko": "추사 사과 와인과 브랜디", "desc_en": "Apple wine and brandy distillery."},
46
- {"name": "Muju Meoru", "category": "Wine", "label": "🍷 Wild Grape", "lat": 35.975, "lon": 127.688, "desc_ko": "덕유산 동굴 숙성 머루 와인", "desc_en": "Wild grape wine aged in cave."}
47
- ],
48
- "Sweden 🇸🇪": [
49
- {"name": "O.P. Anderson", "category": "Traditional", "label": "🥔 Aquavit", "lat": 62.336, "lon": 17.039, "desc_ko": "스웨덴 아쿠아비트의 제왕", "desc_en": "King of Swedish Aquavit."},
50
- {"name": "Absolut Home", "category": "Spirits", "label": "🏭 Vodka", "lat": 55.923, "lon": 14.294, "desc_ko": "앱솔루트 보드카의 고향 오후스", "desc_en": "Home of Absolut Vodka."},
51
- {"name": "Mackmyra", "category": "Whiskey", "label": "🏭 Nordic", "lat": 60.638, "lon": 17.037, "desc_ko": "스웨덴 중력 증류소", "desc_en": "Gravity distillery."},
52
- {"name": "Hernö Gin", "category": "Spirits", "label": "🍸 Best Gin", "lat": 62.684, "lon": 17.794, "desc_ko": "세계 최다 수상 진 증류소", "desc_en": "Most awarded gin in Europe."},
53
- {"name": "Spritmuseum", "category": "Traditional", "label": "🏛️ Museum", "lat": 59.325, "lon": 18.096, "desc_ko": "스톡홀름 술 박물관", "desc_en": "Museum of spirits."},
54
- {"name": "High Coast", "category": "Whiskey", "label": "🏭 Northern", "lat": 62.983, "lon": 17.817, "desc_ko": "북위 63도, 옹달샘 위스키", "desc_en": "Whisky from the High Coast."},
55
- {"name": "Akkurat", "category": "Bar", "label": "🍺 Beer", "lat": 59.319, "lon": 18.070, "desc_ko": "전 세계 맥주 덕후들의 성지", "desc_en": "World-famous beer bar."}
56
- ],
57
- "Norway 🇳🇴": [
58
- {"name": "Himkok", "category": "Bar", "label": "🍸 Distillery", "lat": 59.916, "lon": 10.750, "desc_ko": "자체 증류 아쿠아비트 바", "desc_en": "In-house distillery bar."},
59
- {"name": "Løiten Brænderi", "category": "Traditional", "label": "🥔 Aquavit", "lat": 60.821, "lon": 11.343, "desc_ko": "노르웨이 아쿠아비트 역사관", "desc_en": "Aquavit history."},
60
- {"name": "Arcus (Linie)", "category": "Traditional", "label": "🚢 Aquavit", "lat": 59.970, "lon": 10.930, "desc_ko": "적도를 두 번 통과한 리니에", "desc_en": "Equator aged Aquavit."},
61
- {"name": "Aurora Spirit", "category": "Whiskey", "label": "🏭 Arctic", "lat": 69.619, "lon": 20.272, "desc_ko": "세계 최북단 증류소", "desc_en": "Northernmost distillery."},
62
- {"name": "Nøgne Ø", "category": "Beer", "label": "🍺 Craft", "lat": 58.398, "lon": 8.643, "desc_ko": "유럽 크래프트 맥주의 전설", "desc_en": "Legendary craft brewery."},
63
- {"name": "Ægir Bryggeri", "category": "Beer", "label": "🍺 Viking", "lat": 60.863, "lon": 7.114, "desc_ko": "피요르드 속 바이킹 양조장", "desc_en": "Viking style brewery."}
64
- ],
65
- "Japan 🇯🇵": [
66
- {"name": "Suntory Yamazaki", "category": "Whiskey", "label": "🏭 Legend", "lat": 34.892, "lon": 135.674, "desc_ko": "일본 위스키의 시초", "desc_en": "Birthplace of Japanese whisky."},
67
- {"name": "Suntory Hakushu", "category": "Whiskey", "label": "🏭 Forest", "lat": 35.807, "lon": 138.303, "desc_ko": "숲속의 증류소", "desc_en": "Distillery in the forest."},
68
- {"name": "Nikka Yoichi", "category": "Whiskey", "label": "🏭 Hokkaido", "lat": 43.186, "lon": 140.798, "desc_ko": "타케츠루의 꿈", "desc_en": "Masataka Taketsuru's dream."},
69
- {"name": "Nikka Miyagikyo", "category": "Whiskey", "label": "🏭 Sendai", "lat": 38.312, "lon": 140.654, "desc_ko": "부드럽고 우아한 위스키", "desc_en": "Distillery known for fruity elegance."},
70
- {"name": "Chichibu", "category": "Whiskey", "label": "🏭 Craft", "lat": 36.026, "lon": 139.055, "desc_ko": "이치로스 몰트", "desc_en": "Home of Ichiro's Malt."},
71
- {"name": "Dassai Brewery", "category": "Traditional", "label": "🍶 Premium", "lat": 34.120, "lon": 132.029, "desc_ko": "오바마 만찬주 닷사이", "desc_en": "Famous Dassai Sake."},
72
- {"name": "Gekkeikan Okura", "category": "Traditional", "label": "🍶 Sake", "lat": 34.929, "lon": 135.761, "desc_ko": "교토 사케 박물관", "desc_en": "History of sake brewing."},
73
- {"name": "Sapporo Beer Museum", "category": "Beer", "label": "🏛️ Museum", "lat": 43.071, "lon": 141.369, "desc_ko": "삿포로 맥주의 역사", "desc_en": "Japan's only beer museum."},
74
- {"name": "Bar High Five", "category": "Bar", "label": "🍸 Ginza", "lat": 35.671, "lon": 139.764, "desc_ko": "긴자의 전설적인 바", "desc_en": "Legendary bar in Ginza."}
75
- ],
76
- "China 🇨🇳": [
77
- {"name": "Kweichow Moutai", "category": "Traditional", "label": "🍶 National", "lat": 27.842, "lon": 106.378, "desc_ko": "중국의 국주 마오타이", "desc_en": "China's national liquor."},
78
- {"name": "Wuliangye", "category": "Traditional", "label": "🍶 Baijiu", "lat": 28.752, "lon": 104.607, "desc_ko": "농향형 백주의 왕", "desc_en": "King of strong-aroma baijiu."},
79
- {"name": "Fenjiu", "category": "Traditional", "label": "🍶 Light", "lat": 37.332, "lon": 111.758, "desc_ko": "청향형 백주의 대표", "desc_en": "Representative of light-aroma."},
80
- {"name": "The Chuan", "category": "Whiskey", "label": "🏭 Emeishan", "lat": 29.548, "lon": 103.376, "desc_ko": "페르노리카 중국 증류소", "desc_en": "Pernod Ricard's iconic distillery."},
81
- {"name": "Laizhou", "category": "Whiskey", "label": "🏭 Sichuan", "lat": 30.297, "lon": 103.023, "desc_ko": "바커스 그룹 거대 증류소", "desc_en": "Massive whisky distillery."},
82
- {"name": "Tsingtao Museum", "category": "Beer", "label": "🏛️ Beer", "lat": 36.077, "lon": 120.344, "desc_ko": "칭다오 맥주 박물관", "desc_en": "Historic Tsingtao beer museum."},
83
- {"name": "Hope & Sesame", "category": "Bar", "label": "🍸 Speakeasy", "lat": 23.129, "lon": 113.292, "desc_ko": "광저우 히든 바", "desc_en": "Legendary speakeasy."},
84
- {"name": "Chateau Changyu", "category": "Wine", "label": "🍷 Ningxia", "lat": 38.337, "lon": 106.079, "desc_ko": "중국의 모젤 와이너리", "desc_en": "Iconic chateau in Ningxia."}
85
- ],
86
- "Scotland 🏴󠁧󠁢󠁳󠁣󠁴󠁿": [
87
- {"name": "The Macallan", "category": "Whiskey", "label": "🏭 Speyside", "lat": 57.484, "lon": -3.206, "desc_ko": "위스키의 롤스로이스", "desc_en": "The Rolls-Royce of whisky."},
88
- {"name": "Laphroaig", "category": "Whiskey", "label": "🏭 Islay", "lat": 55.629, "lon": -6.153, "desc_ko": "피트 향의 정수", "desc_en": "Richly flavoured peaty whisky."},
89
- {"name": "Glenfiddich", "category": "Whiskey", "label": "🏭 Speyside", "lat": 57.454, "lon": -3.128, "desc_ko": "세계 판매 1위 싱글몰트", "desc_en": "World's most awarded single malt."},
90
- {"name": "Lagavulin", "category": "Whiskey", "label": "🏭 Islay", "lat": 55.635, "lon": -6.126, "desc_ko": "스모키의 제왕", "desc_en": "The King of Islay."},
91
- {"name": "Ardbeg", "category": "Whiskey", "label": "🏭 Islay", "lat": 55.642, "lon": -6.112, "desc_ko": "궁극의 피트 괴물", "desc_en": "The ultimate Islay malt."},
92
- {"name": "The Balvenie", "category": "Whiskey", "label": "🏭 Craft", "lat": 57.455, "lon": -3.126, "desc_ko": "전통 수제 방식", "desc_en": "Dedicated to the traditional craft."},
93
- {"name": "Talisker", "category": "Whiskey", "label": "🏭 Skye", "lat": 57.302, "lon": -6.356, "desc_ko": "스카이 섬의 화산 같은 강렬함", "desc_en": "Made by the sea on Isle of Skye."},
94
- {"name": "Highland Park", "category": "Whiskey", "label": "🏭 Orkney", "lat": 58.974, "lon": -2.953, "desc_ko": "바이킹의 혼", "desc_en": "The Viking soul of whisky."},
95
- {"name": "Springbank", "category": "Whiskey", "label": "🏭 Campbeltown", "lat": 55.426, "lon": -5.606, "desc_ko": "100% 수제 위스키", "desc_en": "Handmade whisky legend."},
96
- {"name": "Dalmore", "category": "Whiskey", "label": "🏭 Highland", "lat": 57.694, "lon": -4.240, "desc_ko": "12뿔 사슴의 전설", "desc_en": "A masterpiece of malt whisky."},
97
- {"name": "Oban", "category": "Whiskey", "label": "🏭 Highland", "lat": 56.414, "lon": -5.471, "desc_ko": "바다와 육지가 만나는 곳", "desc_en": "Where the Highlands meet the Islands."}
98
- ],
99
- "USA 🇺🇸": [
100
- {"name": "Jack Daniel's", "category": "Whiskey", "label": "🏭 Tennessee", "lat": 35.284, "lon": -86.368, "desc_ko": "미국 위스키의 상징", "desc_en": "Top selling American whiskey."},
101
- {"name": "Buffalo Trace", "category": "Whiskey", "label": "🏭 Bourbon", "lat": 38.217, "lon": -84.870, "desc_ko": "버번 위스키의 전설", "desc_en": "Legendary bourbon distillery."},
102
- {"name": "Jim Beam", "category": "Whiskey", "label": "🏭 Bourbon", "lat": 37.931, "lon": -85.654, "desc_ko": "세계 1위 버번", "desc_en": "World's No.1 Bourbon."},
103
- {"name": "Maker's Mark", "category": "Whiskey", "label": "🏭 Bourbon", "lat": 37.647, "lon": -85.349, "desc_ko": "붉은 왁스 봉인", "desc_en": "Iconic red wax dipped."},
104
- {"name": "Woodford Reserve", "category": "Whiskey", "label": "🏭 Bourbon", "lat": 38.113, "lon": -84.811, "desc_ko": "켄터키 더비 공식 버번", "desc_en": "Historic distillery."},
105
- {"name": "Wild Turkey", "category": "Whiskey", "label": "🏭 Bourbon", "lat": 38.043, "lon": -84.857, "desc_ko": "강렬한 야생의 맛", "desc_en": "Authentic Kentucky Straight Bourbon."},
106
- {"name": "Robert Mondavi", "category": "Wine", "label": "🍷 Napa", "lat": 38.427, "lon": -122.404, "desc_ko": "나파 밸리의 아버지", "desc_en": "Soul of Napa Valley."},
107
- {"name": "Opus One", "category": "Wine", "label": "🍷 Cult", "lat": 38.428, "lon": -122.409, "desc_ko": "미국 컬트 와인", "desc_en": "Ultra-premium winery."},
108
- {"name": "Sierra Nevada", "category": "Beer", "label": "🍺 Craft", "lat": 39.724, "lon": -121.816, "desc_ko": "크래프트 맥주 선구자", "desc_en": "Pioneers of craft brewing."},
109
- {"name": "The Dead Rabbit", "category": "Bar", "label": "🍸 NYC Icon", "lat": 40.703, "lon": -74.011, "desc_ko": "뉴욕 최고의 칵테일 펍", "desc_en": "World's best bar winner."}
110
- ],
111
- "Ireland 🇮🇪": [
112
- {"name": "Guinness Storehouse", "category": "Beer", "label": "🍺 Stout", "lat": 53.341, "lon": -6.286, "desc_ko": "더블린의 심장, 기네스", "desc_en": "Ireland's No.1 attraction."},
113
- {"name": "Jameson Bow St.", "category": "Whiskey", "label": "🏭 Whiskey", "lat": 53.348, "lon": -6.277, "desc_ko": "제임슨 위스키", "desc_en": "Birthplace of Irish whiskey."},
114
- {"name": "Teeling", "category": "Whiskey", "label": "🏭 Whiskey", "lat": 53.337, "lon": -6.277, "desc_ko": "더블린 위스키 부활", "desc_en": "Reviving Dublin whiskey."},
115
- {"name": "Bushmills", "category": "Whiskey", "label": "🏭 Oldest", "lat": 55.207, "lon": -6.524, "desc_ko": "세계 최고(最古) 면허 증류소", "desc_en": "World's oldest licensed distillery."},
116
- {"name": "The Temple Bar", "category": "Bar", "label": "🍸 Pub", "lat": 53.345, "lon": -6.264, "desc_ko": "가장 유명한 붉은 펍", "desc_en": "Dublin's iconic red pub."}
117
- ],
118
- "France 🇫🇷": [
119
- {"name": "Moët & Chandon", "category": "Wine", "label": "🍷 Champagne", "lat": 49.043, "lon": 3.957, "desc_ko": "샹파뉴 지하 동굴, 돔 페리뇽", "desc_en": "Cellars of Dom Pérignon."},
120
- {"name": "Maison Hennessy", "category": "Spirits", "label": "🏭 Cognac", "lat": 45.694, "lon": -0.327, "desc_ko": "세계 1위 코냑", "desc_en": "World's finest cognac."},
121
- {"name": "Château Margaux", "category": "Wine", "label": "🍷 Bordeaux", "lat": 45.044, "lon": -0.668, "desc_ko": "보르도 5대 샤토", "desc_en": "Legendary Bordeaux wine."},
122
- {"name": "Cité du Vin", "category": "Wine", "label": "🏛️ Museum", "lat": 44.862, "lon": -0.550, "desc_ko": "보르도 와인 박물관", "desc_en": "Immersive wine museum."}
123
- ],
124
- "Germany 🇩🇪": [
125
- {"name": "Hofbräuhaus", "category": "Beer", "label": "🍺 Beer Hall", "lat": 48.137, "lon": 11.580, "desc_ko": "뮌헨 맥주홀", "desc_en": "World's famous beer hall."},
126
- {"name": "Weihenstephan", "category": "Beer", "label": "🍺 Oldest", "lat": 48.395, "lon": 11.729, "desc_ko": "세계 최고 양조장", "desc_en": "Oldest brewery."},
127
- {"name": "Paulaner", "category": "Beer", "label": "🍺 Brewery", "lat": 48.121, "lon": 11.582, "desc_ko": "뮌헨 대표 밀맥주", "desc_en": "Famous Munich brewery."},
128
- {"name": "Schloss Johannisberg", "category": "Wine", "label": "🍷 Riesling", "lat": 50.003, "lon": 7.986, "desc_ko": "리슬링의 발상지", "desc_en": "First Riesling winery."}
129
- ],
130
- "Belgium 🇧🇪": [
131
- {"name": "Cantillon", "category": "Beer", "label": "🍺 Lambic", "lat": 50.841, "lon": 4.335, "desc_ko": "자연 발효 람빅", "desc_en": "Traditional lambic brewery."},
132
- {"name": "Westvleteren", "category": "Beer", "label": "🍺 Trappist", "lat": 50.896, "lon": 2.720, "desc_ko": "수도원 맥주", "desc_en": "Best beer in the world."},
133
- {"name": "Delirium Café", "category": "Bar", "label": "🍺 Pub", "lat": 50.848, "lon": 4.354, "desc_ko": "2000종 이상의 맥주", "desc_en": "2000+ beers on menu."}
134
- ],
135
- "Italy 🇮🇹": [
136
- {"name": "Antinori", "category": "Wine", "label": "🍷 Tuscany", "lat": 43.616, "lon": 11.196, "desc_ko": "토스카나 걸작", "desc_en": "Architectural masterpiece."},
137
- {"name": "Poli Grappa", "category": "Spirits", "label": "🏛️ Grappa", "lat": 45.679, "lon": 11.638, "desc_ko": "그라파 박물관", "desc_en": "Museum of Grappa."},
138
- {"name": "Casa Martini", "category": "Spirits", "label": "🍸 Vermouth", "lat": 44.968, "lon": 7.769, "desc_ko": "마티니의 고향", "desc_en": "Home of Martini & Rossi."}
139
- ],
140
- "Spain 🇪🇸": [
141
- {"name": "Marqués de Riscal", "category": "Wine", "label": "🍷 Rioja", "lat": 42.511, "lon": -2.622, "desc_ko": "리오하 ��드마크", "desc_en": "Architectural wonder."},
142
- {"name": "Tio Pepe", "category": "Wine", "label": "🍷 Sherry", "lat": 36.681, "lon": -6.141, "desc_ko": "셰리의 대명사", "desc_en": "Famous Sherry winery."},
143
- {"name": "Estrella Damm", "category": "Beer", "label": "🍺 Barcelona", "lat": 41.319, "lon": 2.093, "desc_ko": "바르셀로나 맥주", "desc_en": "The beer of Barcelona."}
144
- ],
145
- "Taiwan 🇹🇼": [
146
- {"name": "Kavalan", "category": "Whiskey", "label": "🏭 World Class", "lat": 24.711, "lon": 121.691, "desc_ko": "대만의 자존심, 카발란", "desc_en": "World-class Taiwanese whisky."},
147
- {"name": "Nantou (Omar)", "category": "Whiskey", "label": "🏭 Fruit Cask", "lat": 23.931, "lon": 120.675, "desc_ko": "과일향 가득한 오마르", "desc_en": "Famous for fruit liqueur finish."},
148
- {"name": "Draft Land", "category": "Bar", "label": "🍸 Cocktail", "lat": 25.042, "lon": 121.548, "desc_ko": "탭 칵테일 바", "desc_en": "Cocktails on tap."}
149
- ],
150
- "Russia 🇷🇺": [
151
- {"name": "Russian Vodka Museum", "category": "Spirits", "label": "🏛️ Vodka", "lat": 59.932, "lon": 30.298, "desc_ko": "상트페테르부르크 보드카 박물관", "desc_en": "Museum of Russian Vodka."},
152
- {"name": "Cristall Distillery", "category": "Spirits", "label": "🏭 Historic", "lat": 55.757, "lon": 37.678, "desc_ko": "모스크바 전설의 공장", "desc_en": "Legendary Moscow distillery."},
153
- {"name": "El Copitas", "category": "Bar", "label": "🍸 Bar", "lat": 59.928, "lon": 30.346, "desc_ko": "숨겨진 멕시칸 바", "desc_en": "Hidden gem bar."}
154
- ],
155
- "Poland 🇵🇱": [
156
- {"name": "Polish Vodka Museum", "category": "Spirits", "label": "🏛️ Heritage", "lat": 52.253, "lon": 21.041, "desc_ko": "폴란드 보드카 박물관", "desc_en": "Polish vodka heritage."},
157
- {"name": "Chopin Distillery", "category": "Spirits", "label": "🏭 Potato", "lat": 52.197, "lon": 22.315, "desc_ko": "감자 보드카 명가", "desc_en": "Famous potato vodka."}
158
- ],
159
- "Finland 🇫🇮": [
160
- {"name": "Kyrö Distillery", "category": "Whiskey", "label": "🏭 Rye", "lat": 62.973, "lon": 22.353, "desc_ko": "100% 호밀 위스키", "desc_en": "All-rye distillery."}
161
- ],
162
- "Mexico 🇲🇽": [
163
- {"name": "Mundo Cuervo", "category": "Spirits", "label": "🏭 Tequila", "lat": 20.878, "lon": -103.836, "desc_ko": "데킬라의 역사", "desc_en": "Oldest distillery."},
164
- {"name": "Los Danzantes", "category": "Spirits", "label": "🏭 Mezcal", "lat": 16.903, "lon": -96.423, "desc_ko": "오악사카 메스칼", "desc_en": "Artisanal Mezcal."},
165
- {"name": "Museo del Pulque", "category": "Traditional", "label": "🌵 Pulque", "lat": 19.437, "lon": -99.140, "desc_ko": "신들의 음료 풀케", "desc_en": "Museum of Pulque."}
166
- ],
167
- "Brazil 🇧🇷": [
168
- {"name": "Weber Haus", "category": "Spirits", "label": "🍹 Cachaça", "lat": -29.567, "lon": -51.272, "desc_ko": "카샤사 명가", "desc_en": "Artisanal Cachaça."},
169
- {"name": "Cervejaria Colorado", "category": "Beer", "label": "🍺 Craft", "lat": -21.170, "lon": -47.810, "desc_ko": "브라질 크래프트 맥주", "desc_en": "Brazilian craft beer."}
170
- ],
171
- "Peru 🇵🇪": [
172
- {"name": "Hacienda La Caravedo", "category": "Spirits", "label": "🍇 Pisco", "lat": -14.005, "lon": -75.762, "desc_ko": "남미 최고 피스코 양조장", "desc_en": "Oldest distillery in Americas."}
173
- ],
174
- "Argentina 🇦🇷": [
175
- {"name": "Catena Zapata", "category": "Wine", "label": "🍷 Malbec", "lat": -33.155, "lon": -68.929, "desc_ko": "멘도사 와인 상징", "desc_en": "Icon of Argentine Malbec."}
176
- ],
177
- "Canada 🇨🇦": [
178
- {"name": "Canadian Club", "category": "Whiskey", "label": "🏭 Historic", "lat": 42.324, "lon": -83.013, "desc_ko": "알 카포네의 위스키", "desc_en": "Historic Canadian whisky."}
179
- ],
180
- "India 🇮🇳": [
181
- {"name": "Amrut", "category": "Whiskey", "label": "🏭 Single Malt", "lat": 12.868, "lon": 77.447, "desc_ko": "인도 위스키 세계화", "desc_en": "Pioneer of Indian single malt."},
182
- {"name": "Cazulo Feni", "category": "Traditional", "label": "🥥 Heritage", "lat": 15.345, "lon": 73.921, "desc_ko": "고아 전통주 '페니' 체험", "desc_en": "Heritage Feni tour in Goa."}
183
- ],
184
- "Thailand 🇹🇭": [
185
- {"name": "Chalong Bay", "category": "Spirits", "label": "🍹 Rum", "lat": 7.832, "lon": 98.349, "desc_ko": "푸켓 사탕수수 럼", "desc_en": "Phuket sugarcane rum."},
186
- {"name": "Tep Bar", "category": "Bar", "label": "🍶 Thai", "lat": 13.740, "lon": 100.514, "desc_ko": "태국 전통주 야동", "desc_en": "Thai herbal liquor."}
187
- ],
188
- "Vietnam 🇻🇳": [
189
- {"name": "Pasteur Street", "category": "Beer", "label": "🍺 Craft", "lat": 10.777, "lon": 106.703, "desc_ko": "베트남 크래프트 맥주", "desc_en": "Original craft brewery."},
190
- {"name": "Le Mat Snake", "category": "Traditional", "label": "🐍 Snake", "lat": 21.042, "lon": 105.896, "desc_ko": "하노이 뱀 술 마을", "desc_en": "Snake wine village."}
191
- ],
192
- "Malaysia 🇲🇾": [
193
- {"name": "The Old Tuak House", "category": "Traditional", "label": "🍶 Tribal", "lat": 3.147, "lon": 101.708, "desc_ko": "보르네오 전통주 투악", "desc_en": "Authentic Borneo rice wine."},
194
- {"name": "Bar Trigona", "category": "Bar", "label": "🍸 Best Bar", "lat": 3.155, "lon": 101.714, "desc_ko": "아시아 베스트, 토종 꿀", "desc_en": "Asia's 50 Best."}
195
- ],
196
- "Singapore 🇸🇬": [
197
- {"name": "Long Bar", "category": "Bar", "label": "🍸 Historic", "lat": 1.294, "lon": 103.854, "desc_ko": "싱가포르 슬링 탄생지", "desc_en": "Birthplace of Singapore Sling."},
198
- {"name": "Atlas", "category": "Bar", "label": "🍸 Gin", "lat": 1.300, "lon": 103.858, "desc_ko": "세계 최대 진 컬렉션", "desc_en": "World's largest gin collection."}
199
- ],
200
- "Mongolia 🇲🇳": [
201
- {"name": "Genghis Khan", "category": "Traditional", "label": "🐎 Airag", "lat": 47.858, "lon": 107.595, "desc_ko": "초원의 마유주 체험", "desc_en": "Experience Airag."}
202
- ],
203
- "Ethiopia 🇪🇹": [
204
- {"name": "Yod Abyssinia", "category": "Traditional", "label": "🍯 Tej", "lat": 8.995, "lon": 38.770, "desc_ko": "벌꿀술 테지", "desc_en": "Honey Wine Tej."}
205
- ],
206
- "Georgia 🇬🇪": [
207
- {"name": "Pheasant's Tears", "category": "Wine", "label": "🏺 Qvevri", "lat": 41.621, "lon": 45.922, "desc_ko": "8000년 항아리 와인", "desc_en": "Ancient Qvevri wine."}
208
- ]
209
- }
210
 
 
211
  db_json = json.dumps(PLACE_DB)
212
 
213
- # 4. HTML/JS 전체 코드
214
  html_code = f"""
215
  <!DOCTYPE html>
216
  <html>
@@ -274,6 +89,7 @@ html_code = f"""
274
  .report-meta {{ font-size: 12px; color: #666; margin-bottom: 20px; border-bottom: 1px solid #333; padding-bottom: 15px; }}
275
  .ai-content {{ font-size: 15px; color: #ddd; line-height: 1.8; white-space: pre-wrap; }}
276
  .gmap-btn {{ display: block; width: 90%; margin: 0 auto; padding: 15px 0; background: var(--gold); color: black; text-align: center; font-weight: bold; text-decoration: none; border-radius: 30px; position: fixed; bottom: 20px; left: 5%; z-index: 7000; }}
 
277
 
278
  .loading-screen {{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.9); z-index: 8000; display: none; flex-direction: column; justify-content: center; align-items: center; }}
279
  .loader-ring {{ width: 40px; height: 40px; border: 3px solid #333; border-top: 3px solid var(--gold); border-radius: 50%; animation: spin 1s linear infinite; margin-bottom: 15px; }}
@@ -347,8 +163,9 @@ html_code = f"""
347
  "subtitle": "글로벌 주류 헤리티지 투어",
348
  "filters": {{ "All": "전체", "Whiskey": "위스키", "Spirits": "증류주", "Beer": "맥주", "Wine": "와인", "Traditional": "전통주/토속주", "Bar": "바/펍" }},
349
  "report_header": "여행 리포트",
350
- "loader": "Puter AI가 3줄 요약 중...",
351
  "gmap": "구글맵에서 길찾기",
 
352
  "cta": "AI 리뷰 보기 →",
353
  "ai_error": "AI 연결 불가. 오프라인 정보로 대체합니다."
354
  }},
@@ -358,6 +175,7 @@ html_code = f"""
358
  "report_header": "TRAVEL REPORT",
359
  "loader": "Puter AI is summarizing...",
360
  "gmap": "Open in Google Maps",
 
361
  "cta": "Read Review →",
362
  "ai_error": "AI connection failed. Running offline mode."
363
  }},
@@ -367,6 +185,7 @@ html_code = f"""
367
  "report_header": "旅行レポート",
368
  "loader": "AIが要約中...",
369
  "gmap": "Googleマップで開く",
 
370
  "cta": "レビューを見る →",
371
  "ai_error": "オフラインモードで実行します。"
372
  }},
@@ -376,6 +195,7 @@ html_code = f"""
376
  "report_header": "旅游报告",
377
  "loader": "AI正在总结...",
378
  "gmap": "在谷歌地图中打开",
 
379
  "cta": "查看评论 →",
380
  "ai_error": "以离线模式运行。"
381
  }}
@@ -404,7 +224,6 @@ html_code = f"""
404
  document.getElementById('app-subtitle').innerText = t.subtitle;
405
  document.getElementById('report-header').innerText = t.report_header;
406
  document.getElementById('loader-msg').innerHTML = t.loader;
407
- document.getElementById('gmap-link').innerText = t.gmap;
408
 
409
  document.getElementById('filter-all').innerText = `🌐 ${{t.filters.All}}`;
410
  document.getElementById('filter-whiskey').innerText = `🥃 ${{t.filters.Whiskey}}`;
@@ -480,9 +299,20 @@ html_code = f"""
480
  document.getElementById('repo-title').innerText = place.name;
481
  document.getElementById('repo-meta').innerText = `${{place.label}} • ${{selectedCountry}}`;
482
 
483
- // 🔥 Google Map Smart Search
484
- const query = encodeURIComponent(place.name + " " + selectedCountry);
485
- document.getElementById('gmap-link').href = `https://www.google.com/maps/search/?api=1&query=${{query}}`;
 
 
 
 
 
 
 
 
 
 
 
486
 
487
  document.getElementById('repo-content').innerHTML = "";
488
 
@@ -562,7 +392,7 @@ html_code = f"""
562
 
563
  ${{dbDesc}}
564
 
565
- (Click the Google Maps button below to see the exact address and reviews.)
566
  `;
567
 
568
  const el = document.getElementById('repo-content');
 
1
  import streamlit as st
2
  import streamlit.components.v1 as components
3
  import json
4
+ import os
5
 
6
  # 1. 페이지 설정
7
  st.set_page_config(page_title="Drunken Plane", page_icon="✈️", layout="wide")
 
14
  </style>
15
  """, unsafe_allow_html=True)
16
 
17
+ # 2. 데이터 로드 (파일 분리)
18
+ try:
19
+ with open('places.json', 'r', encoding='utf-8') as f:
20
+ PLACE_DB = json.load(f)
21
+ except FileNotFoundError:
22
+ st.error("🚨 'places.json' 파일을 찾을 수 없습니다. 같은 폴더에 넣어주세요!")
23
+ st.stop()
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
+ # 데이터를 JSON 문자열로 변환 (자바스크립트용)
26
  db_json = json.dumps(PLACE_DB)
27
 
28
+ # 4. HTML/JS 전체 코드 (Puter.js 엔진 탑재)
29
  html_code = f"""
30
  <!DOCTYPE html>
31
  <html>
 
89
  .report-meta {{ font-size: 12px; color: #666; margin-bottom: 20px; border-bottom: 1px solid #333; padding-bottom: 15px; }}
90
  .ai-content {{ font-size: 15px; color: #ddd; line-height: 1.8; white-space: pre-wrap; }}
91
  .gmap-btn {{ display: block; width: 90%; margin: 0 auto; padding: 15px 0; background: var(--gold); color: black; text-align: center; font-weight: bold; text-decoration: none; border-radius: 30px; position: fixed; bottom: 20px; left: 5%; z-index: 7000; }}
92
+ .gmap-btn.naver {{ background: #03C75A !important; color: white !important; }}
93
 
94
  .loading-screen {{ position: absolute; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.9); z-index: 8000; display: none; flex-direction: column; justify-content: center; align-items: center; }}
95
  .loader-ring {{ width: 40px; height: 40px; border: 3px solid #333; border-top: 3px solid var(--gold); border-radius: 50%; animation: spin 1s linear infinite; margin-bottom: 15px; }}
 
163
  "subtitle": "글로벌 주류 헤리티지 투어",
164
  "filters": {{ "All": "전체", "Whiskey": "위스키", "Spirits": "증류주", "Beer": "맥주", "Wine": "와인", "Traditional": "전통주/토속주", "Bar": "바/펍" }},
165
  "report_header": "여행 리포트",
166
+ "loader": "Puter AI가 리포트를<br>작성하고 있습니다...",
167
  "gmap": "구글맵에서 길찾기",
168
+ "nmap": "네이버 지도에서 길찾기",
169
  "cta": "AI 리뷰 보기 →",
170
  "ai_error": "AI 연결 불가. 오프라인 정보로 대체합니다."
171
  }},
 
175
  "report_header": "TRAVEL REPORT",
176
  "loader": "Puter AI is summarizing...",
177
  "gmap": "Open in Google Maps",
178
+ "nmap": "Open in Naver Map",
179
  "cta": "Read Review →",
180
  "ai_error": "AI connection failed. Running offline mode."
181
  }},
 
185
  "report_header": "旅行レポート",
186
  "loader": "AIが要約中...",
187
  "gmap": "Googleマップで開く",
188
+ "nmap": "Naverマップで開く",
189
  "cta": "レビューを見る →",
190
  "ai_error": "オフラインモードで実行します。"
191
  }},
 
195
  "report_header": "旅游报告",
196
  "loader": "AI正在总结...",
197
  "gmap": "在谷歌地图中打开",
198
+ "nmap": "在Naver地图中打开",
199
  "cta": "查看评论 →",
200
  "ai_error": "以离线模式运行。"
201
  }}
 
224
  document.getElementById('app-subtitle').innerText = t.subtitle;
225
  document.getElementById('report-header').innerText = t.report_header;
226
  document.getElementById('loader-msg').innerHTML = t.loader;
 
227
 
228
  document.getElementById('filter-all').innerText = `🌐 ${{t.filters.All}}`;
229
  document.getElementById('filter-whiskey').innerText = `🥃 ${{t.filters.Whiskey}}`;
 
299
  document.getElementById('repo-title').innerText = place.name;
300
  document.getElementById('repo-meta').innerText = `${{place.label}} • ${{selectedCountry}}`;
301
 
302
+ // 🔥 Map Logic: Korea -> Naver, Others -> Google
303
+ const btn = document.getElementById('gmap-link');
304
+ const isKorea = selectedCountry.includes("Korea");
305
+ const query = encodeURIComponent(place.name);
306
+
307
+ if (isKorea) {{
308
+ btn.innerText = TRANSLATIONS[currentLang].nmap;
309
+ btn.classList.add("naver");
310
+ btn.href = `https://map.naver.com/v5/search/${{query}}`;
311
+ }} else {{
312
+ btn.innerText = TRANSLATIONS[currentLang].gmap;
313
+ btn.classList.remove("naver");
314
+ btn.href = `https://www.google.com/maps/search/?api=1&query=$${{query}}%20${{selectedCountry}}`;
315
+ }}
316
 
317
  document.getElementById('repo-content').innerHTML = "";
318
 
 
392
 
393
  ${{dbDesc}}
394
 
395
+ (Click the Map button below for details.)
396
  `;
397
 
398
  const el = document.getElementById('repo-content');