8 Commits

4 changed files with 48 additions and 8 deletions

View File

@ -85,6 +85,11 @@ def create_frontmatter(entry):
for t in entry.tags: for t in entry.tags:
tags.append(t['term']) tags.append(t['term'])
if "featured_image" in entry:
featured_image = entry.featured_image
else:
featured_image = ''
card_type = "network" card_type = "network"
if entry.feed_name == "pen.lumbung.space": if entry.feed_name == "pen.lumbung.space":
card_type = "pen" card_type = "pen"
@ -110,7 +115,8 @@ def create_frontmatter(entry):
'original_link': entry.link, 'original_link': entry.link,
'feed_name': entry['feed_name'], 'feed_name': entry['feed_name'],
'tags': str(tags), 'tags': str(tags),
'card_type': card_type 'card_type': card_type,
'featured_image': featured_image
} }
return frontmatter return frontmatter
@ -136,11 +142,33 @@ def sanitize_yaml (frontmatter):
return frontmatter return frontmatter
def parse_enclosures(post_dir, entry):
"""
Parses feed enclosures which are featured media
Can be featured image but also podcast entries
https://pythonhosted.org/feedparser/reference-entry-enclosures.html
"""
#TODO parse more than images
#TODO handle the fact it could be multiple items
for e in entry.enclosures:
if "type" in e:
print("found enclosed media", e.type)
if "image/" in e.type:
featured_image = grab_media(post_dir, e.href)
entry["featured_image"] = featured_image
else:
print("FIXME:ignoring enclosed", e.type)
return entry
def create_post(post_dir, entry): def create_post(post_dir, entry):
""" """
write hugo post based on RSS entry write hugo post based on RSS entry
""" """
if "enclosures" in entry:
entry = parse_enclosures(post_dir, entry)
frontmatter = create_frontmatter(entry) frontmatter = create_frontmatter(entry)
if not os.path.exists(post_dir): if not os.path.exists(post_dir):
@ -169,18 +197,25 @@ def grab_media(post_directory, url, prefered_name=None):
""" """
media_item = urlparse(url).path.split('/')[-1] media_item = urlparse(url).path.split('/')[-1]
headers = {
'User-Agent': 'https://git.autonomic.zone/ruangrupa/lumbunglib',
'From': 'info@lumbung.space' # This is another valid field
}
if prefered_name: if prefered_name:
media_item = prefered_name media_item = prefered_name
try: try:
if not os.path.exists(os.path.join(post_directory, media_item)): if not os.path.exists(os.path.join(post_directory, media_item)):
#TODO: stream is true is a conditional so we could check the headers for things, mimetype etc #TODO: stream is true is a conditional so we could check the headers for things, mimetype etc
response = requests.get(url, stream=True) response = requests.get(url, headers=headers, stream=True)
if response.ok: if response.ok:
with open(os.path.join(post_directory, media_item), 'wb') as media_file: with open(os.path.join(post_directory, media_item), 'wb') as media_file:
shutil.copyfileobj(response.raw, media_file) shutil.copyfileobj(response.raw, media_file)
print('Downloaded media item', media_item) print('Downloaded media item', media_item)
return media_item return media_item
else:
print("Download failed", response.status_code)
return url
return media_item return media_item
elif os.path.exists(os.path.join(post_directory, media_item)): elif os.path.exists(os.path.join(post_directory, media_item)):
return media_item return media_item
@ -235,11 +270,12 @@ def grab_feed(feed_url):
print(e) print(e)
return False return False
print(data.status, feed_url) if "status" in data:
if data.status == 200: print(data.status, feed_url)
# 304 means the feed has not been modified since we last checked if data.status == 200:
write_etag(feed_name, data) # 304 means the feed has not been modified since we last checked
return data write_etag(feed_name, data)
return data
return False return False
def create_opds_post(post_dir, entry): def create_opds_post(post_dir, entry):

View File

@ -7,7 +7,9 @@ authors: {% if frontmatter.author %} ["{{ frontmatter.author }}"] {% endif %}
original_link: "{{ frontmatter.original_link }}" original_link: "{{ frontmatter.original_link }}"
feed_name: "{{ frontmatter.feed_name}}" feed_name: "{{ frontmatter.feed_name}}"
categories: ["{{ frontmatter.card_type }}", "{{ frontmatter.feed_name}}"] categories: ["{{ frontmatter.card_type }}", "{{ frontmatter.feed_name}}"]
contributors: ["{{ frontmatter.feed_name}}"]
tags: {{ frontmatter.tags }} tags: {{ frontmatter.tags }}
{% if frontmatter.featured_image %}featured_image: "{{frontmatter.featured_image}}"{% endif %}
--- ---
{{ content }} {{ content }}

View File

@ -2,11 +2,12 @@
date: {{ post_metadata.created_at }} #2021-06-10T10:46:33+02:00 date: {{ post_metadata.created_at }} #2021-06-10T10:46:33+02:00
draft: false draft: false
authors: ["{{ post_metadata.account.display_name }}"] authors: ["{{ post_metadata.account.display_name }}"]
contributors: ["{{ post_metadata.account.acct}}"]
avatar: {{ post_metadata.account.avatar }} avatar: {{ post_metadata.account.avatar }}
categories: ["shouts"] categories: ["shouts"]
images: [{% for i in post_metadata.media_attachments %} {{ i.url }}, {% endfor %}] images: [{% for i in post_metadata.media_attachments %} {{ i.url }}, {% endfor %}]
title: {{ post_metadata.account.display_name }} title: {{ post_metadata.account.display_name }}
tags: [{% for i in post_metadata.tags %} {{ i.name }} {% endfor %}] tags: [{% for i in post_metadata.tags %} "{{ i.name }}", {% endfor %}]
--- ---
{% for item in post_metadata.media_attachments %} {% for item in post_metadata.media_attachments %}

View File

@ -6,6 +6,7 @@ uuid: "{{v.uuid}}"
video_duration: "{{ v.duration | duration }} " video_duration: "{{ v.duration | duration }} "
video_channel: "{{ v.channel.display_name }}" video_channel: "{{ v.channel.display_name }}"
channel_url: "{{ v.channel.url }}" channel_url: "{{ v.channel.url }}"
contributors: ["{{ v.account.display_name }}"]
preview_image: "{{ preview_image }}" preview_image: "{{ preview_image }}"
images: ["./{{ preview_image }}"] images: ["./{{ preview_image }}"]
categories: ["tv","{{ v.channel.display_name }}"] categories: ["tv","{{ v.channel.display_name }}"]