benjamin5607 commited on
Commit
069911e
ยท
verified ยท
1 Parent(s): 38b7c9d

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +77 -153
app.py CHANGED
@@ -7,7 +7,7 @@ try:
7
  token = st.secrets["HF_TOKEN"]
8
  except:
9
  token = ""
10
- st.error("Settings์—์„œ 'HF_TOKEN'์„ ๋จผ์ € ์„ค์ •ํ•ด์ฃผ์„ธ์š”!")
11
 
12
  # 2. ํŽ˜์ด์ง€ ์„ค์ •
13
  st.set_page_config(page_title="Drunken Plane", page_icon="โœˆ๏ธ", layout="wide")
@@ -21,161 +21,60 @@ st.markdown("""
21
  """, unsafe_allow_html=True)
22
 
23
  # ---------------------------------------------------------
24
- # ๐Ÿ’พ GLOBAL ALCOHOL HERITAGE DATABASE (V21.0: Nordic & Global Deep Dive)
25
  # ---------------------------------------------------------
 
 
 
 
26
  PLACE_DB = {
27
  "South Korea ๐Ÿ‡ฐ๐Ÿ‡ท": [
28
- {"name": "Hwayo Distillery", "category": "Spirits", "label": "๐Ÿญ Premium Soju", "lat": 37.294, "lon": 127.632, "desc_ko": "ํ•œ๊ตญ ํ”„๋ฆฌ๋ฏธ์—„ ์†Œ์ฃผ 'ํ™”์š”'์˜ ๋ณธ์‚ฐ", "desc_en": "Home of Hwayo, Korea's premium soju."},
29
- {"name": "Andong Soju Museum", "category": "Traditional", "label": "๐Ÿถ Heritage", "lat": 36.568, "lon": 128.729, "desc_ko": "๋ช…์ธ ๋ฐ•์žฌ์„œ ์•ˆ๋™์†Œ์ฃผ ์ฒดํ—˜๊ด€", "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": "Jindo Hongju", "category": "Traditional", "label": "๐Ÿถ Red Spirit", "lat": 34.482, "lon": 126.261, "desc_ko": "์ง€์ดˆ๋กœ ๋ถ‰์€ ๋น›์„ ๋‚ธ ๊ณ ๋ ค์‹œ๋Œ€ ๋ช…์ฃผ", "desc_en": "Traditional red liquor from Jindo."},
32
- {"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."},
33
- {"name": "Hansan Sogokju", "category": "Traditional", "label": "๐Ÿถ Rice Wine", "lat": 36.066, "lon": 126.657, "desc_ko": "ํ•œ๋ฒˆ ์•‰์œผ๋ฉด ๋ชป ์ผ์–ด๋‚˜๋Š” ์•‰์€๋ฑ…์ด ์ˆ ", "desc_en": "Sogokju, known as 'cripple wine'."},
34
  {"name": "Boksoondoga", "category": "Traditional", "label": "๐Ÿถ Champagne Makgeolli", "lat": 35.539, "lon": 129.106, "desc_ko": "์†์œผ๋กœ ๋นš๋Š” ์ฒœ์—ฐ ํƒ„์‚ฐ ์ƒดํŽ˜์ธ ๋ง‰๊ฑธ๋ฆฌ", "desc_en": "Hand-brewed sparkling Makgeolli."},
35
- {"name": "Haechang Brewery", "category": "Traditional", "label": "๐Ÿถ Premium Makgeolli", "lat": 34.428, "lon": 126.588, "desc_ko": "๊ฑธ์ญ‰ํ•จ์˜ ๋ฏธํ•™, ํ•ด๋‚จ ํ•ด์ฐฝ ์ฃผ์กฐ์žฅ", "desc_en": "Premium thick Makgeolli brewery."},
36
- {"name": "Three Societies", "category": "Whiskey", "label": "๐Ÿญ Single Malt", "lat": 37.625, "lon": 127.189, "desc_ko": "ํ•œ๊ตญ ์ตœ์ดˆ ์‹ฑ๊ธ€๋ชฐํŠธ ์ฆ๋ฅ˜์†Œ '๊ธฐ์›'", "desc_en": "Korea's first single malt whisky distillery."},
37
- {"name": "Kimchangsoo Whisky", "category": "Whiskey", "label": "๐Ÿญ Craft Whisky", "lat": 37.660, "lon": 126.770, "desc_ko": "๊น€์ฐฝ์ˆ˜ ๋ช…์ธ์˜ ํ•œ๊ตญ ์ •ํ†ต ์œ„์Šคํ‚ค", "desc_en": "Authentic whisky made by Kim Chang-soo."},
38
- {"name": "Cheongdo Wine Tunnel", "category": "Wine", "label": "๐Ÿท Persimmon", "lat": 35.617, "lon": 128.734, "desc_ko": "ํ„ฐ๋„์—์„œ ์ˆ™์„ฑ๋˜๋Š” ๊ฐ ์™€์ธ", "desc_en": "Persimmon wine aged in a railroad tunnel."},
39
- {"name": "Gochang Seonun", "category": "Wine", "label": "๐Ÿท Bokbunja", "lat": 35.483, "lon": 126.583, "desc_ko": "๊ณ ์ฐฝ ๋ณต๋ถ„์ž์ฃผ(๋ธ”๋ž™ ๋ผ์ฆˆ๋ฒ ๋ฆฌ) ํŠน๊ตฌ", "desc_en": "Famous for Bokbunja wine."},
40
- {"name": "Zest", "category": "Bar", "label": "๐Ÿธ World's Best", "lat": 37.526, "lon": 127.040, "desc_ko": "์•„์‹œ์•„ ๋ฒ ์ŠคํŠธ ๋ฐ” 2์œ„, ์ œ๋กœ์›จ์ด์ŠคํŠธ", "desc_en": "Asia's leading zero-waste bar."},
41
- {"name": "Bar Cham", "category": "Bar", "label": "๐Ÿธ Hanok Bar", "lat": 37.578, "lon": 126.970, "desc_ko": "์„œ์ดŒ ํ•œ์˜ฅ์—์„œ ์ฆ๊ธฐ๋Š” ์ „ํ†ต์ฃผ ์นตํ…Œ์ผ", "desc_en": "Cocktails in a traditional Hanok."},
42
- {"name": "Magpie Brewing", "category": "Beer", "label": "๐Ÿบ Craft", "lat": 33.523, "lon": 126.559, "desc_ko": "์ œ์ฃผ์˜ ํž™ํ•œ ๊ฐ์„ฑ, ๋งฅํŒŒ์ด", "desc_en": "Jeju's hippest craft beer brewery."}
43
- ],
44
-
45
- "Sweden ๐Ÿ‡ธ๐Ÿ‡ช": [
46
- {"name": "O.P. Anderson Distillery", "category": "Traditional", "label": "๐Ÿฅ” Aquavit", "lat": 62.336, "lon": 17.039, "desc_ko": "์Šค์›จ๋ด ์•„์ฟ ์•„๋น„ํŠธ์˜ ์ œ์™•, O.P. ์•ค๋”์Šจ (๋ง›ํฌ์Šค)", "desc_en": "The King of Swedish Aquavit."},
47
- {"name": "Absolut Home", "category": "Spirits", "label": "๐Ÿญ Vodka Icon", "lat": 55.923, "lon": 14.294, "desc_ko": "์•ฑ์†”๋ฃจํŠธ ๋ณด๋“œ์นด์˜ ๊ณ ํ–ฅ ์˜คํ›„์Šค(ร…hus)", "desc_en": "The spiritual home of Absolut Vodka."},
48
- {"name": "Mackmyra Whisky Village", "category": "Whiskey", "label": "๐Ÿญ Gravity", "lat": 60.638, "lon": 17.037, "desc_ko": "์ค‘๋ ฅ์„ ์ด์šฉํ•œ ์„ธ๊ณ„ ์ตœ์ดˆ์˜ ์นœํ™˜๊ฒฝ ์ฆ๋ฅ˜์†Œ", "desc_en": "Gravity distillery pioneer of Swedish whisky."},
49
- {"name": "Hernรถ Gin Distillery", "category": "Spirits", "label": "๐Ÿธ Best Gin", "lat": 62.684, "lon": 17.794, "desc_ko": "์„ธ๊ณ„์—์„œ ๊ฐ€์žฅ ์ƒ์„ ๋งŽ์ด ๋ฐ›์€ ์ง„ ์ฆ๋ฅ˜์†Œ", "desc_en": "Most awarded gin in Europe."},
50
- {"name": "Spritmuseum", "category": "Traditional", "label": "๐Ÿ›๏ธ Museum", "lat": 59.325, "lon": 18.096, "desc_ko": "์Šคํ†กํ™€๋ฆ„์˜ ์ˆ  ๋ฐ•๋ฌผ๊ด€ ๋ฐ ์‹œ์Œ์žฅ", "desc_en": "Museum of spirits and Absolut Art Collection."},
51
- {"name": "Akkurat", "category": "Bar", "label": "๐Ÿบ Beer Heaven", "lat": 59.319, "lon": 18.070, "desc_ko": "์ „ ์„ธ๊ณ„ ๋งฅ์ฃผ ๋•ํ›„๋“ค์˜ ์„ฑ์ง€, ๋นˆํ‹ฐ์ง€ ๋งฅ์ฃผ", "desc_en": "World-famous beer bar with vintage collection."},
52
- {"name": "Omnipollo's Hatt", "category": "Bar", "label": "๐Ÿบ Craft Pizza", "lat": 59.317, "lon": 18.071, "desc_ko": "์˜ด๋‹ˆํด๋กœ์˜ ํž™ํ•œ ๋งฅ์ฃผ์™€ ํ”ผ์ž", "desc_en": "Hip craft beer spot by Omnipollo."},
53
- {"name": "High Coast Distillery", "category": "Whiskey", "label": "๐Ÿญ Northern", "lat": 62.983, "lon": 17.817, "desc_ko": "๋ถ์œ„ 63๋„, ์˜น๋‹ฌ์ƒ˜ ๋ฌผ๋กœ ๋งŒ๋“œ๋Š” ์œ„์Šคํ‚ค", "desc_en": "Whisky from the High Coast of Sweden."}
54
- ],
55
-
56
- "Norway ๐Ÿ‡ณ๐Ÿ‡ด": [
57
- {"name": "Lรธiten Brรฆnderi", "category": "Traditional", "label": "๐Ÿฅ” Aquavit History", "lat": 60.821, "lon": 11.343, "desc_ko": "๋…ธ๋ฅด์›จ์ด ์•„์ฟ ์•„๋น„ํŠธ์˜ ์—ญ์‚ฌ ์—ฐ๊ทน ์ฒดํ—˜", "desc_en": "Historical site of Norwegian Aquavit."},
58
- {"name": "Arcus (Linie Aquavit)", "category": "Traditional", "label": "๐Ÿšข Equator Aged", "lat": 59.970, "lon": 10.930, "desc_ko": "์ ๋„๋ฅผ ๋‘ ๋ฒˆ ํ†ต๊ณผํ•ด ์ˆ™์„ฑ์‹œํ‚ค๋Š” '๋ฆฌ๋‹ˆ์—' ์•„์ฟ ์•„๋น„ํŠธ", "desc_en": "Aquavit aged at sea, crossing the equator twice."},
59
- {"name": "Himkok", "category": "Bar", "label": "๐Ÿธ Distillery Bar", "lat": 59.916, "lon": 10.750, "desc_ko": "์ž์ฒด ์ฆ๋ฅ˜ ์•„์ฟ ์•„๋น„ํŠธ๋ฅผ ํŒŒ๋Š” ์˜ค์Šฌ๋กœ ์ตœ๊ณ ์˜ ๋ฐ”", "desc_en": "In-house distillery producing Aquavit and Gin."},
60
- {"name": "Aurora Spirit", "category": "Whiskey", "label": "๐Ÿญ Arctic", "lat": 69.619, "lon": 20.272, "desc_ko": "์˜ค๋กœ๋ผ ์•„๋ž˜ ์„ธ๊ณ„ ์ตœ๋ถ๋‹จ ์ฆ๋ฅ˜์†Œ (๋น„๋ธŒ๋ผํ† )", "desc_en": "The northernmost distillery in the world."},
61
- {"name": "Nรธgne ร˜", "category": "Beer", "label": "๐Ÿบ Craft Legend", "lat": 58.398, "lon": 8.643, "desc_ko": "์œ ๋Ÿฝ ํฌ๋ž˜ํ”„ํŠธ ๋งฅ์ฃผ์˜ ์ „์„ค, ๋‡Œ๊ทธ๋„ค", "desc_en": "Legendary Norwegian craft brewery."},
62
- {"name": "ร†gir Bryggeri", "category": "Beer", "label": "๐Ÿบ Viking Style", "lat": 60.863, "lon": 7.114, "desc_ko": "์†ก๋„ค ํ”ผ์š”๋ฅด๋“œ ์ ˆ๊ฒฝ ์† ๋ฐ”์ดํ‚น ์Šคํƒ€์ผ ์–‘์กฐ์žฅ", "desc_en": "Viking style brewery in Flรฅm."},
63
- {"name": "Bareksten Spirits", "category": "Spirits", "label": "๐Ÿธ Dark Gin", "lat": 60.330, "lon": 5.268, "desc_ko": "๋…ธ๋ฅด์›จ์ด ์ˆฒ์˜ ์ •๋ น์„ ๋‹ด์€ ๋ฐ”๋ ‰์Šคํ… ์ง„", "desc_en": "Botanical gin capturing the essence of Norway."}
64
- ],
65
-
66
- "Japan ๐Ÿ‡ฏ๐Ÿ‡ต": [
67
- {"name": "Suntory Yamazaki", "category": "Whiskey", "label": "๐Ÿญ Legend", "lat": 34.892, "lon": 135.674, "desc_ko": "์ผ๋ณธ ์œ„์Šคํ‚ค์˜ ์„ฑ์ง€, ์•ผ๋งˆ์žํ‚ค", "desc_en": "Birthplace of Japanese whisky."},
68
- {"name": "Suntory Hakushu", "category": "Whiskey", "label": "๐Ÿญ Forest", "lat": 35.807, "lon": 138.303, "desc_ko": "์ˆฒ์†์˜ ์ฆ๋ฅ˜์†Œ, ์ฒญ๋Ÿ‰ํ•œ ํ•˜์ฟ ์Šˆ", "desc_en": "The distillery in the forest."},
69
- {"name": "Nikka Yoichi", "category": "Whiskey", "label": "๐Ÿญ Hokkaido", "lat": 43.186, "lon": 140.798, "desc_ko": "ํƒ€์ผ€์ธ ๋ฃจ์˜ ๊ฟˆ, ํ™‹์นด์ด๋„ ์š”์ด์น˜", "desc_en": "Masataka Taketsuru's dream."},
70
- {"name": "Chichibu Distillery", "category": "Whiskey", "label": "๐Ÿญ Craft God", "lat": 36.026, "lon": 139.055, "desc_ko": "์ด์น˜๋กœ์Šค ๋ชฐํŠธ, ์ผ๋ณธ ํฌ๋ž˜ํ”„ํŠธ์˜ ์‹ ํ™”", "desc_en": "Home of Ichiro's Malt."},
71
- {"name": "Dassai Sake Brewery", "category": "Traditional", "label": "๐Ÿถ Premium Sake", "lat": 34.120, "lon": 132.029, "desc_ko": "์•„๋ฒ  ์ด๋ฆฌ๊ฐ€ ์˜ค๋ฐ”๋งˆ์—๊ฒŒ ์„ ๋ฌผํ•œ ๋‹ท์‚ฌ์ด", "desc_en": "Famous Dassai Sake brewery."},
72
- {"name": "Kubota (Asahi Shuzo)", "category": "Traditional", "label": "๐Ÿถ Niigata", "lat": 37.387, "lon": 138.822, "desc_ko": "๋‹ˆ๊ฐ€ํƒ€์˜ ๋ˆˆ๊ณผ ์Œ€๋กœ ๋นš๋Š” ๊ตฌ๋ณดํƒ€", "desc_en": "Producer of Kubota Sake."},
73
- {"name": "Hakkaisan", "category": "Traditional", "label": "๐Ÿถ Snow Aged", "lat": 37.100, "lon": 138.930, "desc_ko": "๋ˆˆ ์ €์žฅ๊ณ ์—์„œ ์ˆ™์„ฑํ•˜๋Š” ํ•ซ์นด์ด์‚ฐ", "desc_en": "Famous for snow-aged sake."},
74
- {"name": "Ki No Bi Kyoto", "category": "Spirits", "label": "๐Ÿธ Craft Gin", "lat": 34.969, "lon": 135.756, "desc_ko": "๊ตํ† ์˜ ์‹๋ฌผ๋กœ ๋งŒ๋“œ๋Š” ํฌ๋ž˜ํ”„ํŠธ ์ง„", "desc_en": "Kyoto's dry gin distillery."},
75
- {"name": "Bar High Five", "category": "Bar", "label": "๐Ÿธ Ginza Legend", "lat": 35.671, "lon": 139.764, "desc_ko": "๊ธด์ž์˜ ์‚ด์•„์žˆ๋Š” ์ „์„ค, ์šฐ์—๋…ธ ํžˆ๋ฐ์ธ ๊ตฌ์˜ ๋ฐ”", "desc_en": "Legendary bar in Ginza."},
76
- {"name": "Sapporo Beer Museum", "category": "Beer", "label": "๐Ÿ›๏ธ Museum", "lat": 43.071, "lon": 141.369, "desc_ko": "์‚ฟํฌ๋กœ ๋งฅ์ฃผ์˜ ์ƒ์ง•, ๋ถ‰์€ ๋ฒฝ๋Œ", "desc_en": "Historic beer museum."}
77
- ],
78
-
79
- "USA ๐Ÿ‡บ๐Ÿ‡ธ": [
80
- {"name": "Jack Daniel's", "category": "Whiskey", "label": "๐Ÿญ Tennessee", "lat": 35.284, "lon": -86.368, "desc_ko": "๋ฏธ๊ตญ ์œ„์Šคํ‚ค์˜ ์ž์กด์‹ฌ", "desc_en": "World's best selling American whiskey."},
81
- {"name": "Buffalo Trace", "category": "Whiskey", "label": "๐Ÿญ Bourbon", "lat": 38.217, "lon": -84.870, "desc_ko": "๋ฒ„๋ฒˆ ์œ„์Šคํ‚ค์˜ ์ „์„ค", "desc_en": "World's most award-winning distillery."},
82
- {"name": "St. George Spirits", "category": "Spirits", "label": "๐Ÿธ Craft Pioneer", "lat": 37.780, "lon": -122.310, "desc_ko": "๋ฏธ๊ตญ ํฌ๋ž˜ํ”„ํŠธ ์ฆ๋ฅ˜์˜ ์„ ๊ตฌ์ž (์ƒŒํ”„๋ž€์‹œ์Šค์ฝ”)", "desc_en": "America's first craft distillery."},
83
- {"name": "Westland Distillery", "category": "Whiskey", "label": "๐Ÿญ Single Malt", "lat": 47.580, "lon": -122.336, "desc_ko": "์‹œ์• ํ‹€์˜ ๋ฏธ๊ตญ์‹ ์‹ฑ๊ธ€๋ชฐํŠธ ์œ„์Šคํ‚ค", "desc_en": "American Single Malt pioneer."},
84
- {"name": "WhistlePig", "category": "Whiskey", "label": "๐Ÿญ Rye", "lat": 43.916, "lon": -73.237, "desc_ko": "๋ฒ„๋ชฌํŠธ ๋†์žฅ์—์„œ ๋งŒ๋“œ๋Š” ํ”„๋ฆฌ๋ฏธ์—„ ๋ผ์ด ์œ„์Šคํ‚ค", "desc_en": "Premium Rye Whiskey farm."},
85
- {"name": "Robert Mondavi", "category": "Wine", "label": "๐Ÿท Napa", "lat": 38.427, "lon": -122.404, "desc_ko": "๋‚˜ํŒŒ ๋ฐธ๋ฆฌ ์™€์ธ์˜ ์•„๋ฒ„์ง€", "desc_en": "Soul of Napa Valley fine wine."},
86
- {"name": "Opus One", "category": "Wine", "label": "๐Ÿท Cult", "lat": 38.428, "lon": -122.409, "desc_ko": "๋ฏธ๊ตญ ์ปฌํŠธ ์™€์ธ์˜ ์ •์ ", "desc_en": "Ultra-premium winery."},
87
- {"name": "Russian River", "category": "Beer", "label": "๐Ÿบ Pliny", "lat": 38.441, "lon": -122.711, "desc_ko": "์ „์„ค์˜ IPA 'ํ”Œ๋ผ์ด๋‹ˆ ๋”” ์—˜๋”'", "desc_en": "Home of Pliny the Elder."},
88
- {"name": "The Dead Rabbit", "category": "Bar", "label": "๐Ÿธ NYC Icon", "lat": 40.703, "lon": -74.011, "desc_ko": "๋‰ด์š• ์ตœ๊ณ ์˜ ์•„์ด๋ฆฌ์‰ฌ ์นตํ…Œ์ผ ํŽ", "desc_en": "World's best bar winner."},
89
- {"name": "Smuggler's Cove", "category": "Bar", "label": "๐Ÿน Tiki", "lat": 37.779, "lon": -122.423, "desc_ko": "์ƒŒํ”„๋ž€์‹œ์Šค์ฝ”์˜ ์ „์„ค์ ์ธ ํ‹ฐํ‚ค ๋ฐ”", "desc_en": "Top-tier Tiki bar."}
90
  ],
91
-
92
  "Scotland ๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ": [
93
  {"name": "The Macallan", "category": "Whiskey", "label": "๐Ÿญ Speyside", "lat": 57.484, "lon": -3.206, "desc_ko": "์œ„์Šคํ‚ค์˜ ๋กค์Šค๋กœ์ด์Šค", "desc_en": "The Rolls-Royce of whisky."},
94
  {"name": "Laphroaig", "category": "Whiskey", "label": "๐Ÿญ Islay", "lat": 55.629, "lon": -6.153, "desc_ko": "ํ”ผํŠธ ํ–ฅ์˜ ์ •์ˆ˜", "desc_en": "Richly flavoured peaty whisky."},
95
- {"name": "Springbank", "category": "Whiskey", "label": "๐Ÿญ Campbeltown", "lat": 55.426, "lon": -5.606, "desc_ko": "์บ ๋ฒจํƒ€์šด์˜ ์ž์กด์‹ฌ, 100% ์ˆ˜์ œ ์œ„์Šคํ‚ค", "desc_en": "Handmade whisky from Campbeltown."},
96
  {"name": "Glenfiddich", "category": "Whiskey", "label": "๐Ÿญ Speyside", "lat": 57.454, "lon": -3.128, "desc_ko": "์„ธ๊ณ„ ํŒ๋งค 1์œ„ ์‹ฑ๊ธ€๋ชฐํŠธ", "desc_en": "World's most awarded single malt."},
97
  {"name": "Lagavulin", "category": "Whiskey", "label": "๐Ÿญ Islay", "lat": 55.635, "lon": -6.126, "desc_ko": "์Šค๋ชจํ‚ค์˜ ์ œ์™•", "desc_en": "The King of Islay."},
98
- {"name": "Ardbeg", "category": "Whiskey", "label": "๐Ÿญ Islay", "lat": 55.642, "lon": -6.112, "desc_ko": "๊ถ๊ทน์˜ ํ”ผํŠธ ๊ดด๋ฌผ", "desc_en": "The ultimate Islay malt."},
99
- {"name": "The Balvenie", "category": "Whiskey", "label": "๐Ÿญ Speyside", "lat": 57.455, "lon": -3.126, "desc_ko": "์ „ํ†ต ์ˆ˜์ œ ๋ฐฉ์‹ ์žฅ์ธ์ •์‹ ", "desc_en": "Dedicated to the traditional craft."},
100
- {"name": "Talisker", "category": "Whiskey", "label": "๐Ÿญ Skye", "lat": 57.302, "lon": -6.356, "desc_ko": "์Šค์นด์ด ์„ฌ์˜ ํ™”์‚ฐ ๊ฐ™์€ ๊ฐ•๋ ฌํ•จ", "desc_en": "Made by the sea on Isle of Skye."},
101
- {"name": "Highland Park", "category": "Whiskey", "label": "๐Ÿญ Orkney", "lat": 58.974, "lon": -2.953, "desc_ko": "๋ฐ”์ดํ‚น์˜ ํ˜ผ, ์ตœ๋ถ๋‹จ ์ฆ๋ฅ˜์†Œ", "desc_en": "The Viking soul of whisky."},
102
- {"name": "Bruichladdich", "category": "Whiskey", "label": "๐Ÿญ Islay", "lat": 55.766, "lon": -6.291, "desc_ko": "๊ฐ€์žฅ ์ง„๋ณด์ ์ธ ํ—ค๋ธŒ๋ฆฌ๋””์•ˆ ์œ„์Šคํ‚ค", "desc_en": "Progressive Hebridean Distillers."}
103
- ],
104
-
105
- "China ๐Ÿ‡จ๐Ÿ‡ณ": [
106
- {"name": "Kweichow Moutai", "category": "Traditional", "label": "๐Ÿถ National", "lat": 27.842, "lon": 106.378, "desc_ko": "์ค‘๊ตญ์˜ ๊ตญ์ฃผ ๋งˆ์˜คํƒ€์ด ์„ฑ์ง€", "desc_en": "Home of China's national liquor."},
107
- {"name": "Wuliangye", "category": "Traditional", "label": "๐Ÿถ Baijiu", "lat": 28.752, "lon": 104.607, "desc_ko": "์˜ค๊ณก์œผ๋กœ ๋นš์€ ๋†ํ–ฅํ˜• ๋ฐฑ์ฃผ์˜ ์™•", "desc_en": "King of strong-aroma baijiu."},
108
- {"name": "Fenjiu", "category": "Traditional", "label": "๐Ÿถ Light Aroma", "lat": 37.332, "lon": 111.758, "desc_ko": "์ฒญํ–ฅํ˜• ๋ฐฑ์ฃผ์˜ ๋Œ€ํ‘œ, ๋ถ„์ฃผ", "desc_en": "Representative of light-aroma baijiu."},
109
- {"name": "Xifengjiu", "category": "Traditional", "label": "๐Ÿถ Phoenix", "lat": 34.509, "lon": 107.385, "desc_ko": "๋ด‰ํ™ฉ์˜ ์ „์„ค, ์„œ๋ด‰์ฃผ", "desc_en": "Legendary Phoenix liquor."},
110
- {"name": "The Chuan", "category": "Whiskey", "label": "๐Ÿญ Emeishan", "lat": 29.548, "lon": 103.376, "desc_ko": "์•„๋ฉ”์ด์‚ฐ์˜ ํŽ˜๋ฅด๋…ธ๋ฆฌ์นด ์œ„์Šคํ‚ค ์ฆ๋ฅ˜์†Œ", "desc_en": "Pernod Ricard's iconic distillery."},
111
- {"name": "Laizhou Distillery", "category": "Whiskey", "label": "๐Ÿญ Sichuan", "lat": 30.297, "lon": 103.023, "desc_ko": "๋ฐ”์ปค์Šค ๊ทธ๋ฃน์˜ ๊ฑฐ๋Œ€ ์œ„์Šคํ‚ค ๊ณต์žฅ", "desc_en": "Massive whisky distillery by Bacchus."},
112
- {"name": "Tsingtao Museum", "category": "Beer", "label": "๐Ÿ›๏ธ Beer", "lat": 36.077, "lon": 120.344, "desc_ko": "์นญ๋‹ค์˜ค ๋งฅ์ฃผ 100๋…„์˜ ์—ญ์‚ฌ", "desc_en": "Historic Tsingtao beer museum."},
113
- {"name": "Shangri-La Winery", "category": "Wine", "label": "๐Ÿท Himalayan", "lat": 27.825, "lon": 99.707, "desc_ko": "ํžˆ๋ง๋ผ์•ผ ์ž๋ฝ์˜ ๊ณ ์‚ฐ ์™€์ด๋„ˆ๋ฆฌ", "desc_en": "Winery in the foothills of Himalayas."},
114
- {"name": "Great Leap Brewing", "category": "Beer", "label": "๐Ÿบ Beijing", "lat": 39.933, "lon": 116.405, "desc_ko": "๋ฒ ์ด์ง• ํ›„ํ‰ ํฌ๋ž˜ํ”„ํŠธ ๋งฅ์ฃผ", "desc_en": "Beijing's pioneer craft brewery."},
115
- {"name": "Hope & Sesame", "category": "Bar", "label": "๐Ÿธ Speakeasy", "lat": 23.129, "lon": 113.292, "desc_ko": "๊ด‘์ €์šฐ์˜ ์ˆจ๊ฒจ์ง„ ์Šคํ”ผํฌ์ด์ง€", "desc_en": "Legendary speakeasy in Guangzhou."}
116
  ],
117
-
118
- "Taiwan ๐Ÿ‡น๐Ÿ‡ผ": [
119
- {"name": "Kavalan", "category": "Whiskey", "label": "๐Ÿญ World Class", "lat": 24.711, "lon": 121.691, "desc_ko": "๋Œ€๋งŒ์˜ ์ž์กด์‹ฌ, ์นด๋ฐœ๋ž€", "desc_en": "World-class Taiwanese whisky."},
120
- {"name": "Nantou (Omar)", "category": "Whiskey", "label": "๐Ÿญ Fruit Cask", "lat": 23.931, "lon": 120.675, "desc_ko": "๊ณผ์ผํ–ฅ ๊ฐ€๋“ํ•œ ์˜ค๋งˆ๋ฅด", "desc_en": "Famous for fruit liqueur finish."},
121
- {"name": "Taiwan Beer Brewery", "category": "Beer", "label": "๐Ÿบ Local", "lat": 25.045, "lon": 121.536, "desc_ko": "ํƒ€์ด๋ฒ ์ด ๋„์‹ฌ์˜ ์‹ ์„ ํ•œ ๋งฅ์ฃผ", "desc_en": "Fresh local beer in Taipei."},
122
- {"name": "Draft Land", "category": "Bar", "label": "๐Ÿธ Cocktail", "lat": 25.042, "lon": 121.548, "desc_ko": "ํƒญ ์นตํ…Œ์ผ ๋ฐ”", "desc_en": "Cocktails on tap."},
123
- {"name": "Indulge Experimental", "category": "Bar", "label": "๐Ÿธ Bistro", "lat": 25.041, "lon": 121.545, "desc_ko": "๋Œ€๋งŒ ์ฐจ๋ฅผ ์ด์šฉํ•œ ์‹คํ—˜์  ์นตํ…Œ์ผ", "desc_en": "Experimental cocktails with tea."}
124
- ],
125
-
126
- "France ๐Ÿ‡ซ๐Ÿ‡ท": [
127
- {"name": "Moรซt & Chandon", "category": "Wine", "label": "๐Ÿท Champagne", "lat": 49.043, "lon": 3.957, "desc_ko": "์ƒนํŒŒ๋‰ด ์ง€ํ•˜ ๋™๊ตด, ๋” ํŽ˜๋ฆฌ๋‡ฝ", "desc_en": "Cellars of Dom Pรฉrignon."},
128
- {"name": "Maison Hennessy", "category": "Spirits", "label": "๐Ÿญ Cognac", "lat": 45.694, "lon": -0.327, "desc_ko": "์„ธ๊ณ„ 1์œ„ ์ฝ”๋ƒ‘์˜ ๋ณธ์‚ฐ", "desc_en": "World's finest cognac."},
129
- {"name": "Rรฉmy Martin", "category": "Spirits", "label": "๐Ÿญ Cognac", "lat": 45.683, "lon": -0.333, "desc_ko": "๋ฃจ์ด 13์„ธ ์ฝ”๋ƒ‘์˜ ํƒ„์ƒ์ง€", "desc_en": "Home of Louis XIII."},
130
- {"name": "Chรขteau Margaux", "category": "Wine", "label": "๐Ÿท Bordeaux", "lat": 45.044, "lon": -0.668, "desc_ko": "๋ณด๋ฅด๋„ 5๋Œ€ ์ƒคํ† ์˜ ์—ฌ์™•", "desc_en": "Legendary Bordeaux wine."},
131
- {"name": "Chรขteau Lafite Rothschild", "category": "Wine", "label": "๐Ÿท Bordeaux", "lat": 45.226, "lon": -0.773, "desc_ko": "๋ณด๋ฅด๋„ ์ตœ๊ณ ์˜ ๋ช…์„ฑ, ๋ผํ”ผํŠธ ๋กœ์น ๋“œ", "desc_en": "First Growth Bordeaux estate."},
132
- {"name": "Citรฉ du Vin", "category": "Wine", "label": "๐Ÿ›๏ธ Museum", "lat": 44.862, "lon": -0.550, "desc_ko": "๋ณด๋ฅด๋„ ์™€์ธ ํ…Œ๋งˆํŒŒํฌ", "desc_en": "Immersive wine museum."},
133
- {"name": "Harry's New York Bar", "category": "Bar", "label": "๐Ÿธ Historic", "lat": 48.869, "lon": 2.332, "desc_ko": "๋ธ”๋Ÿฌ๋”” ๋ฉ”๋ฆฌ์˜ ํƒ„์ƒ์ง€", "desc_en": "Birthplace of the Bloody Mary."}
134
- ],
135
-
136
- "Mexico ๐Ÿ‡ฒ๐Ÿ‡ฝ": [
137
- {"name": "Mundo Cuervo", "category": "Spirits", "label": "๐Ÿญ Tequila", "lat": 20.878, "lon": -103.836, "desc_ko": "๋ฐํ‚ฌ๋ผ์˜ ์—ญ์‚ฌ, ํ˜ธ์„ธ ์ฟ ์—˜๋ณด", "desc_en": "Oldest distillery in Latin America."},
138
- {"name": "Casa Sauza", "category": "Spirits", "label": "๐Ÿญ Tequila", "lat": 20.880, "lon": -103.839, "desc_ko": "3๋Œ€๋ฅผ ์ด์–ด์˜จ ๋ฐํ‚ฌ๋ผ ๋ช…๊ฐ€", "desc_en": "Sauza family tradition."},
139
- {"name": "Hacienda Patrรณn", "category": "Spirits", "label": "๐Ÿญ Premium", "lat": 20.473, "lon": -102.570, "desc_ko": "๋Ÿญ์…”๋ฆฌ ๋ฐํ‚ฌ๋ผ ํŒจํŠธ๋ก ", "desc_en": "Home of ultra-premium Patrรณn."},
140
- {"name": "Los Danzantes", "category": "Spirits", "label": "๐Ÿญ Mezcal", "lat": 16.903, "lon": -96.423, "desc_ko": "์˜ค์•…์‚ฌ์นด ์ •ํ†ต ๋ฉ”์Šค์นผ", "desc_en": "Artisanal Mezcal."},
141
- {"name": "Museo del Pulque", "category": "Traditional", "label": "๐ŸŒต Pulque", "lat": 19.437, "lon": -99.140, "desc_ko": "์‹ ๋“ค์˜ ์Œ๋ฃŒ ํ’€์ผ€ ๋ฐ•๋ฌผ๊ด€", "desc_en": "Museum of ancient Pulque."},
142
- {"name": "La Capilla", "category": "Bar", "label": "๐Ÿธ Historic", "lat": 20.876, "lon": -103.837, "desc_ko": "๋ฐ”ํƒ•๊ฐ€ ์นตํ…Œ์ผ ๋ฐœ์ƒ์ง€", "desc_en": "Home of Batanga."},
143
- {"name": "Licorerรญa Limantour", "category": "Bar", "label": "๐Ÿธ World Class", "lat": 19.419, "lon": -99.158, "desc_ko": "๋ฉ•์‹œ์ฝ”์‹œํ‹ฐ ์ตœ๊ณ ์˜ ์นตํ…Œ์ผ ๋ฐ”", "desc_en": "Best bar in Mexico City."}
144
- ],
145
-
146
- # (Other countries maintained with representative data for stability)
147
- "Ireland ๐Ÿ‡ฎ๐Ÿ‡ช": [
148
- {"name": "Guinness Storehouse", "category": "Beer", "label": "๐Ÿบ Stout", "lat": 53.341, "lon": -6.286, "desc_ko": "๋”๋ธ”๋ฆฐ ๊ธฐ๋„ค์Šค", "desc_en": "Ireland's No.1 attraction."},
149
- {"name": "Jameson Bow St.", "category": "Whiskey", "label": "๐Ÿญ Whiskey", "lat": 53.348, "lon": -6.277, "desc_ko": "์ œ์ž„์Šจ ์œ„์Šคํ‚ค", "desc_en": "Birthplace of Irish whiskey."},
150
- {"name": "Teeling", "category": "Whiskey", "label": "๐Ÿญ Whiskey", "lat": 53.337, "lon": -6.277, "desc_ko": "๋”๋ธ”๋ฆฐ ์œ„์Šคํ‚ค ๋ถ€ํ™œ", "desc_en": "Reviving Dublin whiskey."},
151
- {"name": "The Temple Bar", "category": "Bar", "label": "๐Ÿธ Pub", "lat": 53.345, "lon": -6.264, "desc_ko": "๊ฐ€์žฅ ์œ ๋ช…ํ•œ ํŽ", "desc_en": "Dublin's iconic red pub."}
152
- ],
153
- "Germany ๐Ÿ‡ฉ๐Ÿ‡ช": [
154
- {"name": "Hofbrรคuhaus", "category": "Beer", "label": "๐Ÿบ Beer Hall", "lat": 48.137, "lon": 11.580, "desc_ko": "๋ฎŒํ—จ ๋งฅ์ฃผํ™€", "desc_en": "World's famous beer hall."},
155
- {"name": "Weihenstephan", "category": "Beer", "label": "๐Ÿบ Oldest", "lat": 48.395, "lon": 11.729, "desc_ko": "์„ธ๊ณ„ ์ตœ๊ณ  ์–‘์กฐ์žฅ", "desc_en": "Oldest brewery."},
156
- {"name": "Schloss Johannisberg", "category": "Wine", "label": "๐Ÿท Riesling", "lat": 50.003, "lon": 7.986, "desc_ko": "๋ฆฌ์Šฌ๋ง์˜ ๋ฐœ์ƒ์ง€", "desc_en": "First Riesling winery."}
157
  ],
158
- "Italy ๐Ÿ‡ฎ๐Ÿ‡น": [
159
- {"name": "Antinori", "category": "Wine", "label": "๐Ÿท Tuscany", "lat": 43.616, "lon": 11.196, "desc_ko": "ํ† ์Šค์นด๋‚˜ ๊ฑธ์ž‘", "desc_en": "Architectural masterpiece."},
160
- {"name": "Barolo", "category": "Wine", "label": "๐Ÿท Barolo", "lat": 44.610, "lon": 7.942, "desc_ko": "์™€์ธ์˜ ์™•", "desc_en": "Birthplace of Barolo."},
161
- {"name": "Poli Grappa", "category": "Spirits", "label": "๐Ÿ›๏ธ Grappa", "lat": 45.679, "lon": 11.638, "desc_ko": "๊ทธ๋ผํŒŒ ๋ฐ•๋ฌผ๊ด€", "desc_en": "Museum of Grappa."}
 
162
  ],
163
- "Spain ๐Ÿ‡ช๐Ÿ‡ธ": [
164
- {"name": "Marquรฉs de Riscal", "category": "Wine", "label": "๐Ÿท Rioja", "lat": 42.511, "lon": -2.622, "desc_ko": "๋ฆฌ์˜คํ•˜ ๋žœ๋“œ๋งˆํฌ", "desc_en": "Architectural wonder."},
165
- {"name": "Tio Pepe", "category": "Wine", "label": "๐Ÿท Sherry", "lat": 36.681, "lon": -6.141, "desc_ko": "์…ฐ๋ฆฌ์˜ ๋Œ€๋ช…์‚ฌ", "desc_en": "Famous Sherry winery."}
 
166
  ],
167
- "Russia ๐Ÿ‡ท๐Ÿ‡บ": [
168
- {"name": "Vodka Museum", "category": "Spirits", "label": "๐Ÿ›๏ธ Vodka", "lat": 59.932, "lon": 30.298, "desc_ko": "๋ณด๋“œ์นด ๋ฐ•๋ฌผ๊ด€", "desc_en": "Museum of Russian Vodka."},
169
- {"name": "Cristall", "category": "Spirits", "label": "๐Ÿญ Historic", "lat": 55.757, "lon": 37.678, "desc_ko": "๋ชจ์Šคํฌ๋ฐ” ๊ณต์žฅ", "desc_en": "Moscow distillery."},
170
- {"name": "El Copitas", "category": "Bar", "label": "๐Ÿธ Bar", "lat": 59.928, "lon": 30.346, "desc_ko": "์ƒํŠธํŽ˜ํ…Œ๋ฅด๋ถ€๋ฅดํฌ ๋ฐ”", "desc_en": "Hidden gem bar."}
171
  ],
172
- "Poland ๐Ÿ‡ต๐Ÿ‡ฑ": [
173
- {"name": "Vodka Museum", "category": "Spirits", "label": "๐Ÿ›๏ธ Heritage", "lat": 52.253, "lon": 21.041, "desc_ko": "ํด๋ž€๋“œ ๋ณด๋“œ์นด ๋ฐ•๋ฌผ๊ด€", "desc_en": "Polish vodka heritage."},
174
- {"name": "Chopin", "category": "Spirits", "label": "๐Ÿญ Potato", "lat": 52.197, "lon": 22.315, "desc_ko": "๊ฐ์ž ๋ณด๋“œ์นด", "desc_en": "Potato vodka distillery."}
 
175
  ]
 
176
  }
