#!/usr/bin/env python3 import sys import argparse import urllib.request import xml.etree.cElementTree as ET def doi_to_filename(doi): url = 'https://doi.org/%s' % doi headers = {'Accept': 'application/vnd.crossref.unixref+xml;q=1,' + 'application/rdf+xml;q=0.5'} # doi.org API request try: resp = request(url, headers) except Exception as err: raise ValueError('error making API request; invalid DOI? %s' % err) # derive filename from XML response try: xml_root = get_xml_root(resp) filename = get_filename_from_xml(xml_root) except Exception as err: raise ValueError('error parsing XML response; invalid DOI? %s' % err) return filename def request(url, headers): conn = urllib.request.Request( url, headers=headers ) r = urllib.request.urlopen(conn) return r.read().decode('utf-8') def get_xml_root(resp): tree = ET.ElementTree(ET.fromstring(resp)) return tree.getroot() def get_filename_from_xml(xml_root): title = None year = None authors = [] title = xml_root.find('.//title').text if not title: raise ValueError('title could not be parsed, aborting...') year = xml_root.find('.//year').text if year: year = ' (%s)' % year else: year = '' for a in xml_root.iter('surname'): authors.append(a.text) if authors: authors = ' - ' + ', '.join(authors) else: authors = '' filename = title + year + authors return filename