105 lines
3.8 KiB
Python
105 lines
3.8 KiB
Python
"""
|
|
TEE OFF - AUTOMATISK URL-IMPORTØR
|
|
---------------------------------------------------------------------------
|
|
Leser tekstfiler med lenker og forsøker å matche dem mot eksisterende
|
|
golfanlegg i databasen basert på domenenavn.
|
|
|
|
docker compose exec api python import_urls.py
|
|
---------------------------------------------------------------------------
|
|
"""
|
|
|
|
import asyncio
|
|
import asyncpg
|
|
import os
|
|
from urllib.parse import urlparse
|
|
|
|
from env_config import get_database_url
|
|
|
|
DB_URL = get_database_url()
|
|
|
|
# Hvilke filer vi skal lese, og hvilke databasefelt de tilhører
|
|
FILES_TO_IMPORT = {
|
|
"Medlemsskap.txt": "medlemskap_url",
|
|
"GreenFee.txt": "greenfee_url",
|
|
"VtG.txt": "vtg_lenke"
|
|
}
|
|
|
|
def extract_domain(url: str) -> str:
|
|
"""Henter ut hoveddomenet (f.eks. 'tyrifjord-golfklubb.no') fra en URL."""
|
|
try:
|
|
domain = urlparse(url.strip()).netloc.lower()
|
|
if domain.startswith("www."):
|
|
domain = domain[4:]
|
|
return domain
|
|
except:
|
|
return ""
|
|
|
|
async def run_import():
|
|
print("🚀 Starter URL-importør...")
|
|
conn = await asyncpg.connect(DB_URL)
|
|
|
|
try:
|
|
# Hent alle eksisterende anlegg og deres domener
|
|
facilities = await conn.fetch("SELECT id, name, website_url, scrape_status_url FROM facilities")
|
|
|
|
# Bygg en ordbok: { 'domenenavn.no': facility_id } for superraskt oppslag
|
|
domain_map = {}
|
|
for f in facilities:
|
|
# Prøv å hente domene fra website_url
|
|
if f['website_url']:
|
|
domain = extract_domain(f['website_url'])
|
|
if domain: domain_map[domain] = f['id']
|
|
# Prøv også scrape_status_url for sikkerhets skyld
|
|
if f['scrape_status_url']:
|
|
domain = extract_domain(f['scrape_status_url'])
|
|
if domain: domain_map[domain] = f['id']
|
|
|
|
print(f"📋 Fant {len(domain_map)} unike domener i databasen.")
|
|
|
|
# Gå gjennom fil for fil
|
|
for filename, db_field in FILES_TO_IMPORT.items():
|
|
print(f"\n▶️ BEHANDLER: {filename} -> Setter felt: {db_field}")
|
|
|
|
if not os.path.exists(filename):
|
|
print(f" ⚠️ Filen '{filename}' ble ikke funnet. Hopper over.")
|
|
continue
|
|
|
|
with open(filename, 'r', encoding='utf-8') as file:
|
|
lines = [line.strip() for line in file.readlines() if line.strip()]
|
|
|
|
matched_count = 0
|
|
unmatched = []
|
|
|
|
for line in lines:
|
|
# Hvis det er flere URL-er på samme linje separert med komma,
|
|
# matcher vi basert på den FØRSTE URL-en.
|
|
first_url = line.split(',')[0].strip()
|
|
domain = extract_domain(first_url)
|
|
|
|
# Hvis vi fant en match i databasen!
|
|
if domain in domain_map:
|
|
fac_id = domain_map[domain]
|
|
|
|
# Oppdater databasen med HELE linjen (for å bevare ev. komma-lenker)
|
|
await conn.execute(f"""
|
|
UPDATE facilities
|
|
SET {db_field} = $1
|
|
WHERE id = $2
|
|
""", line, fac_id)
|
|
matched_count += 1
|
|
else:
|
|
unmatched.append(line)
|
|
|
|
print(f" ✅ Matchet og oppdatert {matched_count} anlegg.")
|
|
|
|
if unmatched:
|
|
print(f" ❌ Følgende {len(unmatched)} URL-er fant ingen match i databasen og må legges inn manuelt:")
|
|
for url in unmatched:
|
|
print(f" - {url}")
|
|
|
|
finally:
|
|
await conn.close()
|
|
print("\n🏁 Import fullført!")
|
|
|
|
if __name__ == "__main__":
|
|
asyncio.run(run_import())
|