#!/usr/bin/python import sys outfile = sys.argv[1] inurls = sys.argv[2:] from datetime import * import xml.etree.ElementTree as ET import urllib2 ET.register_namespace('itunes', "http://www.itunes.com/dtds/podcast-1.0.dtd") ET.register_namespace('podcastRF', "http://radiofrance.fr/Lancelot/Podcast#") ET.register_namespace('radioline', "http://www.radioline.co/") now = datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S %z")+'+0000' default = """ Journal de France Inter http://www.franceinter.fr/emission-le-journal-de-13h Le grand rendez-vous d'information fr Radio France Thu, 20 Apr 2017 13:48:30 +0200 Radio France http://media.radiofrance-podcast.net/podcast09/RF_OMM_0000014086_ITE.jpg Journal de France Inter http://www.franceinter.fr/emission-le-journal-de-13h France Inter no podcast@radiofrance.com Radio France Journal de France Inter Le grand rendez-vous d'information """ items = [] def itemtuple(item, source=None): s = None for i in item: if i.tag == 'pubDate': dt = i.text.rsplit(' ', 1) dt = datetime.strptime(dt[0], '%a, %d %b %Y %H:%M:%S') - \ timedelta(hours=int(dt[1][0]+dt[1][1:3])) - \ timedelta(hours=int(dt[1][0]+dt[1][3:5])) if i.tag == 'guid': guid = i.text if i.tag == '{http://www.radioline.co/}source': s = i source = i.text if s is None: s = ET.SubElement(item, '{http://www.radioline.co/}source') s.text = source return (dt, source, guid, item) try: root = ET.fromstring(open(outfile).read()) for channel in root: pass while True: for item in channel: if item.tag == 'item': i = itemtuple(item) items.append(itemtuple(item)) channel.remove(item) break else: break except IOError: root = ET.fromstring(default) for channel in root: pass for lbd in channel: if lbd.tag == 'lastBuildDate': lbd.text = now for url in inurls: try: rss = urllib2.urlopen(url).read() except urllib2.URLError: continue rss = ET.fromstring(rss) # rss = rss.getroot() for rss in rss: pass for item in rss: if item.tag == 'item': i = itemtuple(item, url) items.append(itemtuple(item, url)) items.sort(reverse=True) seen = set() for item in items: iid = tuple(item[1:-1]) if iid in seen: continue seen.add(iid) channel.append(item[-1]) tree = ET.ElementTree(root) tree.write(outfile)