Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
|
@@ -7,7 +7,7 @@ try:
|
|
| 7 |
token = st.secrets["HF_TOKEN"]
|
| 8 |
except:
|
| 9 |
token = ""
|
| 10 |
-
st.error("Settings์์
|
| 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
|
| 25 |
# ---------------------------------------------------------
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
PLACE_DB = {
|
| 27 |
"South Korea ๐ฐ๐ท": [
|
| 28 |
-
{"name": "
|
| 29 |
-
{"name": "
|
| 30 |
-
{"name": "
|
| 31 |
-
{"name": "
|
| 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
|
| 36 |
-
{"name": "
|
| 37 |
-
{"name": "
|
| 38 |
-
{"name": "
|
| 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": "
|
| 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 |
-
|
| 119 |
-
{"name": "
|
| 120 |
-
{"name": "
|
| 121 |
-
{"name": "
|
| 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 |
-
"
|
| 159 |
-
{"name": "
|
| 160 |
-
{"name": "
|
| 161 |
-
{"name": "
|
|
|
|
| 162 |
],
|
| 163 |
-
"
|
| 164 |
-
{"name": "
|
| 165 |
-
{"name": "
|
|
|
|
| 166 |
],
|
| 167 |
-
"
|
| 168 |
-
{"name": "
|
| 169 |
-
{"name": "
|
| 170 |
-
{"name": "El Copitas", "category": "Bar", "label": "๐ธ Bar", "lat": 59.928, "lon": 30.346, "desc_ko": "์ํธํํ
๋ฅด๋ถ๋ฅดํฌ ๋ฐ", "desc_en": "Hidden gem bar."}
|
| 171 |
],
|
| 172 |
-
"
|
| 173 |
-
{"name": "
|
| 174 |
-
{"name": "
|
|
|
|
| 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-
|
| 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-
|
| 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": "์ฆ๋ฅ์ฃผ
|
| 319 |
"report_header": "์ฌํ ๋ฆฌํฌํธ",
|
| 320 |
-
"loader": "AI
|
| 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
|
| 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": "ไผ็ตฑ้
|
| 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": "ไผ ็ป้
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 |
|