Skip to content

Commit c739871

Browse files
marcarlclaude
andcommitted
Improve upload_to_r2.py: Add .env support and fix upload structure
- Add python-dotenv support to automatically load .env file - Update requirements.txt with python-dotenv dependency - Change upload to sync entire output directory to R2 bucket root (previously only synced eli/sfs/ subfolder) - Fix index page generation with absolute paths to resolve subprocess issues - Add automatic JSON directory detection (tries ../sfs-jsondata, sfs_json, data/sfs_json) - Add --json-dir argument for explicit JSON directory specification - Improve error messages and output logging - Make index page generation non-critical (warns instead of fails) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
1 parent 65e01a4 commit c739871

2 files changed

Lines changed: 75 additions & 36 deletions

File tree

exporters/html/upload_to_r2.py

Lines changed: 74 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@
1010
import datetime
1111
import argparse
1212
from pathlib import Path
13+
from dotenv import load_dotenv
14+
15+
# Ladda miljövariabler från .env-fil
16+
load_dotenv()
1317

1418
def check_required_env_vars():
1519
"""Kontrollera att alla nödvändiga miljövariabler är satta"""
@@ -60,42 +64,42 @@ def configure_aws_cli():
6064
print("✓ AWS CLI konfigurerad")
6165
return True
6266

63-
def upload_sfs_folder(output_base_dir=""):
64-
"""Ladda upp SFS-mappen till Cloudflare R2"""
67+
def upload_html_site(output_base_dir=""):
68+
"""Ladda upp hela HTML-siten (eli/ + index-sidor) till Cloudflare R2"""
6569
bucket_name = os.getenv('CLOUDFLARE_R2_BUCKET_NAME')
6670
account_id = os.getenv('CLOUDFLARE_R2_ACCOUNT_ID')
6771
endpoint_url = f"https://{account_id}.r2.cloudflarestorage.com"
68-
72+
6973
# Kontrollera att mappen finns
7074
if not Path(output_base_dir).exists():
7175
print(f"Error: Mappen {output_base_dir} finns inte. Kör först HTML-export.")
7276
return False
73-
74-
# Räkna HTML-filer som ska laddas upp
77+
78+
# Räkna filer som ska laddas upp
7579
html_files = list(Path(output_base_dir).rglob('*.html'))
76-
file_count = len(html_files)
77-
print(f"Laddar upp {output_base_dir}-mappen ({file_count} HTML-filer)...")
78-
80+
css_files = list(Path(output_base_dir).rglob('*.css'))
81+
js_files = list(Path(output_base_dir).rglob('*.js'))
82+
file_count = len(html_files) + len(css_files) + len(js_files)
83+
print(f"Laddar upp HTML-siten från {output_base_dir} ({len(html_files)} HTML, {len(css_files)} CSS, {len(js_files)} JS-filer)...")
84+
7985
cmd = [
80-
'aws', 's3', 'sync', f'{output_base_dir}/', f's3://{bucket_name}/sfs/',
86+
'aws', 's3', 'sync', f'{output_base_dir}/', f's3://{bucket_name}/',
8187
'--endpoint-url', endpoint_url,
8288
'--delete',
8389
'--cache-control', 'public, max-age=3600',
84-
'--content-type', 'text/html',
8590
'--exclude', '*.md',
8691
'--exclude', '.DS_Store',
87-
'--include', '*.html',
8892
'--cli-read-timeout', '0',
8993
'--cli-connect-timeout', '60'
9094
]
9195

9296
env = os.environ.copy()
9397
env['AWS_DEFAULT_REGION'] = 'us-east-1'
94-
98+
9599
try:
96100
print(f"Kör kommando: {' '.join(cmd)}")
97101
result = subprocess.run(cmd, env=env, check=True, capture_output=True, text=True)
98-
print(f"✓ {output_base_dir}-mappen uppladdad ({file_count} HTML-filer)")
102+
print(f"✓ HTML-siten uppladdad ({file_count} filer)")
99103

100104
# Visa AWS CLI output om det finns
101105
if result.stdout.strip():
@@ -108,54 +112,82 @@ def upload_sfs_folder(output_base_dir=""):
108112

109113
return True
110114
except subprocess.CalledProcessError as e:
111-
print(f"Error vid uppladdning av {output_base_dir}-mappen: {e}")
115+
print(f"Error vid uppladdning av HTML-siten: {e}")
112116
if e.stderr:
113117
print(f"Stderr: {e.stderr}")
114118
if e.stdout:
115119
print(f"Stdout: {e.stdout}")
116120
return False
117121