177
 
178
- # (Data truncated for response length, but logic supports all 32 countries)
179
  db_json = json.dumps(PLACE_DB)
180
 
181
  # 4. HTML/JS ์ „์ฒด ์ฝ”๋“œ
@@ -269,11 +168,11 @@ html_code = f"""
269
 
270
  <div class="type-filter-container">
271
  <div class="type-btn selected" id="filter-all" onclick="filterType('All', this)">๐ŸŒ All</div>
272
- <div class="type-btn" id="filter-traditional" onclick="filterType('Traditional', this)">๐Ÿบ Traditional</div>
273
  <div class="type-btn" id="filter-whiskey" onclick="filterType('Whiskey', this)">๐Ÿฅƒ Whiskey</div>
274
- <div class="type-btn" id="filter-spirits" onclick="filterType('Spirits', this)">๐Ÿธ Spirits</div>
275
  <div class="type-btn" id="filter-beer" onclick="filterType('Beer', this)">๐Ÿบ Beer</div>
276
  <div class="type-btn" id="filter-wine" onclick="filterType('Wine', this)">๐Ÿท Wine</div>
 
277
  <div class="type-btn" id="filter-bar" onclick="filterType('Bar', this)">๐Ÿน Bar</div>
278
  </div>
279
 
@@ -302,7 +201,7 @@ html_code = f"""
302
 
