""" CITY_TO_IATA — маппинг русских названий городов → IATA-коды аэропортов. Используется для парсинга маршрутов из заголовков рейсов Яндекс.Расписаний. Ключи: нижний регистр (сравнение делать через .lower().strip()). """ CITY_TO_IATA: dict[str, str] = { # ── Россия ──────────────────────────────────────────────────────────────── "москва": "SVO", # Шереметьево (основной) "москва (шереметьево)": "SVO", "москва (домодедово)": "DME", "москва (внуково)": "VKO", "москва (жуковский)": "ZIA", "шереметьево": "SVO", "домодедово": "DME", "внуково": "VKO", "жуковский": "ZIA", "санкт-петербург": "LED", "петербург": "LED", "питер": "LED", "пулково": "LED", "новосибирск": "OVB", "екатеринбург": "SVX", "казань": "KZN", "сочи": "AER", "адлер": "AER", "краснодар": "KRR", "уфа": "UFA", "ростов-на-дону": "ROV", "пермь": "PEE", "воронеж": "VOZ", "самара": "KUF", "омск": "OMS", "челябинск": "CEK", "красноярск": "KJA", "иркутск": "IKT", "владивосток": "VVO", "нижний новгород": "GOJ", "хабаровск": "KHV", "тюмень": "TJM", "барнаул": "BAX", "томск": "TOF", "кемерово": "KEJ", "новокузнецк": "NOZ", "якутск": "YKS", "магадан": "GDX", "петропавловск-камчатский": "PKC", "южно-сахалинск": "UUS", "мурманск": "MMK", "архангельск": "ARH", "астрахань": "ASF", "волгоград": "VOG", "саратов": "RTW", "оренбург": "REN", "ставрополь": "STW", "минеральные воды": "MRV", "нальчик": "NAL", "владикавказ": "OGZ", "махачкала": "MCX", "грозный": "GRV", "симферополь": "SIP", "калининград": "KGD", "псков": "PKV", "великий новгород": "NNV", "вологда": "VGD", "ярославль": "IAR", "иваново": "IWA", "тверь": "KLD", "рязань": "RZN", "липецк": "LPK", "белгород": "EGO", "курск": "URS", "брянск": "BZK", "смоленск": "LNX", "тула": "TYA", "калуга": "KLF", "орёл": "OEL", "тамбов": "TBW", "пенза": "PEZ", "ульяновск": "ULV", "нижнекамск": "NBC", "чебоксары": "CSY", "йошкар-ола": "JOK", "саранск": "SKX", "киров": "KVX", "сыктывкар": "SCW", "ухта": "UCT", "нарьян-мар": "NNM", "воркута": "VKT", "салехард": "SLY", "ханты-мансийск": "HMA", "сургут": "SGC", "нижневартовск": "NJC", "ноябрьск": "NOJ", "новый уренгой": "NUX", "надым": "NYM", "нефтеюганск": "NFG", "когалым": "KGP", "стрежевой": "SWT", "горно-алтайск": "RGK", "абакан": "ABA", "кызыл": "KYZ", "улан-удэ": "UUD", "чита": "HTA", "благовещенск": "BQS", "комсомольск-на-амуре": "KXK", "николаевск-на-амуре": "NLI", "магнитогорск": "MQF", "нижний тагил": "NTL", "курган": "KRO", "тобольск": "TOX", "ижевск": "IJK", "нижнеудинск": "NER", "братск": "BTK", "усть-илимск": "UIK", "бодайбо": "ODO", "мирный": "MJZ", "нерюнгри": "NER", "анадырь": "DYR", "провидения": "PVS", "певек": "PWE", "тикси": "IKS", "черский": "CYX", "хандыга": "HTG", "усть-нера": "USR", "сусуман": "SUY", "сеймчан": "SEK", "зырянка": "ZYR", "среднеколымск": "SEK", "беслан": "OGZ", "элиста": "ESL", "астрахань": "ASF", "геленджик": "GDZ", "анапа": "AAQ", "темрюк": "TBW", "ейск": "EIK", "майкоп": "DJU", # ── СНГ / постсоветское пространство ───────────────────────────────────── "минск": "MSQ", "алматы": "ALA", "нур-султан": "NQZ", "астана": "NQZ", "ташкент": "TAS", "баку": "GYD", "ереван": "EVN", "тбилиси": "TBS", "бишкек": "FRU", "душанбе": "DYU", "ашхабад": "ASB", "самарканд": "SKD", "ургенч": "UGC", "фергана": "FEG", "андижан": "AZN", "навои": "NVI", "актобе": "AKX", "актау": "SCO", "атырау": "GUW", "шымкент": "CIT", "павлодар": "PWQ", "усть-каменогорск": "UKK", "семей": "PLX", "костанай": "KSN", "кокшетау": "KOV", "тараз": "DMB", "кызылорда": "KZO", "уральск": "URA", "туркестан": "HSA", "киев": "KBP", "одесса": "ODS", "харьков": "HRK", "львов": "LWO", "кишинёв": "KIV", "кишинев": "KIV", "рига": "RIX", "таллин": "TLL", "вильнюс": "VNO", "ашгабат": "ASB", # ── Популярные зарубежные направления ───────────────────────────────────── # Турция "стамбул": "IST", "анкара": "ESB", "анталья": "AYT", "анталия": "AYT", "бодрум": "BJV", "даламан": "DLM", "измир": "ADB", "трабзон": "TZX", # ОАЭ "дубай": "DXB", "абу-даби": "AUH", "шарджа": "SHJ", # Египет "каир": "CAI", "хургада": "HRG", "шарм-эль-шейх": "SSH", "шарм эль шейх": "SSH", # Таиланд "бангкок": "BKK", "пхукет": "HKT", "самуи": "USM", "паттайя": "UTP", # Европа "париж": "CDG", "лондон": "LHR", "берлин": "BER", "рим": "FCO", "милан": "MXP", "барселона": "BCN", "мадрид": "MAD", "вена": "VIE", "прага": "PRG", "варшава": "WAW", "амстердам": "AMS", "брюссель": "BRU", "цюрих": "ZRH", "женева": "GVA", "франкфурт": "FRA", "мюнхен": "MUC", "гамбург": "HAM", "дюссельдорф": "DUS", "стокгольм": "ARN", "копенгаген": "CPH", "осло": "OSL", "хельсинки": "HEL", "будапешт": "BUD", "бухарест": "OTP", "афины": "ATH", "лиссабон": "LIS", "дублин": "DUB", "лимасол": "LCA", "ларнака": "LCA", "никосия": "LCA", "белград": "BEG", "загреб": "ZAG", "любляна": "LJU", "скопье": "SKP", "тирана": "TIA", "подгорица": "TGD", "сараево": "SJJ", "черногория": "TIV", "тиват": "TIV", "дубровник": "DBV", "сплит": "SPU", "пула": "PUY", "задар": "ZAD", "хорватия": "ZAG", # Азия "токио": "NRT", "осака": "KIX", "сеул": "ICN", "пекин": "PEK", "шанхай": "PVG", "гонконг": "HKG", "сингапур": "SIN", "куала-лумпур": "KUL", "джакарта": "CGK", "бали": "DPS", "манила": "MNL", "ханой": "HAN", "хошимин": "SGN", "коломбо": "CMB", "мале": "MLE", "катманду": "KTM", "дели": "DEL", "мумбаи": "BOM", "бомбей": "BOM", "карачи": "KHI", "лахор": "LHE", "исламабад": "ISB", "тегеран": "IKA", "маскат": "MCT", "доха": "DOH", "кувейт": "KWI", "амман": "AMM", "бейрут": "BEY", "тель-авив": "TLV", "тель авив": "TLV", # Африка "найроби": "NBO", "аддис-абеба": "ADD", "йоханнесбург": "JNB", "касабланка": "CMN", "тунис": "TUN", # Америка "нью-йорк": "JFK", "нью йорк": "JFK", "лос-анджелес": "LAX", "лос анджелес": "LAX", "майами": "MIA", "чикаго": "ORD", "торонто": "YYZ", "ванкувер": "YVR", "монреаль": "YUL", "мехико": "MEX", "гавана": "HAV", "канкун": "CUN", "лима": "LIM", "богота": "BOG", "сан-паулу": "GRU", "буэнос-айрес": "EZE", "сантьяго": "SCL", # Австралия/Океания "сидней": "SYD", "мельбурн": "MEL", "перт": "PER", "брисбен": "BNE", # Дополнительные российские города "читать": "HTA", "нефтекамск": "UUA", "березники": "PEE", "стерлитамак": "UFA", "тольятти": "KUF", "рыбинск": "IAR", "дзержинск": "GOJ", "владимир": "VKO", "кострома": "KMW", "орск": "OSW", "нижний тагил": "NTL", "асбест": "SVX", "нижневартовск": "NJC", "мегион": "NFG", "лангепас": "KGP", "лысьва": "PEE", "краснотурьинск": "SVX", "серов": "SVX", "первоуральск": "SVX", "каменск-уральский": "SVX", } def get_iata(city_name: str) -> str | None: """Возвращает IATA-код по русскому названию города (регистронезависимо).""" return CITY_TO_IATA.get(city_name.lower().strip())