diff --git a/.gitignore b/.gitignore index 3228387..6cc1e13 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,5 @@ .idea .venv + +# This should be generated on deploy +static/feed.rss \ No newline at end of file diff --git a/scripts/generate_rss.py b/scripts/generate_rss.py new file mode 100755 index 0000000..6386062 --- /dev/null +++ b/scripts/generate_rss.py @@ -0,0 +1,97 @@ +#!/usr/bin/env python3 +""" +Script to generate an RSS feed for the comic +""" +import sys +import os +from datetime import datetime +from xml.etree.ElementTree import Element, SubElement, tostring +from xml.dom import minidom + +# Add parent directory to path so we can import comics_data +sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) +from comics_data import COMICS + +# Configuration - update these for your site +SITE_URL = "http://localhost:5000" # Change to your actual domain +SITE_TITLE = "Sunday Comics" +SITE_DESCRIPTION = "A webcomic about life, the universe, and everything" +SITE_LANGUAGE = "en-us" + + +def generate_rss(): + """Generate RSS feed from COMICS data""" + # Create RSS root + rss = Element('rss', version='2.0') + channel = SubElement(rss, 'channel') + + # Channel metadata + SubElement(channel, 'title').text = SITE_TITLE + SubElement(channel, 'link').text = SITE_URL + SubElement(channel, 'description').text = SITE_DESCRIPTION + SubElement(channel, 'language').text = SITE_LANGUAGE + SubElement(channel, 'lastBuildDate').text = datetime.now().strftime('%a, %d %b %Y %H:%M:%S +0000') + + # Add items for each comic (reversed to show newest first) + for comic in reversed(COMICS): + item = SubElement(channel, 'item') + + # Title + title = comic.get('title', f"#{comic['number']}") + SubElement(item, 'title').text = title + + # Link to comic page + link = f"{SITE_URL}/comic/{comic['number']}" + SubElement(item, 'link').text = link + SubElement(item, 'guid', isPermaLink='true').text = link + + # Description (include author note if present) + description = f"Comic #{comic['number']}" + if comic.get('author_note'): + description += f"\n\n{comic['author_note']}" + SubElement(item, 'description').text = description + + # Publication date + try: + pub_date = datetime.strptime(comic['date'], '%Y-%m-%d') + SubElement(item, 'pubDate').text = pub_date.strftime('%a, %d %b %Y 00:00:00 +0000') + except: + pass + + # Image enclosure + image_url = f"{SITE_URL}/static/images/{comic['filename']}" + SubElement(item, 'enclosure', url=image_url, type='image/png', length='0') + + # Convert to pretty XML + xml_str = minidom.parseString(tostring(rss)).toprettyxml(indent=' ') + + # Remove extra blank lines + xml_str = '\n'.join([line for line in xml_str.split('\n') if line.strip()]) + + return xml_str + + +def main(): + """Generate and save RSS feed""" + # Get path to static folder + script_dir = os.path.dirname(os.path.abspath(__file__)) + parent_dir = os.path.dirname(script_dir) + static_dir = os.path.join(parent_dir, 'static') + + # Create static directory if it doesn't exist + os.makedirs(static_dir, exist_ok=True) + + # Generate RSS + rss_content = generate_rss() + + # Save to file + rss_file = os.path.join(static_dir, 'feed.rss') + with open(rss_file, 'w', encoding='utf-8') as f: + f.write(rss_content) + + print(f"RSS feed generated: {rss_file}") + print(f"Total comics: {len(COMICS)}") + + +if __name__ == '__main__': + main()