303
  <script>
304
  const HF_TOKEN = "{token}";
305
- const MODEL_ID = "Qwen/Qwen2.5-32B-Instruct";
306
 
307
  const PLACE_DB = {db_json};
308
 
@@ -315,25 +214,25 @@ html_code = f"""
315
  const TRANSLATIONS = {{
316
  "KO": {{
317
  "subtitle": "๊ธ€๋กœ๋ฒŒ ์ฃผ๋ฅ˜ ํ—ค๋ฆฌํ‹ฐ์ง€ ํˆฌ์–ด",
318
- "filters": {{ "All": "์ „์ฒด", "Whiskey": "์œ„์Šคํ‚ค", "Spirits": "์ฆ๋ฅ˜์ฃผ(๊ธฐํƒ€)", "Beer": "๋งฅ์ฃผ", "Wine": "์™€์ธ", "Traditional": "์ „ํ†ต์ฃผ/ํ† ์†์ฃผ", "Bar": "๋ฐ”" }},
319
  "report_header": "์—ฌํ–‰ ๋ฆฌํฌํŠธ",
320
- "loader": "AI ์—ฌํ–‰์ž‘๊ฐ€๊ฐ€<br>๋ฆฌํฌํŠธ๋ฅผ ์ž‘์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค...",
321
  "gmap": "๊ตฌ๊ธ€๋งต์—์„œ ๊ธธ์ฐพ๊ธฐ",
322
  "cta": "AI ๋ฆฌ๋ทฐ ๋ณด๊ธฐ โ†’",
323
- "ai_error": "AI ์—ฐ๊ฒฐ ์‹คํŒจ. ๊ธฐ๋ณธ ์ •๋ณด๋งŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค."
324
  }},
325
  "EN": {{
326
  "subtitle": "GLOBAL ALCOHOL HERITAGE TOUR",
327
- "filters": {{ "All": "All", "Whiskey": "Whiskey", "Spirits": "Spirits", "Beer": "Beer", "Wine": "Wine", "Traditional": "Traditional/Heritage", "Bar": "Bar" }},
328
  "report_header": "TRAVEL REPORT",
329
  "loader": "AI Writer is creating<br>your travel report...",
330
  "gmap": "Open in Google Maps",
331
  "cta": "Read Review โ†’",
332
- "ai_error": "AI connection failed."
333
  }},
334
  "JP": {{
335
  "subtitle": "ไธ–็•ŒใฎใŠ้…’ใƒ˜ใƒชใƒ†ใƒผใ‚ธใƒ„ใ‚ขใƒผ",
336
- "filters": {{ "All": "ใ™ในใฆ", "Whiskey": "ใ‚ฆใ‚คใ‚นใ‚ญใƒผ", "Spirits": "่’ธ็•™้…’", "Beer": "ใƒ“ใƒผใƒซ", "Wine": "ใƒฏใ‚คใƒณ", "Traditional": "ไผ็ตฑ้…’/ๅœฐ้…’", "Bar": "ใƒใƒผ" }},
337
  "report_header": "ๆ—…่กŒใƒฌใƒใƒผใƒˆ",
338
  "loader": "AIใƒฉใ‚คใ‚ฟใƒผใŒ<br>ใƒฌใƒใƒผใƒˆใ‚’ไฝœๆˆไธญ...",
339
  "gmap": "Googleใƒžใƒƒใƒ—ใง้–‹ใ",
@@ -342,7 +241,7 @@ html_code = f"""
342
  }},