118-
def upload_index_pages(output_base_dir=""):
122+
def upload_index_pages(output_base_dir="", json_input_dir=None):
119123
"""Ladda upp index-sidor till Cloudflare R2"""
120124
bucket_name = os.getenv('CLOUDFLARE_R2_BUCKET_NAME')
121125
account_id = os.getenv('CLOUDFLARE_R2_ACCOUNT_ID')
122126
endpoint_url = f"https://{account_id}.r2.cloudflarestorage.com"
123-
127+
124128
# Hitta JSON-filerna för att generera index-sidor
125-
json_input_dir = "sfs_json" # Standard JSON-mapp
129+
if json_input_dir is None:
130+
# Försök hitta JSON-mappen automatiskt
131+
possible_paths = ["../sfs-jsondata", "sfs_json", "data/sfs_json"]
132+
json_input_dir = None
133+
for path in possible_paths:
134+
if Path(path).exists():
135+
json_input_dir = path
136+
break
137+
138+
if json_input_dir is None:
139+
print(f"Varning: Kunde inte hitta JSON-mappen. Hoppar över index-sidor.")
140+
print(f"Prövade sökvägarna: {', '.join(possible_paths)}")
141+
return True # Inte ett kritiskt fel
142+
126143
if not Path(json_input_dir).exists():
127-
print(f"Error: JSON-mappen {json_input_dir} finns inte.")
128-
return False
144+
print(f"Varning: JSON-mappen {json_input_dir} finns inte. Hoppar över index-sidor.")
145+
return True # Inte ett kritiskt fel
129146

130147
# Generera index-sidor i output_base_dir
131148
print(f"Genererar index-sidor i {output_base_dir}...")
149+
print(f"Använder JSON-katalog: {json_input_dir}")
150+
151+
# Konvertera till absoluta sökvägar
152+
json_input_abs = str(Path(json_input_dir).resolve())
153+
output_base_abs = str(Path(output_base_dir).resolve())
132154

133155
# Skapa index.html (30 senaste)
134-
index_file = Path(output_base_dir) / "index.html"
135-
latest_file = Path(output_base_dir) / "latest.html"
156+
index_file = Path(output_base_abs) / "index.html"
157+
latest_file = Path(output_base_abs) / "latest.html"
136158

137159
try:
138160
# Kör populate_index_pages.py för att skapa index-sidor
139-
subprocess.run([
161+
result1 = subprocess.run([
140162
'python', 'exporters/html/populate_index_pages.py',
141-
'--input', json_input_dir,
163+
'--input', json_input_abs,
142164
'--output', str(index_file),
143165
'--limit', '30'
144166
], check=True, capture_output=True, text=True)
145167

146-
subprocess.run([
168+
result2 = subprocess.run([
147169
'python', 'exporters/html/populate_index_pages.py',
148-
'--input', json_input_dir,
170+
'--input', json_input_abs,
149171
'--output', str(latest_file),
150172
'--limit', '10'
151173
], check=True, capture_output=True, text=True)
152174

153175
print(f"✓ Index-sidor genererade: {index_file}, {latest_file}")
154176

177+
# Visa output från populate_index_pages.py om det finns
178+
if result1.stdout.strip():
179+
print("Output från index.html-generering:")
180+
print(result1.stdout.strip())
181+
if result2.stdout.strip():
182+
print("Output från latest.html-generering:")
183+
print(result2.stdout.strip())
184+
155185
except subprocess.CalledProcessError as e:
156186
print(f"Error vid generering av index-sidor: {e}")
157187
if e.stderr:
158188
print(f"Stderr: {e.stderr}")
189+
if e.stdout:
190+
print(f"Stdout: {e.stdout}")
159191
return False
160192

161193
# Kontrollera att index-filerna nu finns
@@ -271,13 +303,19 @@ def main():
271303
formatter_class=argparse.RawDescriptionHelpFormatter,
272304
epilog="""
273305
Exempel:
274-
python upload_to_r2.py --output-base-dir /path/to/export # Ladda upp från specifik mapp
306+
python upload_to_r2.py --output-base-dir output/html_site # Ladda upp från output/html_site
307+
python upload_to_r2.py --output-base-dir output/html_site --json-dir ../sfs-jsondata # Med JSON-mapp
275308
"""
276309
)
277310
parser.add_argument(
278311
'--output-base-dir',
279-
default='',
280-
help='Baskatalog som innehåller HTML-filerna att ladda upp'
312+
default='output/html_site',
313+
help='Baskatalog som innehåller HTML-filerna (eli/, index.html, etc.)'
314+
)
315+
parser.add_argument(
316+
'--json-dir',
317+
default=None,
318+
help='Sökväg till JSON-mappen (för att generera index-sidor)'
281319
)
282320

283321
args = parser.parse_args()
@@ -305,19 +343,19 @@ def main():
305343
# Utför uppladdningar
306344
print()
307345
success = True
308-
309-
# Skapa korrekt sökväg till sfs-mappen
310-
sfs_path = str(Path(args.output_base_dir) / "sfs") if args.output_base_dir else "sfs"
311346

312-
if not upload_sfs_folder(sfs_path):
347+
# Generera och ladda upp index-sidor först
348+
if not upload_index_pages(args.output_base_dir, args.json_dir):
313349
success = False
314-
315-
if not upload_index_pages(args.output_base_dir):
350+
351+
# Ladda upp hela HTML-siten (eli/ + index-sidor)
352+
if not upload_html_site(args.output_base_dir):
316353
success = False
317-
354+
355+
# Ladda upp sammanfattning
318356
if not upload_summary():
319357
success = False
320-
358+
321359
print()
322360
if success:
323361
print("✓ Alla filer har laddats upp till Cloudflare R2!")

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
requests>=2.25.0
22
pyyaml>=6.0
33
markdown>=3.4.0
4+
python-dotenv>=0.19.0

0 commit comments

Comments
 (0)