#!/usr/bin/env python3 from sys import argv from urllib.parse import urljoin from xml.etree.ElementTree import Element, SubElement, indent, tostring from helpers import guess_language, read_concerts, tmplocale LOCALIZED_TEXT = { 'en': { 'title': 'Bellefeuille Quartet', 'indexpath': 'en/', 'description': 'News from the Bellefeuille quartet', }, 'fr': { 'title': 'Quatuor Bellefeuille', 'indexpath': '/', 'description': 'Des nouvelles du quatuor Bellefeuille', }, } LOCALIZED_FORMATS = { 'en': { 'title': lambda c: f'{c.time.strftime("%B %-d %Y")} in {c.place}', }, 'fr': { 'title': lambda c: f'{c.time.strftime("%-d %B %Y")} à {c.place}', }, } def text_element(tag, text, /, **kwargs): elt = Element(tag, **kwargs) elt.text = text return elt def generate_concert(concert, concerts_url, lang): formatters = LOCALIZED_FORMATS[lang] item = Element('item') with tmplocale(lang): title = formatters['title'](concert) item.append(text_element('title', title)) anchor = f'concert-{concert.time.strftime("%F")}' item.append(text_element('link', f'{concerts_url}#{anchor}')) return item def generate_concerts(concerts_src, concerts_url, lang): for c in read_concerts(concerts_src): yield generate_concert(c, concerts_url, lang) def main(concerts_src, feed_dst, domain): lang = guess_language(concerts_src) text = LOCALIZED_TEXT[lang] url = f'https://{domain}' index_url = urljoin(url, text['indexpath']) concerts_url = urljoin(index_url, 'concerts.html') rss = Element('rss', version='2.0') channel = SubElement(rss, 'channel') channel.extend(( text_element('title', text['title']), text_element('link', index_url), text_element('description', text['description']), )) image = SubElement(channel, 'image') image.extend(( text_element('url', urljoin(url, 'images/logo.svg')), text_element('link', concerts_url), )) channel.append(text_element('language', lang)) items = generate_concerts(concerts_src, concerts_url, lang) channel.extend(tuple(items)) indent(rss) with open(feed_dst, 'wb') as feed: feed.write(tostring(rss, encoding='utf-8', xml_declaration=True)) if __name__ == '__main__': main(argv[1], argv[2], argv[3])