import asyncio import json import re import requests from sqlalchemy import text from app.database import AsyncSessionLocal # --- TECHNIKAI SZÓTÁR ÉS MAPPING --- # Ez a szótár fordítja le az UltimateSpecs kulcsokat az adatbázis oszlopneveire MAPPING = { "Maximum power": "power_kw", "Engine capacity": "engine_capacity", "Maximum torque": "torque_nm", "Top Speed": "max_speed", "Acceleration 0 to 100 km/h": "acceleration_0_100", "Curb Weight": "curb_weight", "Wheelbase": "wheelbase", "Num. of Seats": "seats", "Drive wheels - Traction - Layout": "drive_type", "Body": "body_type" } async def r5_test_run(): print("🚀 R5 Hibrid Robot indítása (Teszt üzemmód)...") async with AsyncSessionLocal() as db: # 1. KIVÁLASZTÁS: Kiveszünk egy olyan autót, ami még nincs dúsítva (R1 bázisból) query = text(""" SELECT id, make, marketing_name, year_from, technical_code, fuel_type FROM vehicle.vehicle_model_definitions WHERE (power_kw IS NULL OR power_kw = 0 OR engine_capacity IS NULL OR engine_capacity = 0) AND status IN ('manual_review_needed', 'research_failed_empty', 'pending', 'enrich_ready') ORDER BY priority_score DESC LIMIT 1 """) target = (await db.execute(query)).fetchone() if not target: print("✨ Nincs feldolgozatlan autó az adatbázisban.") return t_id, make, model, year, tech_code, fuel = target print(f"🎯 Célpont: {make} {model} ({year})") print(f"📌 Technical Code: {tech_code or 'Nincs megadva'}") # 2. RDW ADATOK (Holland hatósági bázis) # Ha van technical_code (pl. Fiatnál a típusazonosító), az RDW-ből pontos adatot kapunk rdw_data = {} if tech_code: print("🇳🇱 RDW adatok lekérése...") # Az RDW API m9d7-ebf2 táblája tartalmazza a típus specifikációkat rdw_url = f"https://opendata.rdw.nl/resource/m9d7-ebf2.json?handelsbenaming={tech_code.upper()}" try: res = requests.get(rdw_url, timeout=5).json() if res: rdw_data = { "power_kw": int(float(res[0].get('nettomaximumvermogen', 0))), "engine_capacity": int(res[0].get('cilinderinhoud', 0)), "curb_weight": int(res[0].get('massa_ledig_voertuig', 0)) } print("✅ RDW adatok sikeresen betöltve.") except: print("⚠️ RDW nem elérhető vagy nincs találat.") # 3. ULTIMATESPECS ADATOK (Szimulált kaparás a kért logika alapján) print("🏁 UltimateSpecs adatok gyűjtése...") # Itt futna a Playwright scraper, ami kinyeri a táblázatot # Példa nyers adatokra, amit az oldalról szedünk le: raw_web_data = { "Maximum power": "103 PS / 76 kW @ 5750 rpm", "Engine capacity": "1581 cm3", "Maximum torque": "144 Nm @ 4000 rpm", "Top Speed": "180 km/h", "Acceleration 0 to 100 km/h": "11.5 s", "Curb Weight": "1090 kg", "Wheelbase": "254 cm", "Body": "Hatchback" } # 4. ÖSSZEFŰZÉS ÉS FORDÍTÁS final_mdm_record = { "id": t_id, "make": make, "marketing_name": model, "year_from": year, "fuel_type": fuel } # Alkalmazzuk a mappinget és a regex tisztítást for web_key, db_key in MAPPING.items(): val = raw_web_data.get(web_key) if val: # Számértékek kinyerése (pl. "76 kW" -> 76, "1581 cm3" -> 1581) numbers = re.findall(r'\d+', str(val)) if numbers: # Ha több szám van (pl. kW és LE), a relevánsat választjuk final_mdm_record[db_key] = numbers[1] if "kW" in str(val) and len(numbers)>1 else numbers[0] else: final_mdm_record[db_key] = val # RDW adatok prioritása (ezek a legpontosabbak, felülírják a webet) final_mdm_record.update({k: v for k, v in rdw_data.items() if v}) # --- TERMINÁL KIMENET --- print("\n" + "="*50) print("📊 VÉGLEGES MDM REKORD (ELŐNÉZET)") print("="*50) print(json.dumps(final_mdm_record, indent=2, ensure_ascii=False)) print("="*50) print("\n[R5] Ha az adatok rendben vannak, mehet az élesítés?") if __name__ == "__main__": asyncio.run(r5_test_run())