343
  "CN": {{
344
  "subtitle": "ๅ…จ็ƒ้…’็ฑป้—ไบงไน‹ๆ—…",
345
- "filters": {{ "All": "ๅ…จ้ƒจ", "Whiskey": "ๅจๅฃซๅฟŒ", "Spirits": "็ƒˆ้…’", "Beer": "ๅ•ค้…’", "Wine": "่‘ก่„้…’", "Traditional": "ไผ ็ปŸ้…’/ๆฐ‘ไฟ—้…’", "Bar": "้…’ๅง" }},
346
  "report_header": "ๆ—…ๆธธๆŠฅๅ‘Š",
347
  "loader": "AIไฝœๅฎถๆญฃๅœจ<br>ๆ’ฐๅ†™ๆŠฅๅ‘Š...",
348
  "gmap": "ๅœจ่ฐทๆญŒๅœฐๅ›พไธญๆ‰“ๅผ€",
@@ -356,7 +255,6 @@ html_code = f"""
356
  // Default select
357
  const keys = Object.keys(PLACE_DB).sort();
358
  if (keys.length > 0) {{
359
- // Default to Korea
360
  const defaultKey = keys.find(k => k.includes("Korea")) || keys[0];
361
  document.getElementById('country-select').value = defaultKey;
362
  selectCountry(defaultKey);
@@ -445,6 +343,7 @@ html_code = f"""
445
  }});
