Nye-TeeOff/backend/import_gallery.py

112 lines
4.1 KiB
Python

import asyncio
import asyncpg
import urllib.request
import json
from env_config import get_database_url
DB_URL = get_database_url()
async def fetch_json(url):
"""Hjelpefunksjon for å hente JSON fra en URL"""
try:
req = urllib.request.Request(url, headers={'User-Agent': 'TeeOff-Migrator/2.0'})
with urllib.request.urlopen(req) as response:
return json.loads(response.read().decode())
except Exception as e:
# print(f"⚠️ Kunne ikke hente {url}: {e}")
return None
async def fetch_media_urls_by_ids(media_ids):
"""Henter URLer for en liste med media-IDer (ACF Slides)"""
if not media_ids or not isinstance(media_ids, list) or len(media_ids) == 0:
return []
valid_ids = [str(mid) for mid in media_ids if isinstance(mid, (int, str)) and str(mid).isdigit()]
if not valid_ids: return []
ids_str = ",".join(valid_ids)
url = f"https://teeoff.no/wp-json/wp/v2/media?include={ids_str}"
data = await fetch_json(url)
urls = []
if data:
for m in data:
if 'source_url' in m:
urls.append(m['source_url'])
return urls
async def run_robust_import():
print("🕵️‍♂️ Starter den store bildejakten (sjekker både Utvalgt bilde og Slides)...")
conn = await asyncpg.connect(DB_URL)
# VIKTIG: Vi tømmer tabellen for å starte med blanke ark og unngå duplikater
await conn.execute("TRUNCATE facility_images CASCADE;")
print("🗑️ Tømte gammel bilde-tabell. Starter import...")
# Hent alle anleggene fra vår egen database
facilities = await conn.fetch("SELECT id, slug, name FROM facilities ORDER BY name")
total_images_saved = 0
for i, fac in enumerate(facilities):
fac_id = fac['id']
slug = fac['slug']
name = fac['name']
print(f"[{i+1}/{len(facilities)}] Sjekker: {name} ({slug})...")
# Hent data fra WP med ?_embed for å få tak i Utvalgt bilde lett
wp_url = f"https://teeoff.no/wp-json/wp/v2/golfbaner?slug={slug}&_embed"
wp_data_list = await fetch_json(wp_url)
if not wp_data_list:
print(" ❌ Fant ikke anlegget i WordPress API.")
continue
post = wp_data_list[0]
final_image_urls = []
# 1. SJEKK: "Utvalgt bilde" (Standard WordPress)
try:
embedded = post.get('_embedded', {})
if 'wp:featuredmedia' in embedded and len(embedded['wp:featuredmedia']) > 0:
feat_media = embedded['wp:featuredmedia'][0]
feat_url = feat_media.get('source_url')
if feat_url:
final_image_urls.append(feat_url)
# print(f" -> Fant utvalgt bilde.")
except Exception as e:
print(f" ⚠️ Feil ved sjekk av utvalgt bilde: {e}")
# 2. SJEKK: ACF Slides (Bildekarusell)
try:
acf = post.get('acf') or {}
slides_ids = acf.get('slides')
slide_urls = await fetch_media_urls_by_ids(slides_ids)
if slide_urls:
final_image_urls.extend(slide_urls)
# print(f" -> Fant {len(slide_urls)} bilder i slider.")
except Exception as e:
print(f" ⚠️ Feil ved sjekk av slides: {e}")
# Fjern duplikater (hvis samme bilde er brukt begge steder) og bevar rekkefølgen
unique_urls = list(dict.fromkeys(final_image_urls))
# LAGRE I DATABASEN
if unique_urls:
sort_order = 0
for url in unique_urls:
await conn.execute(
"INSERT INTO facility_images (facility_id, image_url, sort_order) VALUES ($1, $2, $3)",
fac_id, url, sort_order
)
sort_order += 1
print(f" ✅ Lagret {len(unique_urls)} unike bilder.")
total_images_saved += len(unique_urls)
else:
print(" ⚠️ Fant INGEN bilder for dette anlegget.")
print(f"\n🎉 FERDIG! Totalt {total_images_saved} bilder er nå trygt lagret i galleriet.")
await conn.close()
if __name__ == "__main__":
asyncio.run(run_robust_import())