108 lines
2.6 KiB
Python
108 lines
2.6 KiB
Python
#!/usr/bin/env python3
|
|
"""One-time import of Pixelfed statuses into Grav entry pages."""
|
|
|
|
import json
|
|
import os
|
|
import urllib.request
|
|
from datetime import datetime
|
|
|
|
INPUT_FILE = os.environ.get('PIXELFED_JSON', '/tmp/pixelfed-statuses.json')
|
|
USER_PAGES = 'user/pages/01.trips'
|
|
|
|
TRIP_MAP = {
|
|
'2023': 'central-asia-2023',
|
|
'2024': 'us-canada-mex-2024',
|
|
'2025': 'italy-2025',
|
|
}
|
|
|
|
EXT_MAP = {
|
|
'image/jpeg': 'jpg',
|
|
'image/png': 'png',
|
|
'image/gif': 'gif',
|
|
'image/webp': 'webp',
|
|
}
|
|
|
|
ENTRY_TEMPLATE = """\
|
|
---
|
|
title: '{title}'
|
|
date: '{date}'
|
|
template: entry
|
|
published: true
|
|
hero_image: '{hero_image}'
|
|
lat: ''
|
|
lng: ''
|
|
location_city: '{location_city}'
|
|
location_country: '{location_country}'
|
|
weather_temp_c: ''
|
|
weather_desc: ''
|
|
---
|
|
|
|
{body}
|
|
"""
|
|
|
|
|
|
def download(url, dest):
|
|
try:
|
|
urllib.request.urlretrieve(url, dest)
|
|
return True
|
|
except Exception as exc:
|
|
print(f' Warning: download failed {url}: {exc}')
|
|
return False
|
|
|
|
|
|
def main():
|
|
with open(INPUT_FILE) as f:
|
|
posts = json.load(f)
|
|
|
|
counters = {}
|
|
|
|
for post in posts:
|
|
year = post['created_at'][:4]
|
|
trip = TRIP_MAP.get(year)
|
|
if not trip:
|
|
print(f"Skip: no trip mapping for year {year} (post {post['id']})")
|
|
continue
|
|
|
|
counters[trip] = counters.get(trip, 0) + 1
|
|
n = counters[trip]
|
|
|
|
date_str = post['created_at'][:10] # YYYY-MM-DD
|
|
folder = f'{date_str}-pixelfed-{n}.entry'
|
|
path = os.path.join(USER_PAGES, trip, '01.dailies', folder)
|
|
|
|
if os.path.exists(path):
|
|
print(f'Skip: {folder} already exists')
|
|
continue
|
|
|
|
os.makedirs(path)
|
|
print(f'Creating {trip}/{folder}')
|
|
|
|
hero_image = ''
|
|
for i, att in enumerate(post.get('media_attachments', []), 1):
|
|
ext = EXT_MAP.get(att.get('mime', ''), 'jpg')
|
|
filename = f'photo-{i}.{ext}'
|
|
if download(att['url'], os.path.join(path, filename)) and i == 1:
|
|
hero_image = filename
|
|
|
|
place = post.get('place') or {}
|
|
dt = datetime.fromisoformat(post['created_at'].replace('Z', '+00:00'))
|
|
date_fmt = dt.strftime('%Y-%m-%d %H:%M')
|
|
|
|
entry_md = ENTRY_TEMPLATE.format(
|
|
title=f'Pixelfed Import {n}',
|
|
date=date_fmt,
|
|
hero_image=hero_image,
|
|
location_city=place.get('name', ''),
|
|
location_country=place.get('country', ''),
|
|
body=post.get('content_text', '').strip(),
|
|
)
|
|
|
|
with open(os.path.join(path, 'entry.md'), 'w') as f:
|
|
f.write(entry_md)
|
|
|
|
print(f'\nDone. Posts per trip: {counters}')
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|