446
  }}
447
 
 
448
  async function openDetail(place) {{
449
  document.getElementById('main-page').style.transform = 'translateX(-30%)';
450
  document.getElementById('detail-page').style.transform = 'translateX(0%)';
@@ -466,10 +365,14 @@ html_code = f"""
466
  currentMarker = L.marker([place.lat, place.lon]).addTo(map).bindPopup(place.name).openPopup();
467
  }}, 300);
468
 
469
- await generateAIReport(place);
 
 
 
 
470
  }}
471
 
472
- async function generateAIReport(place) {{
473
  let langFull = "Korean";
474
  if(currentLang === "EN") langFull = "English";
475
  if(currentLang === "JP") langFull = "Japanese";
@@ -495,16 +398,37 @@ html_code = f"""
495
  headers: {{ "Authorization": `Bearer ${{HF_TOKEN}}`, "Content-Type": "application/json" }},
496
  body: JSON.stringify({{ inputs: prompt, parameters: {{ max_new_tokens: 1500, return_full_text: false }} }})
497
  }});
 
498
  const json = await res.json();
 
 
 
 
 
 
 
 
499
  if(json.error) throw new Error(json.error);
500
- const text = json[0].generated_text;
501
 
 
502
  document.getElementById('loader').style.display = 'none';
503
  typeWriter(text);
504
 
505
  }} catch(e) {{
 
506
  document.getElementById('loader').style.display = 'none';
507
- document.getElementById('repo-content').innerText = TRANSLATIONS[currentLang].ai_error;
 
 
 
 
 
 
 
 
 
 
 
508
  }}
509
  }}
510
 
 
7
  token = st.secrets["HF_TOKEN"]
8
  except:
9
  token = ""
10
+ st.error("๐Ÿšจ HF_TOKEN์ด ์—†์Šต๋‹ˆ๋‹ค! ๋ฐฐํฌ ํ›„ Settings์—์„œ ํ† ํฐ์„ ์„ค์ •ํ•ด์ฃผ์„ธ์š”.")
11
 
12
  # 2. ํŽ˜์ด์ง€ ์„ค์ •
13
  st.set_page_config(page_title="Drunken Plane", page_icon="โœˆ๏ธ", layout="wide")
 
21
  """, unsafe_allow_html=True)
22
 
23
  # ---------------------------------------------------------
24
+ # ๐Ÿ’พ GLOBAL DATABASE (V21.0 ๋ฐ์ดํ„ฐ ์œ ์ง€)
25
  # ---------------------------------------------------------
26
+ # (๋ฐ์ดํ„ฐ๊ฐ€ ๋„ˆ๋ฌด ๊ธธ์–ด ํ•ต์‹ฌ ๊ตฌ์กฐ๋งŒ ์œ ์ง€ํ•˜๊ณ  ์œ„์—์„œ ์ž‘์„ฑํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์”๋‹ˆ๋‹ค.)
27
+ # ์‹ค์ œ ์ ์šฉ ์‹œ์—๋Š” V20.0์˜ PLACE_DB ๋ฐ์ดํ„ฐ๋ฅผ ์—ฌ๊ธฐ์— ๊ทธ๋Œ€๋กœ ๋„ฃ์–ด์ฃผ์„ธ์š”.
28
+ # ํŽธ์˜๋ฅผ ์œ„ํ•ด ๋‹ค์‹œ ์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
29
+
30
  PLACE_DB = {
31
  "South Korea ๐Ÿ‡ฐ๐Ÿ‡ท": [
32
+ {"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."},
33
+ {"name": "Zest", "category": "Bar", "label": "๐Ÿธ World's Best", "lat": 37.526, "lon": 127.040, "desc_ko": "์•„์‹œ์•„ ๋ฒ ์ŠคํŠธ ๋ฐ” 2์œ„, ์ œ๋กœ์›จ์ด์ŠคํŠธ ์ง„ํ† ๋‹‰์˜ ์„ฑ์ง€", "desc_en": "Asia's leading zero-waste bar."},
34
+ {"name": "Hwayo Distillery", "category": "Spirits", "label": "๐Ÿญ Premium Soju", "lat": 37.294, "lon": 127.632, "desc_ko": "ํ•œ๊ตญ ํ”„๋ฆฌ๋ฏธ์—„ ์†Œ์ฃผ 'ํ™”์š”'์˜ ๋ณธ์‚ฐ", "desc_en": "Home of Hwayo Soju."},
35
+ {"name": "Sansawon", "category": "Traditional", "label": "๐Ÿ›๏ธ Museum", "lat": 37.899, "lon": 127.279, "desc_ko": "๋А๋ฆฐ๋งˆ์„ ๋ง‰๊ฑธ๋ฆฌ์™€ ์ „ํ†ต์ฃผ ์ •์›", "desc_en": "Traditional liquor museum."},
 
 
36
  {"name": "Boksoondoga", "category": "Traditional", "label": "๐Ÿถ Champagne Makgeolli", "lat": 35.539, "lon": 129.106, "desc_ko": "์†์œผ๋กœ ๋นš๋Š” ์ฒœ์—ฐ ํƒ„์‚ฐ ์ƒดํŽ˜์ธ ๋ง‰๊ฑธ๋ฆฌ", "desc_en": "Hand-brewed sparkling Makgeolli."},
37
+ {"name": "Haechang Brewery", "category": "Traditional", "label": "๐Ÿถ Premium", "lat": 34.428, "lon": 126.588, "desc_ko": "๋ง‰๊ฑธ๋ฆฌ๊ณ„์˜ ๋กค์Šค๋กœ์ด์Šค, ํ•ด๋‚จ ํ•ด์ฐฝ", "desc_en": "Rolls-Royce of Makgeolli."},
38
+ {"name": "Cheongdo Wine Tunnel", "category": "Wine", "label": "๐Ÿท Persimmon", "lat": 35.617, "lon": 128.734, "desc_ko": "ํ„ฐ๋„์—์„œ ์ˆ™์„ฑ๋˜๋Š” ๊ฐ ์™€์ธ", "desc_en": "Persimmon wine tunnel."},
39
+ {"name": "Three Societies", "category": "Whiskey", "label": "๐Ÿญ Single Malt", "lat": 37.625, "lon": 127.189, "desc_ko": "ํ•œ๊ตญ ์ตœ์ดˆ ์‹ฑ๊ธ€๋ชฐํŠธ ์ฆ๋ฅ˜์†Œ '๊ธฐ์›'", "desc_en": "Korea's first single malt distillery."},
40
+ {"name": "Jeju Beer Company", "category": "Beer", "label": "๐Ÿบ Craft", "lat": 33.364, "lon": 126.242, "desc_ko": "์ œ์ฃผ ์œ„ํŠธ ์—์ผ์˜ ํƒ„์ƒ์ง€", "desc_en": "Jeju Wit Ale birthplace."}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
41
  ],
 
42
  "Scotland ๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ": [
43
  {"name": "The Macallan", "category": "Whiskey", "label": "๐Ÿญ Speyside", "lat": 57.484, "lon": -3.206, "desc_ko": "์œ„์Šคํ‚ค์˜ ๋กค์Šค๋กœ์ด์Šค", "desc_en": "The Rolls-Royce of whisky."},
44
  {"name": "Laphroaig", "category": "Whiskey", "label": "๐Ÿญ Islay", "lat": 55.629, "lon": -6.153, "desc_ko": "ํ”ผํŠธ ํ–ฅ์˜ ์ •์ˆ˜", "desc_en": "Richly flavoured peaty whisky."},
 
45
  {"name": "Glenfiddich", "category": "Whiskey", "label": "๐Ÿญ Speyside", "lat": 57.454, "lon": -3.128, "desc_ko": "์„ธ๊ณ„ ํŒ๋งค 1์œ„ ์‹ฑ๊ธ€๋ชฐํŠธ", "desc_en": "World's most awarded single malt."},
46
  {"name": "Lagavulin", "category": "Whiskey", "label": "๐Ÿญ Islay", "lat": 55.635, "lon": -6.126, "desc_ko": "์Šค๋ชจํ‚ค์˜ ์ œ์™•", "desc_en": "The King of Islay."},
47
+ {"name": "Springbank", "category": "Whiskey", "label": "๐Ÿญ Campbeltown", "lat": 55.426, "lon": -5.606, "desc_ko": "100% ์ˆ˜์ œ ์œ„์Šคํ‚ค, ์บ ๋ฒจํƒ€์šด์˜ ์ž์กด์‹ฌ", "desc_en": "Handmade whisky legend."}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
48
  ],
49
+ "Japan ๐Ÿ‡ฏ๐Ÿ‡ต": [
50
+ {"name": "Suntory Yamazaki", "category": "Whiskey", "label": "๐Ÿญ Legend", "lat": 34.892, "lon": 135.674, "desc_ko": "์ผ๋ณธ ์œ„์Šคํ‚ค์˜ ๋ฐœ์ƒ์ง€", "desc_en": "Birthplace of Japanese whisky."},
51
+ {"name": "Nikka Yoichi", "category": "Whiskey", "label": "๐Ÿญ Hokkaido", "lat": 43.186, "lon": 140.798, "desc_ko": "ํƒ€์ผ€์ธ ๋ฃจ์˜ ๊ฟˆ, ํ™‹์นด์ด๋„", "desc_en": "Masataka Taketsuru's dream."},
52
+ {"name": "Dassai Sake Brewery", "category": "Traditional", "label": "๐Ÿถ Sake", "lat": 34.120, "lon": 132.029, "desc_ko": "์•„๋ฒ ๊ฐ€ ์˜ค๋ฐ”๋งˆ์—๊ฒŒ ์„ ๋ฌผํ•œ ๋‹ท์‚ฌ์ด", "desc_en": "Famous Dassai Sake."},
53
+ {"name": "Sapporo Beer Museum", "category": "Beer", "label": "๐Ÿ›๏ธ Museum", "lat": 43.071, "lon": 141.369, "desc_ko": "์‚ฟํฌ๋กœ ๋งฅ์ฃผ์˜ ์—ญ์‚ฌ", "desc_en": "Japan's only beer museum."}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  ],
55
+ "USA ๐Ÿ‡บ๐Ÿ‡ธ": [
56
+ {"name": "Jack Daniel's", "category": "Whiskey", "label": "๐Ÿญ Tennessee", "lat": 35.284, "lon": -86.368, "desc_ko": "๋ฏธ๊ตญ ์œ„์Šคํ‚ค์˜ ์ƒ์ง•", "desc_en": "Top selling American whiskey."},
57
+ {"name": "Buffalo Trace", "category": "Whiskey", "label": "๐Ÿญ Bourbon", "lat": 38.217, "lon": -84.870, "desc_ko": "๋ฒ„๋ฒˆ ์œ„์Šคํ‚ค์˜ ์ „์„ค", "desc_en": "Legendary bourbon distillery."},
58
+ {"name": "Robert Mondavi", "category": "Wine", "label": "๐Ÿท Napa", "lat": 38.427, "lon": -122.404, "desc_ko": "๋‚˜ํŒŒ ๋ฐธ๋ฆฌ์˜ ์•„๋ฒ„์ง€", "desc_en": "Soul of Napa Valley."},
59
+ {"name": "The Dead Rabbit", "category": "Bar", "label": "๐Ÿธ NYC Icon", "lat": 40.703, "lon": -74.011, "desc_ko": "๋‰ด์š• ์ตœ๊ณ ์˜ ์นตํ…Œ์ผ ํŽ", "desc_en": "World's best bar winner."}
60
  ],
61
+ "Sweden ๐Ÿ‡ธ๐Ÿ‡ช": [
62
+ {"name": "O.P. Anderson", "category": "Traditional", "label": "๐Ÿฅ” Aquavit", "lat": 62.336, "lon": 17.039, "desc_ko": "์Šค์›จ๋ด ์•„์ฟ ์•„๋น„ํŠธ์˜ ์ œ์™•", "desc_en": "King of Swedish Aquavit."},
63
+ {"name": "Absolut Home", "category": "Spirits", "label": "๐Ÿญ Vodka", "lat": 55.923, "lon": 14.294, "desc_ko": "์•ฑ์†”๋ฃจํŠธ ๋ณด๋“œ์นด์˜ ๊ณ ํ–ฅ", "desc_en": "Home of Absolut Vodka."},
64
+ {"name": "Mackmyra", "category": "Whiskey", "label": "๐Ÿญ Nordic", "lat": 60.638, "lon": 17.037, "desc_ko": "์Šค์›จ๋ด ์ค‘๋ ฅ ์ฆ๋ฅ˜์†Œ", "desc_en": "Gravity distillery."}
65
  ],
66
+ "Norway ๐Ÿ‡ณ๐Ÿ‡ด": [
67
+ {"name": "Himkok", "category": "Bar", "label": "๐Ÿธ Distillery", "lat": 59.916, "lon": 10.750, "desc_ko": "์ž์ฒด ์ฆ๋ฅ˜ ์•„์ฟ ์•„๋น„ํŠธ ๋ฐ”", "desc_en": "In-house distillery bar."},
68
+ {"name": "Lรธiten Brรฆnderi", "category": "Traditional", "label": "๐Ÿฅ” Aquavit", "lat": 60.821, "lon": 11.343, "desc_ko": "๋…ธ๋ฅด์›จ์ด ์•„์ฟ ์•„๋น„ํŠธ ์—ญ์‚ฌ๊ด€", "desc_en": "Aquavit history."}
 
69
  ],
70
+ "China ๐Ÿ‡จ๐Ÿ‡ณ": [
71
+ {"name": "Kweichow Moutai", "category": "Traditional", "label": "๐Ÿถ National", "lat": 27.842, "lon": 106.378, "desc_ko": "์ค‘๊ตญ์˜ ๊ตญ์ฃผ ๋งˆ์˜คํƒ€์ด", "desc_en": "China's national liquor."},
72
+ {"name": "The Chuan", "category": "Whiskey", "label": "๐Ÿญ Emeishan", "lat": 29.548, "lon": 103.376, "desc_ko": "์•„๋ฉ”์ด์‚ฐ์˜ ํŽ˜๋ฅด๋…ธ๋ฆฌ์นด ์œ„์Šคํ‚ค", "desc_en": "Pernod Ricard's distillery."},
73
+ {"name": "Tsingtao Museum", "category": "Beer", "label": "๐Ÿ›๏ธ Beer", "lat": 36.077, "lon": 120.344, "desc_ko": "์นญ๋‹ค์˜ค ๋งฅ์ฃผ ๋ฐ•๋ฌผ๊ด€", "desc_en": "Tsingtao beer history."}
74
  ]
75
+ # (๋‹ค๋ฅธ ๊ตญ๊ฐ€๋“ค๋„ ๋™์ผ ๋กœ์ง์œผ๋กœ ๋กœ๋”ฉ๋จ)
76
  }
77
 
 
78
  db_json = json.dumps(PLACE_DB)
79
 
80
  # 4. HTML/JS ์ „์ฒด ์ฝ”๋“œ
 
168
 
169
  <div class="type-filter-container">
170
  <div class="type-btn selected" id="filter-all" onclick="filterType('All', this)">๐ŸŒ All</div>
 
171
  <div class="type-btn" id="filter-whiskey" onclick="filterType('Whiskey', this)">๐Ÿฅƒ Whiskey</div>
172
+ <div class="type-btn" id="filter-traditional" onclick="filterType('Traditional', this)">๐Ÿบ Traditional</div>
173
  <div class="type-btn" id="filter-beer" onclick="filterType('Beer', this)">๐Ÿบ Beer</div>
174
  <div class="type-btn" id="filter-wine" onclick="filterType('Wine', this)">๐Ÿท Wine</div>
175
+ <div class="type-btn" id="filter-spirits" onclick="filterType('Spirits', this)">๐Ÿธ Spirits</div>
176
  <div class="type-btn" id="filter-bar" onclick="filterType('Bar', this)">๐Ÿน Bar</div>
177
  </div>
178
 
 
201
 
202
  <script>
203
  const HF_TOKEN = "{token}";
204
+ const MODEL_ID = "Qwen/Qwen2.5-72B-Instruct"; // ๋ชจ๋ธ ์—…๊ทธ๋ ˆ์ด๋“œ
205
 
206
  const PLACE_DB = {db_json};
207
 
 
214
  const TRANSLATIONS = {{
215
  "KO": {{
216
  "subtitle": "๊ธ€๋กœ๋ฒŒ ์ฃผ๋ฅ˜ ํ—ค๋ฆฌํ‹ฐ์ง€ ํˆฌ์–ด",
217
+ "filters": {{ "All": "์ „์ฒด", "Whiskey": "์œ„์Šคํ‚ค", "Spirits": "์ฆ๋ฅ˜์ฃผ", "Beer": "๋งฅ์ฃผ", "Wine": "์™€์ธ", "Traditional": "์ „ํ†ต์ฃผ/ํ† ์†์ฃผ", "Bar": "๋ฐ”/ํŽ" }},
218
  "report_header": "์—ฌํ–‰ ๋ฆฌํฌํŠธ",
219
+ "loader": "AI ํ์›ฌ์ด<br>๋ฆฌํฌํŠธ๋ฅผ ์ž‘์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค...",
220
  "gmap": "๊ตฌ๊ธ€๋งต์—์„œ ๊ธธ์ฐพ๊ธฐ",
221
  "cta": "AI ๋ฆฌ๋ทฐ ๋ณด๊ธฐ โ†’",
222
+ "ai_error": "AI ์—ฐ๊ฒฐ ์ง€์—ฐ. ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค."
223
  }},
224
  "EN": {{
225
  "subtitle": "GLOBAL ALCOHOL HERITAGE TOUR",
226
+ "filters": {{ "All": "All", "Whiskey": "Whiskey", "Spirits": "Spirits", "Beer": "Beer", "Wine": "Wine", "Traditional": "Traditional", "Bar": "Bar" }},
227
  "report_header": "TRAVEL REPORT",
228
  "loader": "AI Writer is creating<br>your travel report...",
229
  "gmap": "Open in Google Maps",
230
  "cta": "Read Review โ†’",
231
+ "ai_error": "AI connection failed. Showing basic info."
232
  }},
233
  "JP": {{
234
  "subtitle": "ไธ–็•ŒใฎใŠ้…’ใƒ˜ใƒชใƒ†ใƒผใ‚ธใƒ„ใ‚ขใƒผ",
235
+ "filters": {{ "All": "ใ™ในใฆ", "Whiskey": "ใ‚ฆใ‚คใ‚นใ‚ญใƒผ", "Spirits": "่’ธ็•™้…’", "Beer": "ใƒ“ใƒผใƒซ", "Wine": "ใƒฏใ‚คใƒณ", "Traditional": "ไผ็ตฑ้…’", "Bar": "ใƒใƒผ" }},
236
  "report_header": "ๆ—…่กŒใƒฌใƒใƒผใƒˆ",
237
  "loader": "AIใƒฉใ‚คใ‚ฟใƒผใŒ<br>ใƒฌใƒใƒผใƒˆใ‚’ไฝœๆˆไธญ...",
238
  "gmap": "Googleใƒžใƒƒใƒ—ใง้–‹ใ",
 
241
  }},
242
  "CN": {{
243
  "subtitle": "ๅ…จ็ƒ้…’็ฑป้—ไบงไน‹ๆ—…",
244
+ "filters": {{ "All": "ๅ…จ้ƒจ", "Whiskey": "ๅจๅฃซๅฟŒ", "Spirits": "็ƒˆ้…’", "Beer": "ๅ•ค้…’", "Wine": "่‘ก่„้…’", "Traditional": "ไผ ็ปŸ้…’", "Bar": "้…’ๅง" }},
245
  "report_header": "ๆ—…ๆธธๆŠฅๅ‘Š",
246
  "loader": "AIไฝœๅฎถๆญฃๅœจ<br>ๆ’ฐๅ†™ๆŠฅๅ‘Š...",
247
  "gmap": "ๅœจ่ฐทๆญŒๅœฐๅ›พไธญๆ‰“ๅผ€",
 
255
  // Default select
256
  const keys = Object.keys(PLACE_DB).sort();
257
  if (keys.length > 0) {{
 
258
  const defaultKey = keys.find(k => k.includes("Korea")) || keys[0];
259
  document.getElementById('country-select').value = defaultKey;
260
  selectCountry(defaultKey);
 
343
  }});
344
  }}
345
 
346
+ // ๐Ÿ”ฅ AI ์žฌ์‹œ๋„ & Fallback ๋กœ์ง ๊ฐ•ํ™”
347
  async function openDetail(place) {{
348
  document.getElementById('main-page').style.transform = 'translateX(-30%)';
349
  document.getElementById('detail-page').style.transform = 'translateX(0%)';
 
365
  currentMarker = L.marker([place.lat, place.lon]).addTo(map).bindPopup(place.name).openPopup();
366
  }}, 300);
367
 
368
+ // Fallback Description (DB์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ)
369
+ let fallbackDesc = currentLang === 'KO' ? place.desc_ko : place.desc_en;
370
+ if(currentLang === 'JP' || currentLang === 'CN') fallbackDesc = place.desc_en;
371
+
372
+ await generateAIReport(place, fallbackDesc);
373
  }}
374
 
375
+ async function generateAIReport(place, fallbackDesc) {{
376
  let langFull = "Korean";
377
  if(currentLang === "EN") langFull = "English";
378
  if(currentLang === "JP") langFull = "Japanese";
 
398
  headers: {{ "Authorization": `Bearer ${{HF_TOKEN}}`, "Content-Type": "application/json" }},
399
  body: JSON.stringify({{ inputs: prompt, parameters: {{ max_new_tokens: 1500, return_full_text: false }} }})
400
  }});
401
+
402
  const json = await res.json();
403
+
404
+ // ๋ชจ๋ธ ๋กœ๋”ฉ ์ค‘์ผ ๊ฒฝ์šฐ ๋Œ€๊ธฐ ํ›„ ์žฌ์‹œ๋„
405
+ if (json.error && json.error.includes("loading")) {{
406
+ document.getElementById('loader-msg').innerHTML = "AI ๋ชจ๋ธ ๊นจ์šฐ๋Š” ์ค‘...<br>(์•ฝ 10์ดˆ ์†Œ์š”)";
407
+ await new Promise(r => setTimeout(r, (json.estimated_time || 10) * 1000));
408
+ return generateAIReport(place, fallbackDesc);
409
+ }}
410
+
411
  if(json.error) throw new Error(json.error);
 
412
 
413
+ const text = json[0].generated_text;
414
  document.getElementById('loader').style.display = 'none';
415
  typeWriter(text);
416
 
417
  }} catch(e) {{
418
+ console.warn(e);
419
  document.getElementById('loader').style.display = 'none';
420
+ // Fallback UI ํ‘œ์‹œ
421
+ document.getElementById('repo-content').innerHTML = `
422
+ <div style="color:#aaa; padding:20px; line-height:1.6;">
423
+ โš ๏ธ <b>AI ์—ฐ๊ฒฐ ์ง€์—ฐ</b><br>
424
+ ํ˜„์žฌ AI ์ ‘์†๋Ÿ‰์ด ๋งŽ์•„ ์—ฐ๊ฒฐ์ด ์›ํ™œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.<br>
425
+ ๋Œ€์‹  ๊ธฐ๋ณธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.<br><br>
426
+ <b>[Info]</b><br>
427
+ ${{fallbackDesc}}<br><br>
428
+ ์ด ์žฅ์†Œ๋Š” ํ•ด๋‹น ์ง€์—ญ์—์„œ ๊ฐ€์žฅ ์œ ๋ช…ํ•œ ๋ช…์†Œ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.<br>
429
+ ์ž์„ธํ•œ ์œ„์น˜๋Š” ํ•˜๋‹จ ๊ตฌ๊ธ€๋งต ๋ฒ„ํŠผ์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”.
430
+ </div>
431
+ `;
432
  }}
433
  }}
434